项目需要导出PDF,导出的内容包含图片和文本,而且图片的数量不确定,在网上百度发现大家都在用iText,在官网发现可以把html转换为PDF,但是需要收费,那就只能自己写了。

在开始之前先在网上百度了一下,发现网上的博客都是一大堆代码,注释也没几句,根本看不懂,所以就去了官网,官网的快速开始是iText7,在使用过程中发现如果文档中有图片,水印会被图片遮盖,找了好久也没找到怎么设置,网上大部分都是iText5的设置方法,所以就弃用了iText7。

1.添加依赖:

  1. <dependency>
  2. <groupId>com.itextpdf</groupId>
  3. <artifactId>itextpdf</artifactId>
  4. <version>5.5.</version>
  5. </dependency>
  6.  
  7. <dependency>
  8. <groupId>com.itextpdf</groupId>
  9. <artifactId>itext-asian</artifactId>
  10. <version>5.2.</version>
  11. </dependency>

2.首先还是从helloWorld开始

  1. public static final String DEST = "D:/biolims/results/chapter01/hello_world.pdf";
  2. public static final String[] IMAGES = { "C:/Users/Administrator/Pictures/Screenshots/屏幕截图(1).png",
  3. "C:/Users/Administrator/Pictures/20190830133125.png" };
  4.  
  5. public static void main(String args[]) throws Exception {
  6. File file = new File(DEST);
  7. file.getParentFile().mkdirs();
  8. new Test().createPdf(DEST);
  9. }
  10.  
  11. public void createPdf(String dest) throws Exception {
  12. // 第一步 创建文档实例
  13. Document document = new Document();
  14. // 第二步 获取PdfWriter实例
  15. PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
  16. // 第三步 打开文档
  17. document.open();
  18. // 第四步 添加段落内容
  19. document.add(new Paragraph("Hello World!"));
  20.  
  21. // 第五部 操作完成后必须执行文档关闭操作。
  22. document.close();
  23.  
  24. System.out.print("生成成功");
  25. }

2.添加图片及文本(目前iText支持的图像有:GIF,JPEG,PNG,BMP等格式,对于不同的图像格式,iText用同样的构造函数自动识别图像格式):

