itext7学习笔记——第6章实践&example

x33g5p2x  于2021-12-28 转载在 其他  
字(19.8k)|赞(0)|评价(0)|浏览(528)

本章的例子,请参考我翻译的博文:itext7学习笔记——第6章,里面有详细的解释,有什么不懂得也可以评论或者私信我!

例子1:缩放PDF

我们读取一个带有图片的PDF文档,生成新的文档,文档里面的内容是第一页缩小后的页面,第二页原始大小,第三页为放大后的页面,代码如下:

  1. import com.itextpdf.kernel.geom.AffineTransform;
  2. import com.itextpdf.kernel.geom.PageSize;
  3. import com.itextpdf.kernel.geom.Rectangle;
  4. import com.itextpdf.kernel.pdf.PdfDocument;
  5. import com.itextpdf.kernel.pdf.PdfPage;
  6. import com.itextpdf.kernel.pdf.PdfReader;
  7. import com.itextpdf.kernel.pdf.PdfWriter;
  8. import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
  9. import com.itextpdf.kernel.pdf.xobject.PdfFormXObject;
  10. import java.io.File;
  11. import java.io.IOException;
  12. public class C06E01_TheGoldenGateBridge_Scale_Shrink {
  13. public static final String SRC = "src/main/resources/pdf/the_golden_gate_bridge.pdf";
  14. public static final String DEST = "results/chapter06/the_golden_gate_bridge_scale_shrink.pdf";
  15. public static void main(String args[]) throws IOException {
  16. File file = new File(DEST);
  17. file.getParentFile().mkdirs();
  18. new C06E01_TheGoldenGateBridge_Scale_Shrink().createPdf(SRC, DEST);
  19. }
  20. public void createPdf(String src, String dest) throws IOException {
  21. //Initialize PDF document
  22. PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
  23. PdfDocument origPdf = new PdfDocument(new PdfReader(src));
  24. //Original page size
  25. PdfPage origPage = origPdf.getPage(1);
  26. Rectangle orig = origPage.getPageSizeWithRotation();
  27. //Add A4 page
  28. PdfPage page = pdf.addNewPage(PageSize.A4.rotate());
  29. //Shrink original page content using transformation matrix
  30. PdfCanvas canvas = new PdfCanvas(page);
  31. AffineTransform transformationMatrix = AffineTransform.getScaleInstance(page.getPageSize().getWidth() / orig.getWidth(), page.getPageSize().getHeight() / orig.getHeight());
  32. canvas.concatMatrix(transformationMatrix);
  33. PdfFormXObject pageCopy = origPage.copyAsFormXObject(pdf);
  34. canvas.addXObject(pageCopy, 0, 0);
  35. //Add page with original size
  36. pdf.addPage(origPage.copyTo(pdf));
  37. //Add A2 page
  38. page = pdf.addNewPage(PageSize.A2.rotate());
  39. //Scale original page content using transformation matrix
  40. canvas = new PdfCanvas(page);
  41. transformationMatrix = AffineTransform.getScaleInstance(page.getPageSize().getWidth() / orig.getWidth(), page.getPageSize().getHeight() / orig.getHeight());
  42. canvas.concatMatrix(transformationMatrix);
  43. canvas.addXObject(pageCopy, 0, 0);
  44. pdf.close();
  45. origPdf.close();
  46. }
  47. }

例子2:分裂PDF

