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

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

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

例子1:撰写日报

页面划分成三栏,然后添加文本和图片,代码如下:

  1. import com.itextpdf.io.font.FontConstants;
  2. import com.itextpdf.io.image.ImageDataFactory;
  3. import com.itextpdf.kernel.color.Color;
  4. import com.itextpdf.kernel.font.PdfFont;
  5. import com.itextpdf.kernel.font.PdfFontFactory;
  6. import com.itextpdf.kernel.geom.PageSize;
  7. import com.itextpdf.kernel.geom.Rectangle;
  8. import com.itextpdf.kernel.pdf.*;
  9. import com.itextpdf.layout.ColumnDocumentRenderer;
  10. import com.itextpdf.layout.Document;
  11. import com.itextpdf.layout.element.*;
  12. import java.io.*;
  13. import java.nio.charset.StandardCharsets;
  14. import java.nio.file.Files;
  15. import java.nio.file.Paths;
  16. /** * Simple column renderer example. */
  17. public class C03E01_NewYorkTimes {
  18. public static final String DEST = "results/chapter03/new_york_times.pdf";
  19. public static final String APPLE_IMG = "src/main/resources/img/ny_times_apple.jpg";
  20. public static final String APPLE_TXT = "src/main/resources/data/ny_times_apple.txt";
  21. public static final String FACEBOOK_IMG = "src/main/resources/img/ny_times_fb.jpg";
  22. public static final String FACEBOOK_TXT = "src/main/resources/data/ny_times_fb.txt";
  23. public static final String INST_IMG = "src/main/resources/img/ny_times_inst.jpg";
  24. public static final String INST_TXT = "src/main/resources/data/ny_times_inst.txt";
  25. static PdfFont timesNewRoman = null;
  26. static PdfFont timesNewRomanBold = null;
  27. public static void main(String[] args) throws Exception {
  28. timesNewRoman = PdfFontFactory.createFont(FontConstants.TIMES_ROMAN);
  29. timesNewRomanBold = PdfFontFactory.createFont(FontConstants.TIMES_BOLD);
  30. File file = new File(DEST);
  31. file.getParentFile().mkdirs();
  32. new C03E01_NewYorkTimes().createPdf(DEST);
  33. }
  34. protected void createPdf(String dest) throws Exception {
  35. //Initialize PDF document
  36. PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
  37. PageSize ps = PageSize.A5;
  38. // Initialize document
  39. Document document = new Document(pdf, ps);
  40. //Set column parameters
  41. float offSet = 36;
  42. float columnWidth = (ps.getWidth() - offSet * 2 + 10) / 3;
  43. float columnHeight = ps.getHeight() - offSet * 2;
  44. //Define column areas
  45. Rectangle[] columns = {new Rectangle(offSet - 5, offSet, columnWidth, columnHeight),
  46. new Rectangle(offSet + columnWidth, offSet, columnWidth, columnHeight),
  47. new Rectangle(offSet + columnWidth * 2 + 5, offSet, columnWidth, columnHeight)};
  48. document.setRenderer(new ColumnDocumentRenderer(document, columns));
  49. Image apple = new Image(ImageDataFactory.create(APPLE_IMG)).setWidth(columnWidth);
  50. String articleApple = new String(Files.readAllBytes(Paths.get(APPLE_TXT)), StandardCharsets.UTF_8);
  51. C03E01_NewYorkTimes.addArticle(document, "Apple Encryption Engineers, if Ordered to Unlock iPhone, Might Resist", "By JOHN MARKOFF MARCH 18, 2016", apple, articleApple);
  52. Image facebook = new Image(ImageDataFactory.create(FACEBOOK_IMG)).setWidth(columnWidth);
  53. String articleFB = new String(Files.readAllBytes(Paths.get(FACEBOOK_TXT)), StandardCharsets.UTF_8);
  54. C03E01_NewYorkTimes.addArticle(document, "With \"Smog Jog\" Through Beijing, Zuckerberg Stirs Debate on Air Pollution", "By PAUL MOZUR MARCH 18, 2016", facebook, articleFB);
  55. Image inst = new Image(ImageDataFactory.create(INST_IMG)).setWidth(columnWidth);
  56. String articleInstagram = new String(Files.readAllBytes(Paths.get(INST_TXT)), StandardCharsets.UTF_8);
  57. C03E01_NewYorkTimes.addArticle(document, "Instagram May Change Your Feed, Personalizing It With an Algorithm","By MIKE ISAAC MARCH 15, 2016", inst, articleInstagram);
  58. document.close();
  59. }
  60. public static void addArticle(Document doc, String title, String author, Image img, String text) throws IOException {
  61. Paragraph p1 = new Paragraph(title)
  62. .setFont(timesNewRomanBold)
  63. .setFontSize(14);
  64. doc.add(p1);
  65. doc.add(img);
  66. Paragraph p2 = new Paragraph()
  67. .setFont(timesNewRoman)
  68. .setFontSize(7)
  69. .setFontColor(Color.GRAY)
  70. .add(author);
  71. doc.add(p2);
  72. Paragraph p3 = new Paragraph()
  73. .setFont(timesNewRoman)
  74. .setFontSize(10)
  75. .add(text);
  76. doc.add(p3);
  77. }
  78. }

