image - iText page number in header within PDF/A -


i have trying adjust code add page number in pdf pdf/a.

i have added font, color scheme , pdf/a creation works if leave out adding addition of pdftemplate.

// pdf created when part removed // though without page number in header pdfpcell cell = new pdfpcell(image.getinstance(total)); cell.setborder(rectangle.bottom); table.addcell(cell);" 

though header page number in too. out of clues how add font pdfpcell. other fields add phrase or paragraph can provide font.

the error thrown is: exception in thread "main" com.itextpdf.text.documentexception: com.itextpdf.text.pdf.pdfaconformanceexception: fonts must embedded. 1 isn't: helvetica @ com.itextpdf.text.pdf.pdfdocument.add(pdfdocument.java:809)

public class moviecountries1 {  /**  * resulting pdf file.  */ public static final string result     = "d:/tmp/pdf/movie_countries1.pdf";  private static final string font_location = "./fonts/arial.ttf";  public static font fontarial = fontfactory.getfont(font_location, basefont.identity_h, basefont.embedded);  /**  * inner class add table header.  */ class tableheader extends pdfpageeventhelper { /**  * header text.  */ string header; /**  * template total number of pages.  */ pdftemplate total;  /**  * allows change content of header.  *  * @param header new header string  */ public void setheader(string header) {     this.header = header; }  /**  * creates pdftemplate hold total number of pages.  *  * @see com.itextpdf.text.pdf.pdfpageeventhelper#onopendocument(  *com.itextpdf.text.pdf.pdfwriter, com.itextpdf.text.document)  */ public void onopendocument(pdfwriter writer, document document) {     total = writer.getdirectcontent().createtemplate(30, 16); }  /**  * adds header every page  *  * @see com.itextpdf.text.pdf.pdfpageeventhelper#onendpage(  *com.itextpdf.text.pdf.pdfwriter, com.itextpdf.text.document)  */ public void onendpage(pdfwriter writer, document document) {     pdfptable table = new pdfptable(3);     try {     table.setwidths(new int[]{24, 24, 2});     table.settotalwidth(527);     table.setlockedwidth(true);     table.getdefaultcell().setfixedheight(20);     table.getdefaultcell().setborder(rectangle.bottom);     table.addcell(header);     table.getdefaultcell().sethorizontalalignment(element.align_right);     table.addcell(string.format("page %d of", writer.getpagenumber()));      //pdf created when part removed     //though without page number in header     pdfpcell cell = new pdfpcell(image.getinstance(total));     cell.setborder(rectangle.bottom);     table.addcell(cell);      table.writeselectedrows(0, -1, 34, 803, writer.getdirectcontent());     } catch (documentexception de) {     throw new exceptionconverter(de);     } }  /**  * fills out total number of pages before document closed.  *  * @see com.itextpdf.text.pdf.pdfpageeventhelper#onclosedocument(  *com.itextpdf.text.pdf.pdfwriter, com.itextpdf.text.document)  */ public void onclosedocument(pdfwriter writer, document document) {     columntext.showtextaligned(total, element.align_left,         new phrase(string.valueof(writer.getpagenumber() - 1), fontarial),         2, 2, 0); } }  /**  * creates pdf document.  *  * @param filename path new pdf document  * @throws documentexception  * @throws ioexception  * @throws sqlexception  */ public void createpdf(string filename)     throws ioexception, documentexception, sqlexception { // create database connection  // step 1 document document = new document(pagesize.a4, 36, 36, 54, 36); // step 2 pdfawriter writer = pdfawriter.getinstance(document, new fileoutputstream(result), pdfaconformancelevel.pdf_a_1a); //pdfwriter writer = pdfwriter.getinstance(document, new fileoutputstream(result));  document.addauthor("author"); document.addsubject("subject"); document.addlanguage("nl-nl"); document.addcreationdate(); document.addcreator("creator"); document.addtitle("title");  writer.setpdfversion(pdfname.version); writer.settagged(); writer.createxmpmetadata();  tableheader event = new tableheader(); writer.setpageevent(event); // step 3 document.open(); // step 4 list<movie> movies = composemovies(); (int = 0; < 10; i++) {     (movie movie : movies) {     document.add(new paragraph(movie.getmovietitle(), fontarial));     if (movie.getoriginaltitle() != null)         document.add(new paragraph(movie.getoriginaltitle(), fontarial));     final string format = string.format("year: %s; run length: %s minutes",         movie.getyear(), movie.getduration());     document.add(new paragraph(format, fontarial));     } }  // step 4 final string colorprofile = "/color/srgb_color_space_profile.icm"; final inputstream resourceasstream = this.getclass().getresourceasstream(colorprofile); icc_profile icc = icc_profile.getinstance(resourceasstream); writer.setoutputintents("custom", "", "http://www.color.org", "srgb iec61966-2.1", icc); document.close(); }  private list<movie> composemovies() { list<movie> movies = new arraylist<>(); final movie movie1 = new movie(); movie1.setyear("2012"); movie1.setmovietitle("movietitle1"); movie1.setoriginaltitle("originaltitle1"); movie1.setduration("1h"); final movie movie2 = new movie(); movie2.setyear("2013"); movie2.setmovietitle("movietitle2"); movie2.setoriginaltitle("originaltitle2"); movie2.setduration("2h"); movies.add(movie1); movies.add(movie2); return movies; }  /**  * main method.  *  * @param args no arguments needed  * @throws documentexception  * @throws ioexception  * @throws sqlexception  */ public static void main(string[] args)     throws ioexception, documentexception, sqlexception { new moviecountries1().createpdf(result); } 

}

please take @ line:

table.addcell(string.format("page %d of", writer.getpagenumber())); 

in line, add string table directly. internally, pdfpcell created, phrase object. no font defined, default font (helvetica, unembedded) used.

please change above line into:

table.addcell(new phrase(string.format("page %d of", writer.getpagenumber()), fontarial); 

this solve 1 problem (unless i've overlooked other instances default font introduced). there other exceptions if want pdf/a level a, though.

i've written example creates pdf/a document based on csv file. i'm adding footer document reusing page event implementation: pdfa1a

the problem experiencing can explained follows: when tell pdfwriter needs create tagged pdf (using writer.settagged();), itext make sure appropriate tags created when adding element objects document. long stick using high-level objects, work.

however, moment introduce objects added @ absolute positions, take responsibility correctly tag content add. in case, adding footer. footers not part of "real content", hence need marked "artifacts".

in example, have adapted page event implementation in way allows me explain 2 different approaches:

in first approach, set role @ level of object:

image total = image.getinstance(t); total.setrole(pdfname.artifact); 

in second approach, mark content artifact @ lowest level:

pdfcontentbyte canvas = writer.getdirectcontent(); canvas.beginmarkedcontentsequence(pdfname.artifact); table.writeselectedrows(0, -1, 36, 30, canvas); canvas.endmarkedcontentsequence(); 

i use second approach pdfptable because if don't, have tag sub-elements of table (every single row) artifact. if didn't, itext introduce tr elements inside artifact (and wrong).

see http://itextpdf.com/sandbox/pdfa/pdfa1a full source code.


Comments

Popular posts from this blog

java - Plugin org.apache.maven.plugins:maven-install-plugin:2.4 or one of its dependencies could not be resolved -

Round ImageView Android -

How can I utilize Yahoo Weather API in android -