我们读取一个带有图片的PDF文档,把源文件分为4片,显示在新的文档的前4页,代码如下:

  1. import com.itextpdf.kernel.geom.AffineTransform;
  2. import com.itextpdf.kernel.geom.PageSize;
  3. import com.itextpdf.kernel.geom.Rectangle;
  4. import com.itextpdf.kernel.pdf.PdfDocument;
  5. import com.itextpdf.kernel.pdf.PdfPage;
  6. import com.itextpdf.kernel.pdf.PdfReader;
  7. import com.itextpdf.kernel.pdf.PdfWriter;
  8. import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
  9. import com.itextpdf.kernel.pdf.xobject.PdfFormXObject;
  10. import java.io.File;
  11. import java.io.IOException;
  12. public class C06E02_TheGoldenGateBridge_Tiles {
  13. public static final String SRC = "src/main/resources/pdf/the_golden_gate_bridge.pdf";
  14. public static final String DEST = "results/chapter06/the_golden_gate_bridge_tiles.pdf";
  15. public static void main(String args[]) throws IOException {
  16. File file = new File(DEST);
  17. file.getParentFile().mkdirs();
  18. new C06E02_TheGoldenGateBridge_Tiles().createPdf(SRC, DEST);
  19. }
  20. public void createPdf(String src, String dest) throws IOException {
  21. //Initialize PDF document
  22. PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
  23. PdfDocument sourcePdf = new PdfDocument(new PdfReader(src));
  24. //Original page
  25. PdfPage origPage = sourcePdf.getPage(1);
  26. PdfFormXObject pageCopy = origPage.copyAsFormXObject(pdf);
  27. //Original page size
  28. Rectangle orig = origPage.getPageSize();
  29. //Tile size
  30. Rectangle tileSize = PageSize.A4.rotate();
  31. // Transformation matrix
  32. AffineTransform transformationMatrix = AffineTransform.getScaleInstance(tileSize.getWidth() / orig.getWidth() * 2f, tileSize.getHeight() / orig.getHeight() * 2f);
  33. //The first tile
  34. PdfPage page = pdf.addNewPage(PageSize.A4.rotate());
  35. PdfCanvas canvas = new PdfCanvas(page);
  36. canvas.concatMatrix(transformationMatrix);
  37. canvas.addXObject(pageCopy, 0, -orig.getHeight() / 2f);
  38. //The second tile
  39. page = pdf.addNewPage(PageSize.A4.rotate());
  40. canvas = new PdfCanvas(page);
  41. canvas.concatMatrix(transformationMatrix);
  42. canvas.addXObject(pageCopy, -orig.getWidth() / 2f, -orig.getHeight() / 2f);
  43. //The third tile
  44. page = pdf.addNewPage(PageSize.A4.rotate());
  45. canvas = new PdfCanvas(page);
  46. canvas.concatMatrix(transformationMatrix);
  47. canvas.addXObject(pageCopy, 0, 0);
  48. //The fourth tile
  49. page = pdf.addNewPage(PageSize.A4.rotate());
  50. canvas = new PdfCanvas(page);
  51. canvas.concatMatrix(transformationMatrix);
  52. canvas.addXObject(pageCopy, -orig.getWidth() / 2f, 0);
  53. pdf.close();
  54. sourcePdf.close();
  55. }
  56. }

例子3:聚集PDF

我们读取一个带有图片的PDF文档,读取第一页的内容,然后在新的文档的第一页中显示4份同样的内容,代码如下:

  1. import com.itextpdf.kernel.geom.AffineTransform;
  2. import com.itextpdf.kernel.geom.PageSize;
  3. import com.itextpdf.kernel.geom.Rectangle;
  4. import com.itextpdf.kernel.pdf.PdfDocument;
  5. import com.itextpdf.kernel.pdf.PdfPage;
  6. import com.itextpdf.kernel.pdf.PdfReader;
  7. import com.itextpdf.kernel.pdf.PdfWriter;
  8. import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
  9. import com.itextpdf.kernel.pdf.xobject.PdfFormXObject;
  10. import java.io.File;
  11. import java.io.IOException;
  12. public class C06E03_TheGoldenGateBridge_N_up {
  13. public static final String SRC = "src/main/resources/pdf/the_golden_gate_bridge.pdf";
  14. public static final String DEST = "results/chapter06/the_golden_gate_bridge_nup.pdf";
  15. public static void main(String args[]) throws IOException {
  16. File file = new File(DEST);
  17. file.getParentFile().mkdirs();
  18. new C06E03_TheGoldenGateBridge_N_up().createPdf(DEST);
  19. }
  20. public void createPdf(String dest) throws IOException {
  21. //Initialize PDF document
  22. PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
  23. PdfDocument sourcePdf = new PdfDocument(new PdfReader(SRC));
  24. //Original page
  25. PdfPage origPage = sourcePdf.getPage(1);
  26. //Original page size
  27. Rectangle orig = origPage.getPageSize();
  28. PdfFormXObject pageCopy = origPage.copyAsFormXObject(pdf);
  29. //N-up page
  30. PageSize nUpPageSize = PageSize.A4.rotate();
  31. PdfPage page = pdf.addNewPage(nUpPageSize);
  32. PdfCanvas canvas = new PdfCanvas(page);
  33. //Scale page
  34. AffineTransform transformationMatrix = AffineTransform.getScaleInstance(nUpPageSize.getWidth() / orig.getWidth() / 2f, nUpPageSize.getHeight() / orig.getHeight() / 2f);
  35. canvas.concatMatrix(transformationMatrix);
  36. //Add pages to N-up page
  37. canvas.addXObject(pageCopy, 0, orig.getHeight());
  38. canvas.addXObject(pageCopy, orig.getWidth(), orig.getHeight());
  39. canvas.addXObject(pageCopy, 0, 0);
  40. canvas.addXObject(pageCopy, orig.getWidth(), 0);
  41. pdf.close();
  42. sourcePdf.close();
  43. }
  44. }