注:后来客户又要导出图注,格式是上面是图片,图片的下面是图注,图注为文字,出现了一个问题,就是上一页剩余的空间不足够放图片了,所以图片到了下一页,但是上一页的空间可以放下图注,那么图注就会跑到上一页,导致格式错乱,这时候只要在创建PdfWriter后加上这句代码就可以了(

writer.setStrictImageSequence(true); //设置图片是否精确放置,选择是(true),否(false):)

  1. import com.biolims.file.util.PDFEventHandler;
  2. import com.itextpdf.text.Document;
  3. import com.itextpdf.text.Image;
  4. import com.itextpdf.text.PageSize;
  5. import com.itextpdf.text.Paragraph;
  6. import com.itextpdf.text.pdf.PdfWriter;
  7.  
  8. public static final String DEST = "D:/biolims/results/chapter01/hello_world.pdf";
  9. public static final String[] IMAGES = { "C:/Users/Administrator/Pictures/Screenshots/屏幕截图(1).png",
  10. "C:/Users/Administrator/Pictures/20190830133125.png" };
  11.  
  12. public static void main(String args[]) throws Exception {
  13. File file = new File(DEST);
  14. file.getParentFile().mkdirs();
  15. new Test().createPdf(DEST);
  16. }
  17.  
  18. public void createPdf(String dest) throws Exception {
  19. // 第一步 创建文档实例
  20. Document document = new Document();
  21. // 第二步 获取PdfWriter实例
  22. PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
  23.  
  24. // 第三步 打开文档
  25. document.open();
  26. // 第四步 添加段落内容
  27. document.add(new Paragraph("Hello World!"));
  28. for(int i = 0;i<IMAGES.length;i++) {
  29. Image image = Image.getInstance(IMAGES[i]);
  30. float documentWidth = document.getPageSize().getWidth() - document.leftMargin() - document.rightMargin();
  31. float documentHeight = documentWidth / 580 * 320;//重新设置宽高
  32. image.scaleAbsolute(documentWidth, documentHeight);//重新设置宽高
  33. document.add(image);
  34. }
  35.  
  36. // 第五部 操作完成后必须执行文档关闭操作。
  37. document.close();
  38.  
  39. System.out.print("生成成功");
  40. }

3.添加页眉页脚以及水印(使用PDF事件添加,PdfPageEventHelper是事件类)(客户需要的页眉页脚既有图片也有文字,写在了最下方)

PdfPageEventHelper中包含以下事件处理器。

onOpenDocument() — 当打开一个文档时触发,可以用于初始化文档的全局变量。
       onStartPage() — 当一个页面初始化时触发,可用于初始化页面的设置参数,但是注意这个函数触发时,该页面并没有创建好,不用利用这个函数添加内容,最好利用onEndPage()处理页面的初始化。
       onEndPage() — 在创建一个新页面完成但写入内容之前触发,是添加页眉、页脚、水印等最佳时机。

onCloseDocument() — 在文档关闭之前触发,可以用于释放一些资源。

onCloseDocument() — 在文档关闭之前触发,可以用于释放一些资源。

  1. package com.biolims.file.util;
  2.  
  3. import java.io.IOException;
  4.  
  5. import com.itextpdf.text.BaseColor;
  6. import com.itextpdf.text.Document;
  7. import com.itextpdf.text.DocumentException;
  8. import com.itextpdf.text.Element;
  9. import com.itextpdf.text.Font;
  10. import com.itextpdf.text.PageSize;
  11. import com.itextpdf.text.Phrase;
  12. import com.itextpdf.text.Rectangle;
  13. import com.itextpdf.text.pdf.BaseFont;
  14. import com.itextpdf.text.pdf.ColumnText;
  15. import com.itextpdf.text.pdf.PdfContentByte;
  16. import com.itextpdf.text.pdf.PdfGState;
  17. import com.itextpdf.text.pdf.PdfPageEventHelper;
  18. import com.itextpdf.text.pdf.PdfTemplate;
  19. import com.itextpdf.text.pdf.PdfWriter;
  20.  
  21. public class PDFEventHandler extends PdfPageEventHelper {
  22.  
  23. /**
  24. * 页眉
  25. */
  26. public String header = "";
  27.  
  28. /**
  29. * 文档字体大小,页脚页眉最好和文本大小一致
  30. */
  31. public int presentFontSize = 12;
  32.  
  33. /**
  34. * 文档页面大小,最好前面传入,否则默认为A4纸张
  35. */
  36. public Rectangle pageSize = PageSize.A4;
  37.  
  38. // 模板
  39. public PdfTemplate total;
  40.  
  41. // 基础字体对象
  42. public BaseFont bf = null;
  43.  
  44. // 利用基础字体生成的字体对象,一般用于生成中文文字
  45. public Font fontDetail = null;
  46. /***
  47. * 水印
  48. */
  49. public String watermark = "";
  50.  
  51. /**
  52. *
  53. * Creates a new instance of PdfReportM1HeaderFooter 无参构造方法.
  54. *
  55. */
  56. public PDFEventHandler() {
  57.  
  58. }
  59.  
  60. /**
  61. *
  62. * Creates a new instance of PdfReportM1HeaderFooter 构造方法.
  63. *
  64. * @param yeMei 页眉字符串
  65. * @param presentFontSize 数据体字体大小
  66. * @param pageSize 页面文档大小,A4,A5,A6横转翻转等Rectangle对象
  67. * @param watermark 水印字符串
  68. */
  69. public PDFEventHandler(String yeMei, int presentFontSize, Rectangle pageSize,String watermark) {
  70. this.header = yeMei;
  71. this.presentFontSize = presentFontSize;
  72. this.pageSize = pageSize;
  73. this.watermark = watermark;
  74. }
  75.  
  76. public void setHeader(String header) {
  77. this.header = header;
  78. }
  79.  
  80. public void setPresentFontSize(int presentFontSize) {
  81. this.presentFontSize = presentFontSize;
  82. }
  83.  
  84. public void setWatermark(String watermark) {
  85. this.watermark = watermark;
  86. }
  87.  
  88. /**
  89. *
  90. * TODO 文档打开时创建模板
  91. *
  92. * @see com.itextpdf.text.pdf.PdfPageEventHelper#onOpenDocument(com.itextpdf.text.pdf.PdfWriter,
  93. * com.itextpdf.text.Document)
  94. */
  95. public void onOpenDocument(PdfWriter writer, Document document) {
  96. total = writer.getDirectContent().createTemplate(50, 50);// 共 页 的矩形的长宽高
  97. }
  98.  
  99. /**
  100. *
  101. * TODO 关闭每页的时候,写入页眉,写入'第几页共'这几个字。
  102. *
  103. * @see com.itextpdf.text.pdf.PdfPageEventHelper#onEndPage(com.itextpdf.text.pdf.PdfWriter,
  104. * com.itextpdf.text.Document)
  105. */
  106. public void onEndPage(PdfWriter writer, Document document) {
  107.  
  108. try {
  109. if (bf == null) {
  110. bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);
  111. }
  112. if (fontDetail == null) {
  113. fontDetail = new Font(bf, presentFontSize, Font.NORMAL);// 数据体字体
  114. }
  115. } catch (DocumentException e) {
  116. e.printStackTrace();
  117. } catch (IOException e) {
  118. e.printStackTrace();
  119. }
  120.  
  121. // 1.写入页眉
  122. ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_LEFT, new Phrase(header, fontDetail),
  123. document.left() / 2, document.top() + 20, 0);
  124.  
  125. // 2.写入前半部分的 第 X页/共
  126. int pageS = writer.getPageNumber();
  127. String foot1 = "第 " + pageS + " 页 /共";
  128. Phrase footer = new Phrase(foot1, fontDetail);
  129.  
  130. // 3.计算前半部分的foot1的长度,后面好定位最后一部分的'Y页'这俩字的x轴坐标,字体长度也要计算进去 = len
  131. float len = bf.getWidthPoint(foot1, presentFontSize);
  132.  
  133. // 4.拿到当前的PdfContentByte
  134. PdfContentByte cb = writer.getDirectContent();//如果用getDirectContentUnder方法,如果PDF中有图片,那么水印会被覆盖
  135.  
  136. // 自己增加的
  137. // if(pageS==1){
  138. // Phrase footerLeft = new Phrase("978-1-4799-0530-031.00 ©2013 IEEE", fontDetail);
  139. // ColumnText.showTextAligned(cb, Element.ALIGN_LEFT, footerLeft, document.left(), document.bottom() - 20, 0);
  140. // }
  141.  
  142. // 5.写入页脚1,x轴就是(右margin+左margin + right() -left()- len)/2.0F
  143. // 再给偏移20F适合人类视觉感受,否则肉眼看上去就太偏左了
  144. // ,y轴就是底边界-20,否则就贴边重叠到数据体里了就不是页脚了;注意Y轴是从下往上累加的,最上方的Top值是大于Bottom好几百开外的。
  145. ColumnText.showTextAligned(cb, Element.ALIGN_CENTER, footer,
  146. (document.rightMargin() + document.right() + document.leftMargin() - document.left() - len) / 2.0F
  147. + 20F,
  148. document.bottom() - 20, 0);
  149.  
  150. // 6.写入页脚2的模板(就是页脚的Y页这俩字)添加到文档中,计算模板的和Y轴,X=(右边界-左边界 - 前半部分的len值)/2.0F + len , y
  151. // 轴和之前的保持一致,底边界-20
  152. cb.addTemplate(total,
  153. (document.rightMargin() + document.right() + document.leftMargin() - document.left()) / 2.0F + 20F,
  154. document.bottom() - 20); // 调节模版显示的位置
  155.  
  156. // 文字水印
  157. PdfGState gs = new PdfGState();
  158. // 开始
  159. cb.beginText();
  160. gs.setFillOpacity(0.3f);
  161. gs.setStrokeOpacity(0.3f);
  162. cb.saveState();
  163. cb.setGState(gs);
  164. // 设置颜色
  165. cb.setColorFill(BaseColor.RED);
  166. // 设置字体及字号
  167. try {
  168. cb.setFontAndSize(BaseFont.createFont(), 300);
  169. } catch (DocumentException e) {
  170. // TODO Auto-generated catch block
  171. e.printStackTrace();
  172. } catch (IOException e) {
  173. // TODO Auto-generated catch block
  174. e.printStackTrace();
  175. }
  176. // 设置起始位置
  177. cb.setTextMatrix(298, 421);
  178. // 开始写入水印
  179. cb.showTextAligned(Element.ALIGN_CENTER, watermark, 298, 421, 45);
  180. cb.restoreState();
  181. // 结束
  182. cb.endText();
  183.  
  184. }
  185.  
  186. /**
  187. *
  188. * TODO 关闭文档时,替换模板,完成整个页眉页脚组件
  189. *
  190. * @see com.itextpdf.text.pdf.PdfPageEventHelper#onCloseDocument(com.itextpdf.text.pdf.PdfWriter,
  191. * com.itextpdf.text.Document)
  192. */
  193. public void onCloseDocument(PdfWriter writer, Document document) {
  194. // 7.最后一步了,就是关闭文档的时候,将模板替换成实际的 Y 值,至此,page x of y 制作完毕,完美兼容各种文档size。
  195. total.beginText();
  196. total.setFontAndSize(bf, presentFontSize);// 生成的模版的字体、颜色
  197. String foot2 = " " + (writer.getPageNumber()) + " 页";
  198. total.showText(foot2);// 模版显示的内容
  199. total.endText();
  200. total.closePath();
  201. }
  202.  
  203. }