例子2:不一样的表格

绘制一个表格,第一栏为圆角单元格,每一列的背景颜色不同,根据列号而定,代码如下:

  1. import com.itextpdf.io.font.FontConstants;
  2. import com.itextpdf.kernel.color.Color;
  3. import com.itextpdf.kernel.color.DeviceCmyk;
  4. import com.itextpdf.kernel.font.PdfFont;
  5. import com.itextpdf.kernel.font.PdfFontFactory;
  6. import com.itextpdf.kernel.geom.PageSize;
  7. import com.itextpdf.kernel.geom.Rectangle;
  8. import com.itextpdf.kernel.pdf.PdfDocument;
  9. import com.itextpdf.kernel.pdf.PdfWriter;
  10. import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
  11. import com.itextpdf.layout.Document;
  12. import com.itextpdf.layout.property.HorizontalAlignment;
  13. import com.itextpdf.layout.border.SolidBorder;
  14. import com.itextpdf.layout.element.Cell;
  15. import com.itextpdf.layout.element.Paragraph;
  16. import com.itextpdf.layout.element.Table;
  17. import com.itextpdf.layout.property.TextAlignment;
  18. import com.itextpdf.layout.renderer.CellRenderer;
  19. import com.itextpdf.layout.renderer.DrawContext;
  20. import java.io.*;
  21. import java.util.StringTokenizer;
  22. /** * Simple table renderer example. */
  23. public class C03E02_PremierLeague {
  24. public static final String DATA = "src/main/resources/data/premier_league.csv";
  25. public static final String DEST = "results/chapter03/premier_league.pdf";
  26. Color greenColor = new DeviceCmyk(0.78f, 0, 0.81f, 0.21f);
  27. Color yellowColor = new DeviceCmyk(0, 0, 0.76f, 0.01f);
  28. Color redColor = new DeviceCmyk(0, 0.76f, 0.86f, 0.01f);
  29. Color blueColor = new DeviceCmyk(0.28f, 0.11f, 0, 0);
  30. public static void main(String args[]) throws IOException {
  31. File file = new File(DEST);
  32. file.getParentFile().mkdirs();
  33. new C03E02_PremierLeague().createPdf(DEST);
  34. }
  35. public void createPdf(String dest) throws IOException {
  36. //Initialize PDF document
  37. PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
  38. PageSize ps = new PageSize(842, 680);
  39. // Initialize document
  40. Document document = new Document(pdf, ps);
  41. PdfFont font = PdfFontFactory.createFont(FontConstants.HELVETICA);
  42. PdfFont bold = PdfFontFactory.createFont(FontConstants.HELVETICA_BOLD);
  43. Table table = new Table(new float[]{1.5f, 7, 2, 2, 2, 2, 3, 4, 4, 2});
  44. table.setWidthPercent(100)
  45. .setTextAlignment(TextAlignment.CENTER)
  46. .setHorizontalAlignment(HorizontalAlignment.CENTER);
  47. BufferedReader br = new BufferedReader(new FileReader(DATA));
  48. String line = br.readLine();
  49. process(table, line, bold, true);
  50. while ((line = br.readLine()) != null) {
  51. process(table, line, font, false);
  52. }
  53. br.close();
  54. document.add(table);
  55. //Close document
  56. document.close();
  57. }
  58. public void process(Table table, String line, PdfFont font, boolean isHeader) {
  59. StringTokenizer tokenizer = new StringTokenizer(line, ";");
  60. int columnNumber = 0;
  61. while (tokenizer.hasMoreTokens()) {
  62. if (isHeader) {
  63. Cell cell = new Cell().add(new Paragraph(tokenizer.nextToken()));
  64. cell.setNextRenderer(new RoundedCornersCellRenderer(cell));
  65. cell.setPadding(5).setBorder(null);
  66. table.addHeaderCell(cell);
  67. } else {
  68. columnNumber++;
  69. Cell cell = new Cell().add(new Paragraph(tokenizer.nextToken()));
  70. cell.setFont(font).setBorder(new SolidBorder(Color.BLACK, 0.5f));
  71. switch (columnNumber) {
  72. case 4:
  73. cell.setBackgroundColor(greenColor);
  74. break;
  75. case 5:
  76. cell.setBackgroundColor(yellowColor);
  77. break;
  78. case 6:
  79. cell.setBackgroundColor(redColor);
  80. break;
  81. default:
  82. cell.setBackgroundColor(blueColor);
  83. break;
  84. }
  85. table.addCell(cell);
  86. }
  87. }
  88. }
  89. private class RoundedCornersCellRenderer extends CellRenderer {
  90. public RoundedCornersCellRenderer(Cell modelElement) {
  91. super(modelElement);
  92. }
  93. @Override
  94. public void drawBorder(DrawContext drawContext) {
  95. Rectangle rectangle = getOccupiedAreaBBox();
  96. float llx = rectangle.getX() + 1;
  97. float lly = rectangle.getY() + 1;
  98. float urx = rectangle.getX() + getOccupiedAreaBBox().getWidth() - 1;
  99. float ury = rectangle.getY() + getOccupiedAreaBBox().getHeight() - 1;
  100. PdfCanvas canvas = drawContext.getCanvas();
  101. float r = 4;
  102. float b = 0.4477f;
  103. canvas.moveTo(llx, lly).lineTo(urx, lly).lineTo(urx, ury - r)
  104. .curveTo(urx, ury - r * b, urx - r * b, ury, urx - r, ury)
  105. .lineTo(llx + r, ury)
  106. .curveTo(llx + r * b, ury, llx, ury - r * b, llx, ury - r)
  107. .lineTo(llx, lly).stroke();
  108. super.drawBorder(drawContext);
  109. }
  110. }

例子3:添加页眉、页脚和水印

绘制一个表格,奇偶页背景颜色不同,添加页眉、页脚和水印,代码如下:

  1. import com.itextpdf.io.font.FontConstants;
  2. import com.itextpdf.kernel.color.Color;
  3. import com.itextpdf.kernel.color.DeviceCmyk;
  4. import com.itextpdf.kernel.events.Event;
  5. import com.itextpdf.kernel.events.IEventHandler;
  6. import com.itextpdf.kernel.events.PdfDocumentEvent;
  7. import com.itextpdf.kernel.font.PdfFont;
  8. import com.itextpdf.kernel.font.PdfFontFactory;
  9. import com.itextpdf.kernel.geom.Rectangle;
  10. import com.itextpdf.kernel.pdf.PdfDocument;
  11. import com.itextpdf.kernel.pdf.PdfPage;
  12. import com.itextpdf.kernel.pdf.PdfWriter;
  13. import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
  14. import com.itextpdf.layout.Canvas;
  15. import com.itextpdf.layout.Document;
  16. import com.itextpdf.layout.border.SolidBorder;
  17. import com.itextpdf.layout.element.Cell;
  18. import com.itextpdf.layout.element.Paragraph;
  19. import com.itextpdf.layout.element.Table;
  20. import com.itextpdf.layout.property.Property;
  21. import com.itextpdf.layout.property.TextAlignment;
  22. import com.itextpdf.layout.property.UnitValue;
  23. import com.itextpdf.layout.property.VerticalAlignment;
  24. import java.io.BufferedReader;
  25. import java.io.File;
  26. import java.io.FileReader;
  27. import java.util.StringTokenizer;
  28. /** * Simple event handler example. */
  29. public class C03E03_UFO {
  30. public static final String DATA = "src/main/resources/data/ufo.csv";
  31. public static final String DEST = "results/chapter03/ufo.pdf";
  32. static PdfFont helvetica = null;
  33. static PdfFont helveticaBold = null;
  34. public static void main(String[] args) throws Exception {
  35. helvetica = PdfFontFactory.createFont(FontConstants.HELVETICA);
  36. helveticaBold = PdfFontFactory.createFont(FontConstants.HELVETICA_BOLD);
  37. File file = new File(DEST);
  38. file.getParentFile().mkdirs();
  39. new C03E03_UFO().createPdf(DEST);
  40. }
  41. protected void createPdf(String dest) throws Exception {
  42. //Initialize PDF document
  43. PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
  44. pdf.addEventHandler(PdfDocumentEvent.END_PAGE, new MyEventHandler());
  45. // Initialize document
  46. Document document = new Document(pdf);
  47. Paragraph p = new Paragraph("List of reported UFO sightings in 20th century")
  48. .setTextAlignment(TextAlignment.CENTER).setFont(helveticaBold).setFontSize(14);
  49. document.add(p);
  50. Table table = new Table(UnitValue.createPercentArray(new float[]{3, 5, 7, 4}));
  51. BufferedReader br = new BufferedReader(new FileReader(DATA));
  52. String line = br.readLine();
  53. process(table, line, helveticaBold, true);
  54. while ((line = br.readLine()) != null) {
  55. process(table, line, helvetica, false);
  56. }
  57. br.close();
  58. document.add(table);
  59. document.close();
  60. }
  61. public void process(Table table, String line, PdfFont font, boolean isHeader) {
  62. StringTokenizer tokenizer = new StringTokenizer(line, ";");
  63. while (tokenizer.hasMoreTokens()) {
  64. if (isHeader) {
  65. table.addHeaderCell(new Cell().add(new Paragraph(tokenizer.nextToken()).setFont(font)).setFontSize(9).setBorder(new SolidBorder(Color.BLACK, 0.5f)));
  66. } else {
  67. table.addCell(new Cell().add(new Paragraph(tokenizer.nextToken()).setFont(font)).setFontSize(9).setBorder(new SolidBorder(Color.BLACK, 0.5f)));
  68. }
  69. }
  70. }
  71. protected class MyEventHandler implements IEventHandler {
  72. public void handleEvent(Event event) {
  73. PdfDocumentEvent docEvent = (PdfDocumentEvent) event;
  74. PdfDocument pdfDoc = docEvent.getDocument();
  75. PdfPage page = docEvent.getPage();
  76. int pageNumber = pdfDoc.getPageNumber(page);
  77. Rectangle pageSize = page.getPageSize();
  78. PdfCanvas pdfCanvas = new PdfCanvas(page.newContentStreamBefore(), page.getResources(), pdfDoc);
  79. //Set background
  80. Color limeColor = new DeviceCmyk(0.208f, 0, 0.584f, 0);
  81. Color blueColor = new DeviceCmyk(0.445f, 0.0546f, 0, 0.0667f);
  82. pdfCanvas.saveState()
  83. .setFillColor(pageNumber % 2 == 1 ? limeColor : blueColor)
  84. .rectangle(pageSize.getLeft(), pageSize.getBottom(), pageSize.getWidth(), pageSize.getHeight())
  85. .fill().restoreState();
  86. //Add header and footer
  87. pdfCanvas.beginText()
  88. .setFontAndSize(helvetica, 9)
  89. .moveText(pageSize.getWidth() / 2 - 60, pageSize.getTop() - 20)
  90. .showText("THE TRUTH IS OUT THERE")
  91. .moveText(60, -pageSize.getTop() + 30)
  92. .showText(String.valueOf(pageNumber))
  93. .endText();
  94. //Add watermark
  95. Canvas canvas = new Canvas(pdfCanvas, pdfDoc, page.getPageSize());
  96. canvas.setFontColor(Color.WHITE);
  97. canvas.setProperty(Property.FONT_SIZE, 60);
  98. canvas.setProperty(Property.FONT, helveticaBold);
  99. canvas.showTextAligned(new Paragraph("CONFIDENTIAL"), 298, 421, pdfDoc.getPageNumber(page),
  100. TextAlignment.CENTER, VerticalAlignment.MIDDLE, 45);
  101. pdfCanvas.release();
  102. }
  103. }
  104. }

Example代码下载

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

相关文章