例子4:组合PDF_组合全部页面

我们读取两个PDF文件,把两个PDF文件拼接起来,代码如下:

  1. import com.itextpdf.kernel.pdf.*;
  2. import com.itextpdf.kernel.utils.PdfMerger;
  3. import java.io.File;
  4. import java.io.IOException;
  5. public class C06E04_88th_Oscar_Combine {
  6. public static final String SRC1 = "src/main/resources/pdf/88th_reminder_list.pdf";
  7. public static final String SRC2 = "src/main/resources/pdf/88th_noms_announcement.pdf";
  8. public static final String DEST = "results/chapter06/88th_oscar_combined_documents.pdf";
  9. public static void main(String args[]) throws IOException {
  10. File file = new File(DEST);
  11. file.getParentFile().mkdirs();
  12. new C06E04_88th_Oscar_Combine().createPdf(DEST);
  13. }
  14. public void createPdf(String dest) throws IOException {
  15. //Initialize PDF document with output intent
  16. PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
  17. PdfMerger merger = new PdfMerger(pdf);
  18. //Add pages from the first document
  19. PdfDocument firstSourcePdf = new PdfDocument(new PdfReader(SRC1));
  20. merger.merge(firstSourcePdf, 1, firstSourcePdf.getNumberOfPages());
  21. //Add pages from the second pdf document
  22. PdfDocument secondSourcePdf = new PdfDocument(new PdfReader(SRC2));
  23. merger.merge(secondSourcePdf, 1, secondSourcePdf.getNumberOfPages());
  24. firstSourcePdf.close();
  25. secondSourcePdf.close();
  26. pdf.close();
  27. }
  28. }

例子5:组合PDF_组合特定页面

我们读取两个PDF文件,把两个PDF文件的特定页面拼接起来,代码如下:

  1. import com.itextpdf.kernel.pdf.PdfDocument;
  2. import com.itextpdf.kernel.pdf.PdfReader;
  3. import com.itextpdf.kernel.pdf.PdfWriter;
  4. import com.itextpdf.kernel.utils.PdfMerger;
  5. import java.io.File;
  6. import java.io.IOException;
  7. import java.util.Arrays;
  8. public class C06E05_88th_Oscar_CombineXofY {
  9. public static final String SRC1 = "src/main/resources/pdf/88th_reminder_list.pdf";
  10. public static final String SRC2 = "src/main/resources/pdf/88th_noms_announcement.pdf";
  11. public static final String DEST = "results/chapter06/88th_oscar_combined_documents_xy_pages.pdf";
  12. public static void main(String args[]) throws IOException {
  13. File file = new File(DEST);
  14. file.getParentFile().mkdirs();
  15. new C06E05_88th_Oscar_CombineXofY().createPdf(DEST);
  16. }
  17. public void createPdf(String dest) throws IOException {
  18. //Initialize PDF document with output intent
  19. PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
  20. PdfMerger merger = new PdfMerger(pdf);
  21. //Add pages from the first document
  22. PdfDocument firstSourcePdf = new PdfDocument(new PdfReader(SRC1));
  23. merger.merge(firstSourcePdf, Arrays.asList(1, 5, 7, 1));
  24. //Add pages from the second pdf document
  25. PdfDocument secondSourcePdf = new PdfDocument(new PdfReader(SRC2));
  26. merger.merge(secondSourcePdf, Arrays.asList(1, 15));
  27. firstSourcePdf.close();
  28. secondSourcePdf.close();
  29. pdf.close();
  30. }
  31. }