4.最后,在document.open();上方添加事件

  1. //PDF事件类
  2. PDFEventHandler pdfEventHandler = new PDFEventHandler("页眉",12,PageSize.A4,"水印");
  3. //给当前PDF添加事件(页眉,页脚,水印)
  4. writer.setPageEvent(pdfEventHandler);

5.客户想要的页眉页脚有图片加文字,百度了一下好像没有设置图片的方法,所以我用的定位把内容定位到了页眉页脚的位置

  1. package com.biolims.file.util;
  2.  
  3. import java.io.IOException;
  4. import java.net.MalformedURLException;
  5.  
  6. import com.biolims.file.test.Test;
  7. import com.itextpdf.text.BadElementException;
  8. import com.itextpdf.text.BaseColor;
  9. import com.itextpdf.text.Document;
  10. import com.itextpdf.text.DocumentException;
  11. import com.itextpdf.text.Element;
  12. import com.itextpdf.text.Font;
  13. import com.itextpdf.text.FontFactory;
  14. import com.itextpdf.text.Image;
  15. import com.itextpdf.text.PageSize;
  16. import com.itextpdf.text.Phrase;
  17. import com.itextpdf.text.Rectangle;
  18. import com.itextpdf.text.pdf.BaseFont;
  19. import com.itextpdf.text.pdf.ColumnText;
  20. import com.itextpdf.text.pdf.PdfContentByte;
  21. import com.itextpdf.text.pdf.PdfGState;
  22. import com.itextpdf.text.pdf.PdfPageEventHelper;
  23. import com.itextpdf.text.pdf.PdfTemplate;
  24. import com.itextpdf.text.pdf.PdfWriter;
  25.  
  26. public class PDFEventHandler extends PdfPageEventHelper {
  27.  
  28. /**
  29. * 页眉
  30. */
  31. public String header = "";
  32.  
  33. /**
  34. * 文档字体大小,页脚页眉最好和文本大小一致
  35. */
  36. public int presentFontSize = ;
  37.  
  38. /**
  39. * 文档页面大小,最好前面传入,否则默认为A4纸张
  40. */
  41. public Rectangle pageSize = PageSize.A4;
  42.  
  43. // 模板
  44. public PdfTemplate total;
  45.  
  46. // 基础字体对象
  47. public BaseFont bf = null;
  48.  
  49. // 利用基础字体生成的字体对象,一般用于生成中文文字
  50. public Font fontDetail = null;
  51. /***
  52. * 水印
  53. */
  54. public String watermark = "";
  55.  
  56. /**
  57. *
  58. * Creates a new instance of PdfReportM1HeaderFooter 无参构造方法.
  59. *
  60. */
  61. public PDFEventHandler() {
  62.  
  63. }
  64.  
  65. /**
  66. *
  67. * Creates a new instance of PdfReportM1HeaderFooter 构造方法.
  68. *
  69. * @param yeMei 页眉字符串
  70. * @param presentFontSize 数据体字体大小
  71. * @param pageSize 页面文档大小,A4,A5,A6横转翻转等Rectangle对象
  72. * @param watermark 水印字符串
  73. */
  74. public PDFEventHandler(String yeMei, int presentFontSize, Rectangle pageSize, String watermark) {
  75. this.header = yeMei;
  76. this.presentFontSize = presentFontSize;
  77. this.pageSize = pageSize;
  78. this.watermark = watermark;
  79. }
  80.  
  81. public void setHeader(String header) {
  82. this.header = header;
  83. }
  84.  
  85. public void setPresentFontSize(int presentFontSize) {
  86. this.presentFontSize = presentFontSize;
  87. }
  88.  
  89. public void setWatermark(String watermark) {
  90. this.watermark = watermark;
  91. }
  92.  
  93. /**
  94. *
  95. * TODO 文档打开时创建模板
  96. *
  97. * @see com.itextpdf.text.pdf.PdfPageEventHelper#onOpenDocument(com.itextpdf.text.pdf.PdfWriter,
  98. * com.itextpdf.text.Document)
  99. */
  100. public void onOpenDocument(PdfWriter writer, Document document) {
  101. total = writer.getDirectContent().createTemplate(, );// 共 页 的矩形的长宽高
  102. }
  103.  
  104. /**
  105. *
  106. * TODO 关闭每页的时候,写入页眉,写入'第几页共'这几个字。
  107. *
  108. * @see com.itextpdf.text.pdf.PdfPageEventHelper#onEndPage(com.itextpdf.text.pdf.PdfWriter,
  109. * com.itextpdf.text.Document)
  110. */
  111. public void onEndPage(PdfWriter writer, Document document) {
  112.  
  113. try {
  114. if (bf == null) {
  115. bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);
  116. }
  117. if (fontDetail == null) {
  118. fontDetail = new Font(bf, presentFontSize, Font.NORMAL);// 数据体字体
  119. }
  120. } catch (DocumentException e) {
  121. e.printStackTrace();
  122. } catch (IOException e) {
  123. e.printStackTrace();
  124. }
  125.  
  126. // 1.写入页眉
  127. // ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_LEFT, new Phrase(header, fontDetail),
  128. // (document.rightMargin() + document.right() + document.leftMargin() - document.left()) / 2.0F,
  129. // document.top() + 20, 0);
  130.  
  131. // 2.写入前半部分的 第 X页/共
  132. // int pageS = writer.getPageNumber();
  133. // String foot1 = "第 " + pageS + " 页 /共";
  134. // Phrase footer = new Phrase(foot1, fontDetail);
  135. //
  136. // // 3.计算前半部分的foot1的长度,后面好定位最后一部分的'Y页'这俩字的x轴坐标,字体长度也要计算进去 = len
  137. // float len = bf.getWidthPoint(foot1, presentFontSize);
  138. //
  139. // // 4.拿到当前的PdfContentByte
  140. PdfContentByte cb = writer.getDirectContent();// 如果用getDirectContentUnder方法,如果PDF中有图片,那么水印会被覆盖
  141.  
  142. // 自己增加的
  143. // if(pageS==1){
  144. // Phrase footerLeft = new Phrase("978-1-4799-0530-031.00 ©2013 IEEE", fontDetail);
  145. // ColumnText.showTextAligned(cb, Element.ALIGN_LEFT, footerLeft, document.left(), document.bottom() - 20, 0);
  146. // }
  147.  
  148. // 5.写入页脚1,x轴就是(右margin+左margin + right() -left()- len)/2.0F
  149. // 再给偏移20F适合人类视觉感受,否则肉眼看上去就太偏左了
  150. // ,y轴就是底边界-20,否则就贴边重叠到数据体里了就不是页脚了;注意Y轴是从下往上累加的,最上方的Top值是大于Bottom好几百开外的。
  151. // ColumnText.showTextAligned(cb, Element.ALIGN_CENTER, footer,
  152. // (document.rightMargin() + document.right() + document.leftMargin() - document.left() - len) / 2.0F
  153. // + 20F,
  154. // document.bottom() - 20, 0);
  155. //
  156. // // 6.写入页脚2的模板(就是页脚的Y页这俩字)添加到文档中,计算模板的和Y轴,X=(右边界-左边界 - 前半部分的len值)/2.0F + len , y
  157. // // 轴和之前的保持一致,底边界-20
  158. // cb.addTemplate(total,
  159. // (document.rightMargin() + document.right() + document.leftMargin() - document.left()) / 2.0F + 20F,
  160. // document.bottom() - 20); // 调节模版显示的位置
  161.  
  162. // 图片页眉
  163.  
  164. try {
  165. Image image = Image.getInstance("C:\\Users\\Administrator\\Desktop\\1576139413(1).jpg");
  166. float documentWidth = 7.21f * ;
  167. float documentHeight = 1.34f * ;// 重新设置宽高
  168. image.scaleAbsolute(documentWidth, documentHeight);// 重新设置宽高
  169. // 设置图片绝对位置
  170. image.setAbsolutePosition(document.left(), document.top() - );
  171. document.add(image);
  172.  
  173. // 加载文本
  174. cb.beginText();
  175. // 设置文本为中文、和字体大小
  176. cb.setFontAndSize(bf, );
  177. cb.setColorFill(BaseColor.BLUE);
  178. // 设置文本绝对坐标
  179. cb.setTextMatrix(document.left() + , document.top());
  180.  
  181. // 设置文本
  182. cb.showText("Innovative Models to Empower Health Sciences");
  183. cb.endText();
  184.  
  185. Image image2 = Image.getInstance("C:\\Users\\Administrator\\Desktop\\1576139562(1).jpg");
  186. float documentWidth2 = document.rightMargin() + document.right() - document.leftMargin() - document.left();
  187. float documentHeight2 = 5.0f;// 重新设置宽高
  188. image2.scaleAbsolute(documentWidth2, documentHeight2);// 重新设置宽高
  189. // 设置图片绝对位置
  190. image2.setAbsolutePosition(document.left(), document.top() - );
  191. document.add(image2);
  192.  
  193. } catch (Exception e1) {
  194. e1.printStackTrace();
  195. }
  196. // end图片页眉
  197.  
  198. // 图片页脚
  199. try {
  200. Image image2 = Image.getInstance("C:\\Users\\Administrator\\Desktop\\1576139562(1).jpg");
  201. float documentWidth2 = document.rightMargin() + document.right() - document.leftMargin() - document.left();
  202. float documentHeight2 = 5.0f;// 重新设置宽高
  203. image2.scaleAbsolute(documentWidth2, documentHeight2);// 重新设置宽高
  204. // 设置图片绝对位置
  205. image2.setAbsolutePosition(document.left(), document.bottom() - 8);
  206. document.add(image2);
  207.  
  208. // 加载文本
  209. cb.beginText();
  210. // 设置文本为中文、和字体大小
  211. cb.setFontAndSize(bf, );
  212. cb.setColorFill(BaseColor.BLACK);
  213. // 设置文本绝对坐标
  214. cb.setTextMatrix(document.left(), document.bottom() - );
  215.  
  216. // 设置文本
  217. cb.showText("Biocytogen Boston Corp. ");
  218. cb.endText();
  219.  
  220. // 加载文本
  221. cb.beginText();
  222. // 设置文本为中文、和字体大小
  223. cb.setFontAndSize(bf, );
  224. cb.setColorFill(BaseColor.BLACK);
  225. // 设置文本绝对坐标
  226. cb.setTextMatrix(document.left(), document.bottom() - 24);
  227.  
  228. // 设置文本
  229. cb.showText("50CAudubon Rd, Wakefield, MA 01880. Ph: (781)-587-3558. ");
  230. cb.endText();
  231.  
  232. // 加载文本
  233. cb.beginText();
  234. // 设置文本为中文、和字体大小
  235. cb.setFontAndSize(bf, );
  236. cb.setColorFill(BaseColor.BLACK);
  237. // 设置文本绝对坐标
  238. cb.setTextMatrix(document.left(), document.bottom() - 32);
  239.  
  240. // 设置文本
  241. cb.showText("Email: info@biocytogen.com. http://www.biocytogen.com");
  242. cb.endText();
  243.  
  244. } catch (Exception e1) {
  245. e1.printStackTrace();
  246. }
  247. // end图片页脚
  248.  
  249. // 文字水印
  250. PdfGState gs = new PdfGState();
  251. // 开始
  252. cb.beginText();
  253. gs.setFillOpacity(0.3f);
  254. gs.setStrokeOpacity(0.3f);
  255. cb.saveState();
  256. cb.setGState(gs);
  257. // 设置颜色
  258. cb.setColorFill(BaseColor.GRAY);
  259. // 设置字体及字号
  260. try {
  261. cb.setFontAndSize(BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED), );
  262. } catch (DocumentException e) {
  263. // TODO Auto-generated catch block
  264. e.printStackTrace();
  265. } catch (IOException e) {
  266. // TODO Auto-generated catch block
  267. e.printStackTrace();
  268. }
  269. // 设置起始位置
  270. cb.setTextMatrix(, );
  271. // 开始写入水印
  272. cb.showTextAligned(Element.ALIGN_CENTER, watermark, , , );
  273. cb.restoreState();
  274. // 结束
  275. cb.endText();
  276.  
  277. }
  278.  
  279. /**
  280. *
  281. * TODO 关闭文档时,替换模板,完成整个页眉页脚组件
  282. *
  283. * @see com.itextpdf.text.pdf.PdfPageEventHelper#onCloseDocument(com.itextpdf.text.pdf.PdfWriter,
  284. * com.itextpdf.text.Document)
  285. */
  286. public void onCloseDocument(PdfWriter writer, Document document) {
  287. // 7.最后一步了,就是关闭文档的时候,将模板替换成实际的 Y 值,至此,page x of y 制作完毕,完美兼容各种文档size。
  288. total.beginText();
  289. total.setFontAndSize(bf, presentFontSize);// 生成的模版的字体、颜色
  290. String foot2 = " " + (writer.getPageNumber()) + " 页";
  291. total.showText(foot2);// 模版显示的内容
  292. total.endText();
  293. total.closePath();
  294. }
  295.  
  296. }