例子6:组合文档并添加目录

我们读取两个PDF文件,把两个PDF文件的特定页面拼接起来,并添加目录,代码如下:

  1. import com.itextpdf.kernel.color.Color;
  2. import com.itextpdf.kernel.pdf.*;
  3. import com.itextpdf.kernel.pdf.action.PdfAction;
  4. import com.itextpdf.kernel.pdf.canvas.draw.DottedLine;
  5. import com.itextpdf.layout.Document;
  6. import com.itextpdf.layout.property.Property;
  7. import com.itextpdf.layout.element.Paragraph;
  8. import com.itextpdf.layout.element.Tab;
  9. import com.itextpdf.layout.element.TabStop;
  10. import com.itextpdf.layout.element.Text;
  11. import com.itextpdf.layout.property.TabAlignment;
  12. import com.itextpdf.layout.property.TextAlignment;
  13. import java.io.File;
  14. import java.io.IOException;
  15. import java.util.*;
  16. public class C06E06_88th_Oscar_Combine_AddTOC {
  17. public static final String SRC1 = "src/main/resources/pdf/88th_noms_announcement.pdf";
  18. public static final String SRC2 = "src/main/resources/pdf/oscars_movies_checklist_2016.pdf";
  19. public static final String DEST = "results/chapter06/88th_oscar_the_revenant_nominations_TOC.pdf";
  20. public static final Map<String, Integer> TheRevenantNominations = new TreeMap<String, Integer>();
  21. static {
  22. TheRevenantNominations.put("Performance by an actor in a leading role", 4);
  23. TheRevenantNominations.put("Performance by an actor in a supporting role", 4);
  24. TheRevenantNominations.put("Achievement in cinematography", 4);
  25. TheRevenantNominations.put("Achievement in costume design", 5);
  26. TheRevenantNominations.put("Achievement in directing", 5);
  27. TheRevenantNominations.put("Achievement in film editing", 6);
  28. TheRevenantNominations.put("Achievement in makeup and hairstyling", 7);
  29. TheRevenantNominations.put("Best motion picture of the year", 8);
  30. TheRevenantNominations.put("Achievement in production design", 8);
  31. TheRevenantNominations.put("Achievement in sound editing", 9);
  32. TheRevenantNominations.put("Achievement in sound mixing", 9);
  33. TheRevenantNominations.put("Achievement in visual effects", 10);
  34. }
  35. public static void main(String args[]) throws IOException {
  36. File file = new File(DEST);
  37. file.getParentFile().mkdirs();
  38. new C06E06_88th_Oscar_Combine_AddTOC().createPdf(DEST);
  39. }
  40. public void createPdf(String dest) throws IOException {
  41. PdfDocument pdfDoc = new PdfDocument(new PdfWriter(dest));
  42. Document document = new Document(pdfDoc);
  43. document.add(new Paragraph(new Text("The Revenant nominations list"))
  44. .setTextAlignment(TextAlignment.CENTER));
  45. PdfDocument firstSourcePdf = new PdfDocument(new PdfReader(SRC1));
  46. for (Map.Entry<String, Integer> entry : TheRevenantNominations.entrySet()) {
  47. //Copy page
  48. PdfPage page = firstSourcePdf.getPage(entry.getValue()).copyTo(pdfDoc);
  49. pdfDoc.addPage(page);
  50. //Overwrite page number
  51. Text text = new Text(String.format("Page %d", pdfDoc.getNumberOfPages() - 1));
  52. text.setBackgroundColor(Color.WHITE);
  53. document.add(new Paragraph(text).setFixedPosition(
  54. pdfDoc.getNumberOfPages(), 549, 742, 100));
  55. //Add destination
  56. String destinationKey = "p" + (pdfDoc.getNumberOfPages() - 1);
  57. PdfArray destinationArray = new PdfArray();
  58. destinationArray.add(page.getPdfObject());
  59. destinationArray.add(PdfName.XYZ);
  60. destinationArray.add(new PdfNumber(0));
  61. destinationArray.add(new PdfNumber(page.getMediaBox().getHeight()));
  62. destinationArray.add(new PdfNumber(1));
  63. pdfDoc.addNamedDestination(destinationKey, destinationArray);
  64. //Add TOC line with bookmark
  65. Paragraph p = new Paragraph();
  66. p.addTabStops(new TabStop(540, TabAlignment.RIGHT, new DottedLine()));
  67. p.add(entry.getKey());
  68. p.add(new Tab());
  69. p.add(String.valueOf(pdfDoc.getNumberOfPages() - 1));
  70. p.setProperty(Property.ACTION, PdfAction.createGoTo(destinationKey));
  71. document.add(p);
  72. }
  73. firstSourcePdf.close();
  74. //Add the last page
  75. PdfDocument secondSourcePdf = new PdfDocument(new PdfReader(SRC2));
  76. PdfPage page = secondSourcePdf.getPage(1).copyTo(pdfDoc);
  77. pdfDoc.addPage(page);
  78. //Add destination
  79. PdfArray destinationArray = new PdfArray();
  80. destinationArray.add(page.getPdfObject());
  81. destinationArray.add(PdfName.XYZ);
  82. destinationArray.add(new PdfNumber(0));
  83. destinationArray.add(new PdfNumber(page.getMediaBox().getHeight()));
  84. destinationArray.add(new PdfNumber(1));
  85. pdfDoc.addNamedDestination("checklist", destinationArray);
  86. //Add TOC line with bookmark
  87. Paragraph p = new Paragraph();
  88. p.addTabStops(new TabStop(540, TabAlignment.RIGHT, new DottedLine()));
  89. p.add("Oscars\u00ae 2016 Movie Checklist");
  90. p.add(new Tab());
  91. p.add(String.valueOf(pdfDoc.getNumberOfPages() - 1));
  92. p.setProperty(Property.ACTION, PdfAction.createGoTo("checklist"));
  93. document.add(p);
  94. secondSourcePdf.close();
  95. // close the document
  96. document.close();
  97. }
  98. }

例子7:拼接表单

我们读取带有表单两个PDF文件,把两个PDF文件拼接起来,代码如下:

  1. import com.itextpdf.forms.PdfPageFormCopier;
  2. import com.itextpdf.kernel.pdf.*;
  3. import java.io.File;
  4. import java.io.IOException;
  5. public class C06E07_Combine_Forms {
  6. public static final String DEST = "results/chapter06/combined_forms.pdf";
  7. public static final String SRC1 = "src/main/resources/pdf/subscribe.pdf";
  8. public static final String SRC2 = "src/main/resources/pdf/state.pdf";
  9. public static void main(String args[]) throws IOException {
  10. File file = new File(DEST);
  11. file.getParentFile().mkdirs();
  12. new C06E07_Combine_Forms().createPdf(DEST);
  13. }
  14. public void createPdf(String dest) throws IOException {
  15. PdfDocument destPdfDocument = new PdfDocument(new PdfWriter(dest));
  16. PdfDocument[] sources = new PdfDocument[] {
  17. new PdfDocument(new PdfReader(SRC1)),
  18. new PdfDocument(new PdfReader(SRC2))
  19. };
  20. PdfPageFormCopier formCopier = new PdfPageFormCopier();
  21. for (PdfDocument sourcePdfDocument : sources) {
  22. sourcePdfDocument.copyPagesTo(
  23. 1, sourcePdfDocument.getNumberOfPages(),
  24. destPdfDocument, formCopier);
  25. sourcePdfDocument.close();
  26. }
  27. destPdfDocument.close();
  28. }
  29. }