最后附上效果图(下面的那张图片被拉伸了,请忽略)

参考博客:

https://blog.csdn.net/younkerjqb/article/details/14125955

https://www.cnblogs.com/tankqiu/p/4412898.html

iText导出PDF(图片,水印,页眉,页脚)的更多相关文章

  1. iText + Freemarker实现pdf的导出,支持中文、css以及图片,页眉页脚,页眉添加图片

    本文为了记录自己的实现过程,具体的实现步骤是参考博文 https://www.cnblogs.com/youzhibing/p/7692366.html 来实现的,只是在他的基础上添加了页眉页脚及页眉 ...

  2. c# iText 生成PDF 有文字,图片,表格,文字样式,对齐方式,页眉页脚,等等等,

    #region 下载说明书PDF protected void lbtnDownPDF_Click(object sender, EventArgs e) { int pid = ConvertHel ...

  3. itext 生成pdf文件添加页眉页脚

    原文来自:https://www.cnblogs.com/joann/p/5511905.html 我只是记录所有jar版本,由于版本冲突及不兼容很让人头疼的,一共需要5个jar, 其中itextpd ...

  4. 【Itext】7步制作Itext5页眉页脚pdf实现第几页共几页

    itext5页眉页脚工具类,实现page x of y 完美兼容各种格式大小文档A4/B5/B3,兼容各种文档格式自动计算页脚XY轴坐标 鉴于没人做的这么细致,自己就写了一个itext5页眉页脚工具类 ...

  5. Itext导出PDF,word,图片案例

    iText导出pdf.word.图片 一.前言 在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表的Java组件--iText.通过在服务器端使用Jsp或JavaBean生 ...

  6. 怎么给PDF去除页眉页脚

    PDF文件我们现在都会使用到,但有时需编辑PDF文件的时候,小伙伴们都知道该怎么操作吗,不知道的小伙伴不用担心,今天小编就来跟大家分享一下怎么删除PDF文件的页眉页脚,我们一起来看看下面的文章吧 操作 ...

  7. ABBYY FineReader 15 如何为PDF文档添加页眉页脚

    页眉.页脚是文档页面顶部或底部重复出现的文本信息.很多用户会习惯在文档页面的顶部与底部区域添加页眉.页脚来展现页码.文档标题.作者姓名.品牌名称等附加信息.而ABBYY FineReader 15(W ...

  8. 【itext】7步制作兼容各种文档格式的Itext5页眉页脚 实现page x pf y

    itext5页眉页脚工具类,实现page x of y 完美兼容各种格式大小文档A4/B5/B3,兼容各种文档格式自动计算页脚XY轴坐标 鉴于没人做的这么细致,自己就写了一个itext5页眉页脚工具类 ...

  9. C#word(2007)操作类--新建文档、添加页眉页脚、设置格式、添加文本和超链接、添加图片、表格处理、文档格式转化

    转:http://www.cnblogs.com/lantionzy/archive/2009/10/23/1588511.html 1.新建Word文档 #region 新建Word文档/// &l ...

随机推荐

  1. CentOS7 日常操作

    A 安装netstat1.首先配置好本机的yum源: yum repolist all2.利用netstat命令,却提示:-bash: netstat: command not found3.执行yu ...

  2. char数组初始化

    初始化 char str[10]="Hello"; char str[10]={'H','e','l','l','o','\0'}; char str[10]={'H'}; cha ...

  3. Redis介绍及入门安装及使用

    Redis介绍及入门安装及使用 什么是Redis Redis is an open source (BSD licensed), in-memory data structure store, use ...

  4. [Python3] 005 列表的基本使用

    目录 1. 列表概述 2. 创建列表 3. 列表常用操作 (1) 访问列表 (2) 分片操作 1) 正向操作 2) 反向操作 3) 内置函数 id() 加入队伍 1. 列表概述 一组有顺序的数据的组合 ...

  5. centos7下搭建Testlink环境详细过程

    花了半天的时间终于搭建好了完整的Testlink环境,主要包括Mysql以及PHP的版本.未关闭防火墙.以及安装配置过程中遇到的一些问题.以下是详细的搭建过程. 一.工具准备 以下是我在搭建过程中用到 ...

  6. accept()出的socket不会使用新的端口号

    1 标识一个socket的是四元组,不只是端口号 client ip : client port : server ip : server port 2 accept出的新的socket仍然使用和li ...

  7. 在SSIS 的 64 位版本中不支持 Excel 连接管理器[转]

    Microsoft sql server 2008 R2——> SQL SERVER Business Intelligence Development Studio 使用EXCEL数据源或目标 ...

  8. git的基本使用方法

    git的基本使用方法:https://blog.csdn.net/qq_33316091/article/details/82414389

  9. JavaScript ES6中export、import与export default的用法和区别

    前言 相信很多人都使用过export.export default.import,然而它们到底有什么区别呢? 在看他们之间的区别之前,我们先来看看它们的用法. ES6 import和export的用法 ...

  10. python小感悟(初学者)

    计算机语言的起源: 在计算机刚发明出来的时候,是一大堆的机械硬件,然后技术人员开发了操作系统,操作系统是最底层的软件,负责与硬件沟通,执行其他软件的命令.由于计算机只能识别0和1两种特殊的机器语言,所 ...