例子8:填充并拼接表单

我们读取带有表单的PDF文件,读取CSV,填充表单,拼接多个表单,代码如下:

  1. import com.itextpdf.forms.PdfAcroForm;
  2. import com.itextpdf.forms.PdfPageFormCopier;
  3. import com.itextpdf.forms.fields.PdfFormField;
  4. import com.itextpdf.io.source.ByteArrayOutputStream;
  5. import com.itextpdf.kernel.pdf.PdfDocument;
  6. import com.itextpdf.kernel.pdf.PdfReader;
  7. import com.itextpdf.kernel.pdf.PdfWriter;
  8. import java.io.*;
  9. import java.util.Map;
  10. import java.util.StringTokenizer;
  11. public class C06E08_FillOutAndMergeForms {
  12. public static final String DEST = "results/chapter06/fill_out_and_merge_forms.pdf";
  13. public static final String SRC = "src/main/resources/pdf/state.pdf";
  14. public static final String DATA = "src/main/resources/data/united_states.csv";
  15. public static void main(String args[]) throws IOException {
  16. File file = new File(DEST);
  17. file.getParentFile().mkdirs();
  18. new C06E08_FillOutAndMergeForms().createPdf(DEST);
  19. }
  20. public void createPdf(String dest) throws IOException {
  21. PdfDocument pdfDocument = new PdfDocument(new PdfWriter(dest));
  22. PdfPageFormCopier formCopier = new PdfPageFormCopier();
  23. BufferedReader bufferedReader = new BufferedReader(new FileReader(DATA));
  24. String line;
  25. boolean headerLine = true;
  26. int i = 1;
  27. while ((line = bufferedReader.readLine()) != null) {
  28. if (headerLine) {
  29. headerLine = false;
  30. continue;
  31. }
  32. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  33. PdfDocument sourcePdfDocument = new PdfDocument(new PdfReader(SRC), new PdfWriter(baos));
  34. //Rename fields
  35. i++;
  36. PdfAcroForm form = PdfAcroForm.getAcroForm(sourcePdfDocument, true);
  37. form.renameField("name", "name_" + i);
  38. form.renameField("abbr", "abbr_" + i);
  39. form.renameField("capital", "capital_" + i);
  40. form.renameField("city", "city_" + i);
  41. form.renameField("population", "population_" + i);
  42. form.renameField("surface", "surface_" + i);
  43. form.renameField("timezone1", "timezone1_" + i);
  44. form.renameField("timezone2", "timezone2_" + i);
  45. form.renameField("dst", "dst_" + i);
  46. //Fill out fields
  47. StringTokenizer tokenizer = new StringTokenizer(line, ";");
  48. Map<String, PdfFormField> fields = form.getFormFields();
  49. fields.get("name_" + i).setValue(tokenizer.nextToken());
  50. fields.get("abbr_" + i).setValue(tokenizer.nextToken());
  51. fields.get("capital_" + i).setValue(tokenizer.nextToken());
  52. fields.get("city_" + i).setValue(tokenizer.nextToken());
  53. fields.get("population_" + i).setValue(tokenizer.nextToken());
  54. fields.get("surface_" + i).setValue(tokenizer.nextToken());
  55. fields.get("timezone1_" + i).setValue(tokenizer.nextToken());
  56. fields.get("timezone2_" + i).setValue(tokenizer.nextToken());
  57. fields.get("dst_" + i).setValue(tokenizer.nextToken());
  58. sourcePdfDocument.close();
  59. sourcePdfDocument = new PdfDocument(new PdfReader(new ByteArrayInputStream(baos.toByteArray())));
  60. //Copy pages
  61. sourcePdfDocument.copyPagesTo(1, sourcePdfDocument.getNumberOfPages(), pdfDocument, formCopier);
  62. sourcePdfDocument.close();
  63. }
  64. bufferedReader.close();
  65. pdfDocument.close();
  66. }
  67. }

例子9:填充、锁定并拼接表单

我们读取带有表单的PDF文件,读取CSV,填充表单,锁定表单,最后拼接多个表单,代码如下:

  1. import com.itextpdf.forms.PdfAcroForm;
  2. import com.itextpdf.forms.fields.PdfFormField;
  3. import com.itextpdf.io.source.ByteArrayOutputStream;
  4. import com.itextpdf.kernel.pdf.PdfDocument;
  5. import com.itextpdf.kernel.pdf.PdfReader;
  6. import com.itextpdf.kernel.pdf.PdfWriter;
  7. import java.io.*;
  8. import java.util.Map;
  9. import java.util.StringTokenizer;
  10. public class C06E09_FillOutFlattenAndMergeForms {
  11. public static final String DEST1 = "results/chapter06/fill_out_flatten_forms_merge.pdf";
  12. public static final String DEST2 = "results/chapter06/fill_out_flatten_forms_smart_merge.pdf";
  13. public static final String SRC = "src/main/resources/pdf/state.pdf";
  14. public static final String DATA = "src/main/resources/data/united_states.csv";
  15. public static void main(String args[]) throws IOException {
  16. File file = new File(DEST1);
  17. file.getParentFile().mkdirs();
  18. file = new File(DEST2);
  19. file.getParentFile().mkdirs();
  20. new C06E09_FillOutFlattenAndMergeForms().createPdf(DEST1, DEST2);
  21. }
  22. public void createPdf(String dest1, String dest2) throws IOException {
  23. PdfDocument destPdfDocument = new PdfDocument(new PdfWriter(dest1));
  24. //Smart mode
  25. PdfDocument destPdfDocumentSmartMode = new PdfDocument(new PdfWriter(dest2).setSmartMode(true));
  26. BufferedReader bufferedReader = new BufferedReader(new FileReader(DATA));
  27. String line;
  28. boolean headerLine = true;
  29. while ((line = bufferedReader.readLine()) != null) {
  30. if (headerLine) {
  31. headerLine = false;
  32. continue;
  33. }
  34. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  35. PdfDocument sourcePdfDocument = new PdfDocument(new PdfReader(SRC), new PdfWriter(baos));
  36. //Read fields
  37. PdfAcroForm form = PdfAcroForm.getAcroForm(sourcePdfDocument, true);
  38. StringTokenizer tokenizer = new StringTokenizer(line, ";");
  39. Map<String, PdfFormField> fields = form.getFormFields();
  40. //Fill out fields
  41. fields.get("name").setValue(tokenizer.nextToken());
  42. fields.get("abbr").setValue(tokenizer.nextToken());
  43. fields.get("capital").setValue(tokenizer.nextToken());
  44. fields.get("city").setValue(tokenizer.nextToken());
  45. fields.get("population").setValue(tokenizer.nextToken());
  46. fields.get("surface").setValue(tokenizer.nextToken());
  47. fields.get("timezone1").setValue(tokenizer.nextToken());
  48. fields.get("timezone2").setValue(tokenizer.nextToken());
  49. fields.get("dst").setValue(tokenizer.nextToken());
  50. //Flatten fields
  51. form.flattenFields();
  52. sourcePdfDocument.close();
  53. sourcePdfDocument = new PdfDocument(new PdfReader(new ByteArrayInputStream(baos.toByteArray())));
  54. //Copy pages
  55. sourcePdfDocument.copyPagesTo(1, sourcePdfDocument.getNumberOfPages(), destPdfDocument, null);
  56. sourcePdfDocument.copyPagesTo(1, sourcePdfDocument.getNumberOfPages(), destPdfDocumentSmartMode, null);
  57. sourcePdfDocument.close();
  58. }
  59. bufferedReader.close();
  60. destPdfDocument.close();
  61. destPdfDocumentSmartMode.close();
  62. }
  63. }

Example代码下载

本章代码可在如下地址下载(IDEA工程):iText7——第六章源代码工程

相关文章