【API接口】

一、Itext简介

  1. API地址:javadoc/index.html;如 D:/MyJAR/原JAR包/PDF/itext-5.5.3/itextpdf-5.5.3-javadoc/index.html
  2. 功能:a Free Java-PDF;
  3. 中文支持:iTextAsian.jar,现在高版本Itext不支持语言包。
  4. 使用的版本:iTextpdf-5.0.0.jar, iTextAsian-2.0.jar,或者不用 iTextAsian-2.0.jar,直接使用ttf或ttc字体库


二、Itext API

(一)PDF文档生成的5步

[java]

  1. /**
  2. * 5步生成一个PDF
  3. */
  4. public void createPdf() throws Exception {
  5. // 1-创建文本对象 Document
  6. Document document = new Document(PageSize.A4, 500, 150, 50, 50);
  7. // 2-初始化 pdf输出对象 PdfWriter
  8. PdfWriter.getInstance(document, out);
  9. // 3-打开 Document
  10. document.open();
  11. // 4-往 Document 添加内容
  12. document.add(new Paragraph("Hello! PDF!!!"));
  13. // 5-关闭 Document
  14. document.close();
  15. }
  16. </span>

(二)文档对象:Document、Rectangle、PageSize

1、 Document — PDF对象

1)构造方法:

①、Document(Rectangle pageSize, float marginLeft, float marginRight, float marginTop,

  float marginBottom):分别指pdf页面大小和内容距离文档边的距离。

②、默认 Document()为:A4,36,36,36,36

2)属性:

①、基本属性:版本(PdfVersionImp)、标题(Title)、作者(Author)、主题(Subject)、关键字(Keywords)、创建者(Creator)等等

②、其他属性:页面空白(Margins和marginLeft各个方位)

3)方法:

①、 add()-添加内容,newPage()-下一页, addDocListener-监听器

② 、getPageNumber()-第几页 ,getPageSize-页面大小 ,

top|left|right|bottom-页面预定义位置,置页眉页脚或者页码时有用,内部调用Rectangle的属性

setJavaScript_onLoad(添加js)等等

[java]

  1. // 2-2 横向打印
  2. document = new Document(PageSize.A4.rotate());// 横向打印
  3. document = new Document(tRectangle.rotate());// 横向打印
  4. try {
  5. // 解析器
  6. PdfWriter writer= PdfWriter.getInstance(document, new FileOutputStream("pdf/pdfText.pdf"));
  7. // 3-为pdf添加属性信息
  8. document.addAuthor("作者");
  9. document.addTitle("标题");
  10. document.addSubject("主题");
  11. document.addKeywords("关键字");
  12. //页边空白
  13. document.setMargins(10, 20, 30, 40);
  14. document.open();
  15. // 4-PDF添加内容
  16. document.add(new Paragraph("Hello world"));
  17. // 5-添加Page
  18. document.newPage();
  19. //          writer.setPageEmpty(false);//显示空内容的页
  20. writer.setPageEmpty(true);//不会显示空内容的页
  21. document.newPage();
  22. document.add(new Paragraph("New page"));
  23. logger.debug("PDF创建结束....");

2、 Rectangle— 页面对象

1)构造方法:

 Rectangle(final float llx, final float lly, final float urx, final float ury)

 Rectangle(PageSize.A4) -PageSize  封装常用的 Rectangle 

2)属性

①、NO_BORDER-无边框(单元格),left|top|right|bottom

3)方法

①、rotate()-横向打印

②、setBackgroundColor()-背景色, 

setBorder()-边框, 

setBorderColor()-边框颜色

[java]

// 1-创建一个pdf文档,document

  1. Document document = null;
  2. document = new Document();// 默认PageSize.A4, 36, 36, 36, 36
  3. document = new Document(PageSize.A4);// 等效于上面的
  4. document = new Document(PageSize.A4, 50, 50, 50, 50);// PageSize封装了大量常用的Rectangle数据
  5. // 2-Rectangle(pdf页面)创建Document
  6. // 一般是四个参数表示:左下角的坐标和右上角的坐标
  7. Rectangle tRectangle = null;
  8. tRectangle = PageSize.A4;// PageSize封装了大量常用的Rectangle数据
  9. tRectangle = new Rectangle(800, 600);// 长宽
  10. tRectangle = new Rectangle(0, 0, 800, 600);// 等于上面
  11. // 2-1 其他页面属性:不能和PageSize封装的静态一起使用
  12. tRectangle.setBackgroundColor(BaseColor.BLACK);// 背景色
  13. tRectangle.setBorder(1220);// 边框
  14. tRectangle.setBorderColor(BaseColor.BLUE);
  15. tRectangle.setBorderWidth(244.2f);
  16. document = new Document(tRectangle);</span>

3、综合案例代码:

[java]

  1. <span style="font-family:SimSun;">    /**
  2. * 页面大小,页面背景色,页边空白,Title,Author,Subject,Keywords
  3. *
  4. * @throws DocumentException
  5. */
  6. public void myPDF() throws DocumentException {
  7. // 1- 页面的属性
  8. Rectangle tRectangle = new Rectangle(PageSize.A4); // 页面大小
  9. // tRectangle = new Rectangle(0, 0, 800, 600);
  10. tRectangle.setBackgroundColor(BaseColor.ORANGE); // 页面背景色
  11. tRectangle.setBorder(1220);// 边框
  12. tRectangle.setBorderColor(BaseColor.BLUE);// 边框颜色
  13. tRectangle.setBorderWidth(244.2f);// 边框宽度
  14. Document doc = new Document(tRectangle);// 定义文档
  15. doc = new Document(tRectangle.rotate());// 横向打印
  16. PdfWriter writer = PdfWriter.getInstance(doc, out);// 书写器
  17. // PDF版本(默认1.4)
  18. writer.setPdfVersion(PdfWriter.PDF_VERSION_1_2);
  19. // 2-PDF文档属性
  20. doc.addTitle("Title@sample");// 标题
  21. doc.addAuthor("Author@rensanning");// 作者
  22. doc.addSubject("Subject@iText sample");// 主题
  23. doc.addKeywords("Keywords@iText");// 关键字
  24. doc.addCreator("Creator@iText");// 谁创建的
  25. // 3-综合属性:
  26. doc.setMargins(10, 20, 30, 40);// 页边空白
  27. doc.open();// 打开文档
  28. doc.add(new Paragraph("Hello World"));// 添加内容
  29. // 4-添加下一页
  30. doc.newPage();
  31. writer.setPageEmpty(true);// fasle-显示空内容的页;true-不会显示
  32. doc.newPage();
  33. doc.add(new Paragraph("New page"));
  34. doc.close();
  35. }
  36. </span>

(三)内容对象:

1、中文支持:

1)BaseFont-确认支持中文

2)Font-字体的设置,如颜色,字体,大小等

3)固定用法如下:

[java]

  1. <span style="font-family:SimSun;">    /**
  2. * 支持中文
  3. *
  4. * @return
  5. */
  6. public Font getChineseFont() {
  7. BaseFont bfChinese;
  8. Font fontChinese = null;
  9. try {
  10. bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
  11. // fontChinese = new Font(bfChinese, 12, Font.NORMAL);
  12. fontChinese = new Font(bfChinese, 12, Font.NORMAL, BaseColor.BLUE);
  13. } catch (DocumentException e) {
  14. e.printStackTrace();
  15. } catch (IOException e) {
  16. e.printStackTrace();
  17. }
  18. return fontChinese;
  19. }
  20. }
  21. </span>

2、Element接口

1)内容对象基本都实现这个接口。如Chunk、 Phrase、 Paragraph

2)一些有用的方位参数: 

ALIGN_LEFT, ALIGN_CENTER、 ALIGN_RIGHT, ALIGN_JUSTIFIED 。

如设置居中对齐:setAlignment(Element.ALIGN_CENTER)


3、 Chunk

1)块对象: a String, a Font, and some attributes

2)方法:Chunk.NEWLINE-换行,

setUnderline(0.2f, -2f)- 下划线

setTextRise(6)-上浮

[java]

  1. <span style="font-family:SimSun;">// 1-Chunk块对象: a String, a Font, and some attributes
  2. document.add(new Chunk("中文输出: ", getChineseFont()));
  3. Chunk tChunk2 = new Chunk("输出的内容", getChineseFont());
  4. tChunk2.setBackground(BaseColor.CYAN, 1f, 0.5f, 1f, 1.5f); // 设置背景色
  5. tChunk2.setTextRise(6); // 上浮
  6. tChunk2.setUnderline(0.2f, -2f); // 下划线
  7. document.add(tChunk2);
  8. document.add(Chunk.NEWLINE); // 新建一行
  9. // document.add(new Phrase("Phrase page  :")); //会上浮,不知道原因??</span>

4、 Phrase

1)Phrase短语对象: a List of Chunks with leading

2)方法:add(Element)-添加方法,add(Chunk.NEWLINE)-内部换行

setLeading(14f)-行间距

[java]

  1. <span style="font-family:SimSun;">        // 2-Phrase短语对象: a List of Chunks with leading
  2. document.add(new Phrase("Phrase page  :"));
  3. Phrase tPhrase = new Phrase();
  4. Chunk name = new Chunk("China");
  5. name.setUnderline(0.2f, -2f);
  6. tPhrase.add(name);
  7. tPhrase.add(Chunk.NEWLINE);// 放在容器中好用
  8. tPhrase.add(new Chunk("换行了 :", getChineseFont()));
  9. tPhrase.add(new Chunk("chinese"));
  10. tPhrase.setLeading(14f);// 行间距
  11. document.add(tPhrase);
  12. // 这边就好用,上面是Chunk,就不好用
  13. // 放在段落或短语中又好用
  14. document.add(Chunk.NEWLINE);
  15. Phrase director2 = new Phrase();
  16. Chunk name2 = new Chunk("换行了---Japan", getChineseFont());
  17. name2.setUnderline(0.2f, -2f);
  18. director2.add(name2);
  19. director2.add(new Chunk(","));
  20. director2.add(new Chunk(" "));
  21. director2.add(new Chunk("japanese上浮下", getChineseFont()).setTextRise(3f));
  22. director2.setLeading(24);
  23. document.add(director2);</span>

5、 Paragraph—(新段落另起一行)

1)段落对象: a Phrase with extra properties and a newline

2)方法:

add(Element)-添加; setLeading(20f)-行间距,一个Paragraph只有一个行间距;

setIndentationLeft()-左缩进, setIndentationRight-右缩进, setFirstLineIndent-首行缩进;

setSpacingBefore-设置上空白, setSpacingAfter(10f)-设置段落下空;

setAlignment(Element.ALIGN_CENTER)-居中对齐;

[java]

  1. <span style="font-family:SimSun;">// 3-Paragraph段落对象: a Phrase with extra properties and a newline
  2. document.add(new Paragraph("Paragraph page"));
  3. Paragraph info = new Paragraph();
  4. info.add(new Chunk("China "));
  5. info.add(new Chunk("chinese"));
  6. info.add(Chunk.NEWLINE); // 好用的
  7. info.add(new Phrase("Japan "));
  8. info.add(new Phrase("japanese"));
  9. info.setSpacingAfter(10f);// 设置段落下空白
  10. document.add(info);
  11. // 段落是比较好用的
  12. Paragraph tParagraph = new Paragraph("段落是文章中最基本的单位。内容上它具有一个相对完整的意思;在文章中,段具有换行的标。段是由句子或句群组成的,在文章中用于体现作者的思路发展或全篇文章的层次。有的段落只有一个句子,称为独句段,独句段一般是文章的开头段、结尾段、"
  13. + "过渡段强调段等特殊的段落。多数段落包括不止一个句子或句群,叫多句段。中文段落开头前一般空两个格。", getChineseFont());
  14. tParagraph.setAlignment(Element.ALIGN_JUSTIFIED);// 对齐方式
  15. tParagraph.setIndentationLeft(12);// 左缩进
  16. tParagraph.setIndentationRight(12);// 右缩进
  17. tParagraph.setFirstLineIndent(24);// 首行缩进
  18. tParagraph.setLeading(20f);// 行间距
  19. tParagraph.setSpacingBefore(5f);// 设置上空白
  20. tParagraph.setSpacingAfter(10f);// 设置段落下空白
  21. document.add(tParagraph);
  22. // 每个新的段落会另起一行
  23. tParagraph = new Paragraph("新的段落", getChineseFont());
  24. tParagraph.setAlignment(Element.ALIGN_CENTER);// 居中
  25. document.add(tParagraph);
  26. </span>

综合代码如下:

[java]

  1. <span style="font-family:SimSun;">    /**
  2. * 添加内容 插入Chunk, Phrase, Paragraph, List
  3. *
  4. * @author ShaoMin
  5. * @throws Exception
  6. */
  7. public void addContent() throws Exception {
  8. Document document = new Document(PageSize.A4);
  9. PdfWriter.getInstance(document, out);
  10. document.open();
  11. // 1-Chunk块对象: a String, a Font, and some attributes
  12. document.add(new Chunk("中文输出: ", getChineseFont()));
  13. Chunk tChunk2 = new Chunk("输出的内容", getChineseFont());
  14. tChunk2.setBackground(BaseColor.CYAN, 1f, 0.5f, 1f, 1.5f); // 设置背景色
  15. tChunk2.setTextRise(6); // 上浮
  16. tChunk2.setUnderline(0.2f, -2f); // 下划线
  17. document.add(tChunk2);
  18. document.add(Chunk.NEWLINE); // 新建一行
  19. // document.add(new Phrase("Phrase page  :")); //会上浮,不知道原因??
  20. // 2-Phrase短语对象: a List of Chunks with leading
  21. document.add(new Phrase("Phrase page  :"));
  22. Phrase tPhrase = new Phrase();
  23. Chunk name = new Chunk("China");
  24. name.setUnderline(0.2f, -2f);
  25. tPhrase.add(name);
  26. tPhrase.add(Chunk.NEWLINE);// 放在容器中好用
  27. tPhrase.add(new Chunk("换行了 :", getChineseFont()));
  28. tPhrase.add(new Chunk("chinese"));
  29. tPhrase.setLeading(14f);// 行间距
  30. document.add(tPhrase);
  31. // 这边就好用,上面是Chunk,就不好用
  32. // 放在段落或短语中又好用
  33. document.add(Chunk.NEWLINE);
  34. Phrase director2 = new Phrase();
  35. Chunk name2 = new Chunk("换行了---Japan", getChineseFont());
  36. name2.setUnderline(0.2f, -2f);
  37. director2.add(name2);
  38. director2.add(new Chunk(","));
  39. director2.add(new Chunk(" "));
  40. director2.add(new Chunk("japanese上浮下", getChineseFont()).setTextRise(3f));
  41. director2.setLeading(24);
  42. document.add(director2);
  43. // 3-Paragraph段落对象: a Phrase with extra properties and a newline
  44. document.add(new Paragraph("Paragraph page"));
  45. Paragraph info = new Paragraph();
  46. info.add(new Chunk("China "));
  47. info.add(new Chunk("chinese"));
  48. info.add(Chunk.NEWLINE); // 好用的
  49. info.add(new Phrase("Japan "));
  50. info.add(new Phrase("japanese"));
  51. info.setSpacingAfter(10f);// 设置段落下空白
  52. document.add(info);
  53. // 段落是比较好用的
  54. Paragraph tParagraph = new Paragraph("段落是文章中最基本的单位。内容上它具有一个相对完整的意思;在文章中,段具有换行的标。段是由句子或句群组成的,在文章中用于体现作者的思路发展或全篇文章的层次。有的段落只有一个句子,称为独句段,独句段一般是文章的开头段、结尾段、"
  55. + "过渡段强调段等特殊的段落。多数段落包括不止一个句子或句群,叫多句段。中文段落开头前一般空两个格。", getChineseFont());
  56. tParagraph.setAlignment(Element.ALIGN_JUSTIFIED);// 对齐方式
  57. tParagraph.setIndentationLeft(12);// 左缩进
  58. tParagraph.setIndentationRight(12);// 右缩进
  59. tParagraph.setFirstLineIndent(24);// 首行缩进
  60. tParagraph.setLeading(20f);// 行间距
  61. tParagraph.setSpacingBefore(5f);// 设置上空白
  62. tParagraph.setSpacingAfter(10f);// 设置段落下空白
  63. document.add(tParagraph);
  64. // 每个新的段落会另起一行
  65. tParagraph = new Paragraph("新的段落", getChineseFont());
  66. tParagraph.setAlignment(Element.ALIGN_CENTER);// 居中
  67. document.add(tParagraph);
  68. document.close();
  69. }
  70. </span>

6、Image继承自Rectangle

1)、初始化:Image img = Image.getInstance("source/imag/bage.png")

2)、方法:

setAlignment(Image.LEFT)-对齐方式,setBorder(Image.BOX)-边框,

setBorderWidth(10)-边框宽度,setBorderColor(BaseColor.WHITE)-边框颜色,  

scaleToFit(1000, 72)-大小,setRotationDegrees(-30)-旋转,

setAbsolutePosition()-绝对位置

[java]

<span style="font-family:SimSun;">        // 图片Image对象

  1. Image img = Image.getInstance("source/imag/bage.png");
  2. img.setAlignment(Image.LEFT);
  3. img.setBorder(Image.BOX);
  4. img.setBorderWidth(10);
  5. img.setBorderColor(BaseColor.WHITE);
  6. img.scaleToFit(1000, 72);// 大小
  7. img.setRotationDegrees(-30);// 旋转
  8. document.add(img);</span>

7、Anchor(锚点、超链接) 、Chapter、Section(目录章节)等:

[java]

  1. <span style="font-family:SimSun;">    /**
  2. * 插入Anchor, Image, Chapter, Section
  3. *
  4. * @author ShaoMin
  5. * @throws Exception
  6. *
  7. */
  8. public void insertObject() throws Exception {
  9. Document document = new Document(PageSize.A4);
  10. PdfWriter.getInstance(document, out);
  11. document.open();
  12. // Anchor超链接和锚点对象: internal and external links
  13. Paragraph country = new Paragraph();
  14. Anchor dest = new Anchor("我是锚点,也是超链接", getChineseFont());
  15. dest.setName("CN"); // 设置锚点的名字
  16. dest.setReference("http://www.china.com");// 连接
  17. country.add(dest);
  18. country.add(String.format(": %d sites", 10000));
  19. document.add(country);
  20. Anchor toUS = new Anchor("连接到设置的CN锚点。", getChineseFont());
  21. toUS.setReference("#CN");// 取到锚点
  22. document.add(toUS);
  23. // 图片Image对象
  24. Image img = Image.getInstance("source/imag/bage.png");
  25. img.setAlignment(Image.LEFT);
  26. img.setBorder(Image.BOX);
  27. img.setBorderWidth(10);
  28. img.setBorderColor(BaseColor.WHITE);
  29. img.scaleToFit(1000, 72);// 大小
  30. img.setRotationDegrees(-30);// 旋转
  31. document.add(img);
  32. // Chapter, Section对象(目录对象)
  33. Paragraph title = new Paragraph("一级标题", getChineseFont());
  34. Chapter chapter = new Chapter(title, 1);
  35. Paragraph title2 = new Paragraph("二级标题1", getChineseFont());
  36. Section section = chapter.addSection(title2);
  37. section.setBookmarkTitle("bmk");// 左边目录显示的名字,不写就默认名
  38. section.setIndentation(30);
  39. section.setIndentationLeft(5);
  40. section.setBookmarkOpen(false);
  41. section.setNumberStyle(Section.NUMBERSTYLE_DOTTED_WITHOUT_FINAL_DOT);
  42. Section section2 = chapter.addSection(new Paragraph("二级标题2", getChineseFont()));
  43. section2.setIndentation(30);
  44. section2.setIndentationLeft(5);
  45. section2.setBookmarkOpen(false);
  46. section2.setNumberStyle(Section.NUMBERSTYLE_DOTTED_WITHOUT_FINAL_DOT);
  47. Section subsection = section.addSection(new Paragraph("三级标题1", getChineseFont()));
  48. subsection.setIndentationLeft(10);
  49. // subsection.setNumberDepth(1);
  50. subsection.setNumberStyle(Section.NUMBERSTYLE_DOTTED);
  51. Section subsection2 = section2.addSection(new Paragraph("三级标题2", getChineseFont()));
  52. subsection2.setIndentationLeft(10);
  53. subsection2.setNumberStyle(Section.NUMBERSTYLE_DOTTED);
  54. document.add(chapter);
  55. document.close();
  56. }
  57. </span>

(四)、表格对象:Table、PdfPTable

1、构造方法:

PdfPTable datatable = new PdfPTable(6);//列数

PdfPTable datatable = new PdfPTable(new float[]{1,2,3})-每个单元格宽度

2、结构:

PdfPTable[PdfPTable[PdfPCell[Paragraph]]]

3、方法:

1) setWidths(数组)-单元格宽度, setTotalWidth(300f)-表格的总宽度,

setWidthPercentage(100)-表格的宽度百分比,setLockedWidth(true)-宽度锁定

2) getDefaultCell()-得到默认单元格,addCell()-添加单元格

setPadding(2)-单元格的间隔 ,setBackgroundColor(BaseColor.GREEN)-背景色

3) setSpacingAfter(40f)-设置表格下面空白行, setSpacingBefore(20f)-设置表格上面空白行

new Paragraph(“\n\n”)-可以实现换行,留白

4)setBorderWidth(2)-边框宽度

5)setHorizontalAlignment(Element.ALIGN_CENTER)-对齐方式

6)写入绝对位置:

    PdfContentByte tContent = writer.getDirectContent()-得到层    

    table.writeSelectedRows(0,-1, 0, -1, 100, 200, tContent)-写入绝对位置

[java]

<span style="font-family:SimSun;">    /**

  1. * 插入表格
  2. *
  3. * @author ShaoMin
  4. * @throws Exception
  5. */
  6. public void insertTable() throws Exception {
  7. Document document = new Document(PageSize.A4, 50, 50, 50, 50);
  8. // 使用PDFWriter进行写文件操作
  9. PdfWriter.getInstance(document, out);
  10. document.open();
  11. // 中文字体(现在高版本的不支持中文包)
  12. BaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
  13. Font fontChinese = new Font(bfChinese, 12, Font.NORMAL);// 中文、12、正常
  14. int colNumber = 6;
  15. // PdfPTable[PdfPTable[PdfPCell[Paragraph]]]
  16. // 创建有6列的表格
  17. PdfPTable datatable = new PdfPTable(colNumber);
  18. // 定义表格的宽度
  19. int[] cellsWidth = { 1, 1, 1, 1, 1, 1 };
  20. datatable.setWidths(cellsWidth);// 单元格宽度
  21. // datatable.setTotalWidth(300f);//表格的总宽度
  22. datatable.setWidthPercentage(100);// 表格的宽度百分比
  23. datatable.getDefaultCell().setPadding(2);// 单元格的间隔
  24. datatable.getDefaultCell().setBorderWidth(2);// 边框宽度
  25. // 设置表格的底色
  26. datatable.getDefaultCell().setBackgroundColor(BaseColor.GREEN);
  27. datatable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER);
  28. // PdfPTable[PdfPCell[Paragraph]]
  29. // 添加表头元素
  30. for (int i = 0; i < colNumber; i++) {
  31. datatable.addCell(new Paragraph(tableHeader[i], fontChinese));
  32. }
  33. // 添加表格的内容
  34. for (int i = 0; i < colNumber; i++) {
  35. datatable.addCell(new Paragraph(tableCont[i], fontChinese));
  36. }
  37. // 空白表格
  38. for (int i = 0; i < colNumber; i++) {
  39. PdfPCell cell = new PdfPCell(new Paragraph(""));
  40. cell.setFixedHeight(10);// 单元格高度
  41. datatable.addCell(cell);
  42. }
  43. datatable.setSpacingAfter(40f);// 设置表格下面空白行
  44. document.add(datatable);// 把表格加入文档
  45. // 跨行跨列表格
  46. PdfPTable table = new PdfPTable(3); // 3列表格
  47. PdfPCell cell; // 单元格
  48. cell = new PdfPCell(new Phrase("跨3列", getChineseFont()));
  49. cell.setColspan(3);// 跨3列
  50. table.addCell(cell);
  51. cell = new PdfPCell(new Phrase("跨2行", getChineseFont()));
  52. cell.setRowspan(2);// 跨2行
  53. table.addCell(cell);
  54. table.addCell("row 1; cell 1");
  55. table.addCell("row 1; cell 2");
  56. table.addCell("row 2; cell 1");
  57. table.addCell("row 2; cell 2");
  58. document.add(table);
  59. // 表格的嵌套
  60. PdfPTable tableFather = new PdfPTable(4);
  61. tableFather.setSpacingBefore(20f);// 设置表格上面空白行
  62. // 1行2列
  63. PdfPTable nested1 = new PdfPTable(2);
  64. nested1.addCell("1.1");
  65. nested1.addCell("1.2");
  66. // 2行1列
  67. PdfPTable nested2 = new PdfPTable(1);
  68. nested2.addCell("2.1");
  69. nested2.addCell("2.2");
  70. // 将表格插入到指定位置
  71. for (int k = 0; k < 12; ++k) {
  72. if (k == 1) {
  73. tableFather.addCell(nested1);
  74. } else if (k == 6) {
  75. tableFather.addCell(nested2);
  76. } else {
  77. tableFather.addCell("cell " + k);
  78. }
  79. }
  80. document.add(tableFather);
  81. document.close();
  82. }
  83. </span>

(五)、单元格对象: PdfPCell 

1、构造函数

PdfPCell cell= new PdfPCell(new Paragraph(“表格”, 中文支持)

2、方法

1)setBackgroundColor(BaseColor.CYAN)-背景色

2)setMinimumHeight(30f)-最小高度

setFixedHeight(40f)-固定高度。表格的高度通过单元格高度完成

3)setBorder(Rectangle.NO_BORDER)-无边框,setBorderWidth(0)-无边框。不设,默认是有边框的

setBorderColor(new BaseColor(255, 0, 0))-边框颜色

4)setHorizontalAlignment(Element.ALIGN_CENTER)-水平居中

setVerticalAlignment(Element.ALIGN_MIDDLE)-垂直居中。设置单元格内容的显示

5)setRowspan(2)-跨2行,setColspan(2)-跨2列

[java]

  1. <span style="font-family:SimSun;">    /**
  2. * 插入自定义表格
  3. *
  4. * @author ShaoMin
  5. * @throws Exception
  6. */
  7. public void myTable() throws Exception {
  8. Document document = new Document(PageSize.A4, 50, 50, 50, 50);
  9. PdfWriter writer = PdfWriter.getInstance(document, out);
  10. document.open();
  11. PdfPTable table = new PdfPTable(6);
  12. // 添加表头元素
  13. for (int i = 0; i < 6; i++) {
  14. table.addCell(new Paragraph(tableHeader[i], getChineseFont()));
  15. }
  16. // 添加表格的内容
  17. for (int i = 0; i < 6; i++) {
  18. table.addCell(new Paragraph(tableCont[i], getChineseFont()));
  19. }
  20. table.setSpacingBefore(10f);// 设置表格上面空白宽度
  21. // 1-表格的宽度和布局
  22. table.setHorizontalAlignment(Element.ALIGN_LEFT);// 居左
  23. table.setTotalWidth(369.7f);// 表格的总宽度
  24. table.setWidths(new float[] { 0.1565f, 0.15f, 0.15f, 0.145f, 0.15f, 0.145f });// 单元格宽度
  25. table.setWidthPercentage(100);// 设置表格宽度为%100
  26. // table.setLockedWidth(true);// 宽度锁定,不锁定,下面有变化
  27. document.add(table);
  28. document.add(new Paragraph("\n\n"));
  29. // 居中
  30. table.setHorizontalAlignment(Element.ALIGN_CENTER);
  31. document.add(table);
  32. document.add(new Paragraph("\n\n"));
  33. // 居右
  34. table.setWidthPercentage(50);// 宽度减半
  35. table.setHorizontalAlignment(Element.ALIGN_RIGHT);
  36. document.add(table);
  37. document.add(new Paragraph("\n\n"));
  38. // 固定宽度
  39. table.setTotalWidth(300);
  40. table.setLockedWidth(true);// 锁定宽度
  41. document.add(table);
  42. // 2-表格的边框、高度、设置单元格颜色 、前后距离
  43. PdfPCell cell = new PdfPCell(new Paragraph("合并3个单元格", getChineseFont()));
  44. cell.setColspan(3);
  45. cell.setBackgroundColor(BaseColor.CYAN);
  46. cell.setMinimumHeight(30f);// 最小高度
  47. cell.setFixedHeight(40f);// 固定高度
  48. table.addCell(cell);
  49. // 单元格内文本
  50. Paragraph tParagraph = new Paragraph("居中", getChineseFont());
  51. tParagraph.setAlignment(Element.ALIGN_CENTER);
  52. cell = new PdfPCell(tParagraph);
  53. cell.setBorderColor(new BaseColor(255, 0, 0)); // 边框 ,下面的表格有可能会覆盖
  54. cell.setFixedHeight(45f);// 固定高度,覆盖前面的固定高度
  55. cell.setHorizontalAlignment(Element.ALIGN_CENTER);// 水平居中
  56. cell.setVerticalAlignment(Element.ALIGN_MIDDLE);// 垂直居中
  57. table.addCell(cell);
  58. // 单元格背景色
  59. cell = new PdfPCell(new Paragraph("无边框", getChineseFont()));
  60. cell.setBorder(Rectangle.NO_BORDER);// 无边框
  61. cell.setBorderWidth(0);// 无边框
  62. table.addCell(cell);
  63. // 边框颜色
  64. cell = new PdfPCell(new Paragraph("单元格边框颜色", getChineseFont()));
  65. cell.setBorderColor(BaseColor.YELLOW);
  66. table.addCell(cell);
  67. document.add(new Paragraph("使用'SpacingBefore'和'setSpacingAfter'", getChineseFont()));
  68. table.setSpacingBefore(15f); // 前距离
  69. document.add(table);
  70. table.setSpacingAfter(15f); // 后距离
  71. document.add(table);
  72. // 3-写入文档的绝对位置
  73. // 参数rowStart是你想开始的行的数目,参数rowEnd是你想显示的最后的行(如果你想显示所有的行,用-1),
  74. // xPos和yPos是表格的坐标,canvas是一个PdfContentByte对象。
  75. document.add(new Paragraph(
  76. "写入文档的绝对位置:(writeSelectedRows(rowStart, rowEnd, xPos, yPos, canvas))参数rowStart是你想开始的行的数目,参数rowEnd是你想显示的最后的行(如果你想显示所有的行,用-1),xPos和yPos是表格的坐标,canvas是一个PdfContentByte对象。",
  77. getChineseFont()));
  78. PdfContentByte tContent = writer.getDirectContent();
  79. table.writeSelectedRows(0, -1, 0, -1, 100, 200, tContent);
  80. document.add(new Paragraph("第1行到最后,从0开始计数", getChineseFont()));
  81. table.writeSelectedRows(1, -1, 100, 100, tContent);
  82. document.close();
  83. }
  84. </span>

(六)、PDF结构-4层结构

1、四层结构

2、层对象: PdfContentByte

3、一、四层可操作;二、三层Itext内部处理

4、 操作:

⑴ PdfWriter 对象:

第 1 层操作:PdfWriter. getDirectContent(),

第 2 层操作:getDirectContentUnder()。

⑵ PdfStamper 对象

第 1 层操作: PdfStamper. getUnderContent(1),-可以加页数

第 2 层操作: PdfStamper .getOverContent(1)。

5、作用:添加水印、背景、添加内容到绝对位置、合并PDF


(六)、添加水印

1、方法:

PdfContentByte under = writer.getDirectContentUnder();//默认当前页

PdfContentByte under = stamp.getUnderContent(1);// 拿到层,可以有页数

2、文本水印

1)beginText():开始,endText()结束。

2)showTextAligned()写入文档,这个方法有很多重载,可以添加方位,旋转等。

[java]

  1. <span style="font-family:SimSun;">    /**
  2. * 添加水印
  3. *
  4. * @author ShaoMin
  5. * @throws Exception
  6. *
  7. */
  8. public void addShuyinByWriter() throws Exception {
  9. Document document = new Document(PageSize.A4);
  10. PdfWriter writer = PdfWriter.getInstance(document, out);
  11. document.open();
  12. /*
  13. * PDF分为四层,第一层和第四层由低级操作来进行操作,第二层、第三层由高级对象操作(从下往上)
  14. * 第一层操作只能使用PdfWriter.DirectContent操作,第四层使用DirectContentUnder操作,。
  15. * 第二层和第三层的PdfContentByte是由IText内部操作,没有提供api接口。
  16. */
  17. PdfContentByte under = writer.getDirectContentUnder();
  18. // under = writer.getDirectContent();
  19. under.beginText();
  20. BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.EMBEDDED);
  21. under.setFontAndSize(bf, 18);
  22. // under.setTextMatrix(30, 30);
  23. under.showTextAligned(Element.ALIGN_LEFT, "ShuiYin................", 230, 430, 45);
  24. under.endText();
  25. document.close();
  26. }
  27. </span>

3、图片水印与背景 

1)添加水印:

2)水印与背景的区别:背景只需要把绝对置为从 文档左下角开始。 即设置setAbsolutePosition(0, 0)

3)位置的定位:理解页面对象——Rectangle

Rectangle  tRectangle = new Rectangle(0, 0, 800, 600);

[java]

  1. <span style="font-family:SimSun;">    /**
  2. * 添加水印
  3. *
  4. * @author ShaoMin
  5. * @throws IOException
  6. *
  7. */
  8. public void addShuiYinByTempete() throws Exception {
  9. // 读取器
  10. PdfReader reader = new PdfReader(templetePdf);
  11. // 解析器与输出
  12. PdfStamper stamp = new PdfStamper(reader, out);
  13. // 图片水印
  14. Image img = Image.getInstance("source/imag/bage.png");
  15. img.setAbsolutePosition(100, 100);// 位置
  16. PdfContentByte under = stamp.getUnderContent(1);// 拿到层,页数
  17. under.addImage(img);
  18. // 文字水印
  19. PdfContentByte over = stamp.getOverContent(1);// 拿到层,字显示在图片上
  20. over.beginText();
  21. BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.EMBEDDED);
  22. over.setFontAndSize(bf, 18);
  23. over.setTextMatrix(30, 30);
  24. over.showTextAligned(Element.ALIGN_LEFT, "ShuiYin", 230, 430, 45);
  25. over.endText();
  26. // 背景图
  27. Image img2 = Image.getInstance("resource/test.jpg");
  28. img2.setAbsolutePosition(0, 0);
  29. PdfContentByte under2 = stamp.getUnderContent(3);
  30. under2.addImage(img2);
  31. // 关闭
  32. stamp.close();
  33. reader.close();
  34. }
  35. </span>

(七)、添加头尾注和页码等

1、需要使用监听器,类似于Sax解析Xml:

1)PdfWriter. setPageEvent(PdfPageEvent event) -  PdfPageEven接口

2)PdfPageEventHelper类实现了PdfPageEven接口。我们自定义只要实现PdfPageEventHelper即可,随意重

写需要的方法即可。

2、重写的方法:

onOpenDocument(PdfWriter writer, Document document)

onEndPage(PdfWriter writer, Document document)等等

3、添加头尾注和页码:——添加文本到绝对位置  

[java]

  1. <span style="font-family:SimSun;">    /**
  2. * 插入页眉页脚,需要使用监听器
  3. *
  4. * @author ShaoMin
  5. * @throws Exception
  6. *
  7. */
  8. public void insertHeadAndFoot() throws Exception {
  9. Document doc = new Document();
  10. PdfWriter writer = PdfWriter.getInstance(doc, out);
  11. // 内部类,处理器
  12. writer.setPageEvent(new PdfPageHelper());
  13. doc.open();
  14. doc.add(new Paragraph("1 page"));
  15. doc.newPage();
  16. doc.add(new Paragraph("2 page"));
  17. doc.close();
  18. }
  19. </span>
  1. <span style="font-family:SimSun;">/**
  2. *
  3. * @Title: 内部类
  4. * @Description:
  5. * @Copyright: Copyright (c) 2014
  6. * @Company: SinoSoft
  7. *
  8. * @author: ShaoMin
  9. * @version: 1.0
  10. * @CreateDate:Nov 4, 2014
  11. */
  12. class PdfPageHelper extends PdfPageEventHelper {
  13. @Override
  14. public void onEndPage(PdfWriter writer, Document document) {
  15. PdfContentByte cb = writer.getDirectContent();// 得到层
  16. cb.saveState();
  17. // 开始
  18. cb.beginText();
  19. cb.setFontAndSize(getBaseFont(), 10);
  20. // Header
  21. float x = document.top(-20);// 位置
  22. // 左
  23. cb.showTextAligned(PdfContentByte.ALIGN_LEFT, "H-Left", document.left(), x, 0);
  24. // 中
  25. cb.showTextAligned(PdfContentByte.ALIGN_CENTER, "第" + writer.getPageNumber() + "页", (document.right() + document.left()) / 2, x, 0);
  26. // 右
  27. cb.showTextAligned(PdfContentByte.ALIGN_RIGHT, "H-Right", document.right(), x, 0);
  28. // Footer
  29. float y = document.bottom(-20);
  30. // 左
  31. cb.showTextAligned(PdfContentByte.ALIGN_LEFT, "F-Left", document.left(), y, 0);
  32. // 中
  33. cb.showTextAligned(PdfContentByte.ALIGN_CENTER, "第" + writer.getPageNumber() + "页", (document.right() + document.left()) / 2, y, 0);
  34. // 右
  35. cb.showTextAligned(PdfContentByte.ALIGN_RIGHT, "F-Right", document.right(), y, 0);
  36. cb.endText();
  37. cb.restoreState();
  38. }
  39. </span>

(八)、读取PDF即模板的使用

1、使用Adobe Acrobat 制作PDF模板(可以用word先编辑,另存为PDF格式)

1)文本域:工具-内容编辑-编辑文本域图像(自动会选中)

2)表单域:工具-表单-编辑-编辑-添加新域(或者编辑域)

3)编辑表单域可以设置一个name,如 ConNo;也可以设置显示的字体、大小、对齐方式等等。

2、涉及的核心类:PdfReader,PdfStamper

3、实现:

1)读取PDF文档( PdfReader )->交给解析器( PdfStamper )

  1. <span style="font-family:SimSun;">        // 1-模板和生成的pdf
  2. String tPdfTemplateFile = "source/pdf/templete/EdorTemplete.pdf";// 获取模板路径
  3. String tPdfResultFile = "temp/pdf/Edor_" + new Random().nextInt() + ".pdf";// 生成的文件路径
  4. // 2-解析PDF模板
  5. FileOutputStream fos = new FileOutputStream(tPdfResultFile);// 需要生成PDF
  6. PdfReader reader = new PdfReader(tPdfTemplateFile);// 模板
  7. PdfStamper mPdfStamper = new PdfStamper(reader, fos);// 解析</span>

2)获取保单域( AcroFields )->获取所有的表单域数据(Map)

  1. <span style="font-family:SimSun;">        // 3-获取到模板上预定义的参数域
  2. AcroFields form = mPdfStamper.getAcroFields();
  3. // 获取模板中定义的变量
  4. Map<String, Item> acroFieldMap = form.getFields();
  5. </span>

3)处理:循环Map,拿到key(即表单域的name),给表单域赋值即可。

AcroFields .setField(fieldName, fieldValue);

4)关闭PdfReader, PdfStamper

  1. <span style="font-family:SimSun;">   // 循环解析模板定义的表单域
  2. int len = 4;
  3. for (Map.Entry<String, Item> entry : acroFieldMap.entrySet()) {
  4. // 获得块名
  5. String fieldName = entry.getKey();
  6. String fieldValue = "fill_" + len;
  7. System.out.println(fieldName + ":" + fieldValue);
  8. form.setField(fieldName, fieldValue);
  9. len++;
  10. }
  11. // 模板中的变量赋值之后不能编辑
  12. mPdfStamper.setFormFlattening(true);
  13. reader.close();// 阅读器关闭,解析器暂时不关闭,因为创建动态表格还需要使用
  14. mPdfStamper.close();</span>

5、完整代码如下:模板为上面截图模板

  1. <span style="font-family:SimSun;">package pdf.templete;
  2. import java.io.FileOutputStream;
  3. import java.util.HashMap;
  4. import java.util.Map;
  5. import java.util.Random;
  6. import com.itextpdf.text.pdf.AcroFields;
  7. import com.itextpdf.text.pdf.AcroFields.Item;
  8. import com.itextpdf.text.pdf.PdfReader;
  9. import com.itextpdf.text.pdf.PdfStamper;
  10. /**
  11. *
  12. * @Title: 利用PDF模板
  13. * @Description:
  14. * @Copyright: Copyright (c) 2014
  15. * @Company: SinoSoft
  16. *
  17. * @author: ShaoMin
  18. * @version: 1.0
  19. * @CreateDate:Nov 4, 2014
  20. */
  21. public class PdfTempleteWithIText {
  22. /**
  23. * @author ShaoMin
  24. * @param args
  25. */
  26. public static void main(String[] args) {
  27. PdfTempleteWithIText pdfTemplete = new PdfTempleteWithIText();
  28. try {
  29. // 1-给PDF表单域赋值
  30. pdfTemplete.fillFormDatas();
  31. // 2-给PDF表格赋值
  32. pdfTemplete.fillTableDatas();
  33. } catch (Exception e) {
  34. e.printStackTrace();
  35. }
  36. }
  37. /**
  38. * 获取模板表单,并赋值 固定用法
  39. *
  40. * @author ShaoMin
  41. * @throws Exception
  42. */
  43. public void fillFormDatas() throws Exception {
  44. // 1-封装的数据,这边的key与pdf模板的域名保持一致
  45. Map<String, String> mMapDatas = new HashMap<String, String>();
  46. mMapDatas.put("CustomerName", "SAM-SHO");// 客户姓名
  47. mMapDatas.put("ContNo", "123456789098765");// 合同号
  48. mMapDatas.put("ContCount", "1");// 保单个数
  49. mMapDatas.put("EdorType", "CT-退保");// 保全类型
  50. mMapDatas.put("GetMoney", "999.99");// 保全失算金额
  51. mMapDatas.put("AcceptName", "人寿保险");// 受理人
  52. mMapDatas.put("AcceptDate", "2014-11-1");// 受理日期
  53. // 2-模板和生成的pdf
  54. Random a = new Random();
  55. a.nextInt();
  56. String tPdfTemplateFile = "source/pdf/templete/EdorTemplete.pdf";// 获取模板路径
  57. String tPdfResultFile = "temp/pdf/Edor_" + a.nextInt() + ".pdf";// 生成的文件路径
  58. // 3-解析PDF模板
  59. FileOutputStream fos = new FileOutputStream(tPdfResultFile);// 需要生成PDF
  60. PdfReader reader = new PdfReader(tPdfTemplateFile);// 模板
  61. PdfStamper mPdfStamper = new PdfStamper(reader, fos);// 解析
  62. // 4-获取到模板上预定义的参数域
  63. AcroFields form = mPdfStamper.getAcroFields();
  64. // 获取模板中定义的变量
  65. Map<String, Item> acroFieldMap = form.getFields();
  66. // 循环解析模板定义的表单域
  67. for (Map.Entry<String, Item> entry : acroFieldMap.entrySet()) {
  68. // 获得块名
  69. String fieldName = entry.getKey();
  70. String fieldValue = mMapDatas.get(fieldName);// 通过名字,获取传入的参数值
  71. if (!"".equals(fieldValue)) {
  72. // 为模板中的变量赋值(key与pdf模板定义的域名一致)
  73. form.setField(fieldName, fieldValue);
  74. System.out.println(fieldName + "," + fieldValue);
  75. }
  76. }
  77. // 模板中的变量赋值之后不能编辑
  78. mPdfStamper.setFormFlattening(true);
  79. reader.close();// 阅读器关闭,解析器暂时不关闭,因为创建动态表格还需要使用
  80. mPdfStamper.close();
  81. }
  82. /**
  83. * 给PDF表格赋值 值动态的,一般建议使用模板, 直接创建绝对位置的表格
  84. *
  85. * @author ShaoMin
  86. * @throws Exception
  87. */
  88. public void fillTableDatas() throws Exception {
  89. // 1-模板和生成的pdf
  90. String tPdfTemplateFile = "source/pdf/templete/EdorTemplete.pdf";// 获取模板路径
  91. String tPdfResultFile = "temp/pdf/Edor_" + new Random().nextInt() + ".pdf";// 生成的文件路径
  92. // 2-解析PDF模板
  93. FileOutputStream fos = new FileOutputStream(tPdfResultFile);// 需要生成PDF
  94. PdfReader reader = new PdfReader(tPdfTemplateFile);// 模板
  95. PdfStamper mPdfStamper = new PdfStamper(reader, fos);// 解析
  96. // 3-获取到模板上预定义的参数域
  97. AcroFields form = mPdfStamper.getAcroFields();
  98. // 获取模板中定义的变量
  99. Map<String, Item> acroFieldMap = form.getFields();
  100. // 循环解析模板定义的表单域
  101. int len = 4;
  102. for (Map.Entry<String, Item> entry : acroFieldMap.entrySet()) {
  103. // 获得块名
  104. String fieldName = entry.getKey();
  105. String fieldValue = "fill_" + len;
  106. System.out.println(fieldName + ":" + fieldValue);
  107. form.setField(fieldName, fieldValue);
  108. len++;
  109. }
  110. // 模板中的变量赋值之后不能编辑
  111. mPdfStamper.setFormFlattening(true);
  112. reader.close();// 阅读器关闭,解析器暂时不关闭,因为创建动态表格还需要使用
  113. mPdfStamper.close();
  114. }
  115. }</span>

(九)、合并PDF-——核心是合并旧的,生成新的PDF

1、涉及的核心类:PdfReader,PdfCopy(PdfWriter的子类)

2、实现:2次循环

1)第一层循环:PDF合并的文件个数,有几个PDF需要合并。

①、每一个pdf文件都使用PdfReader获取:PdfReader reader = new PdfReader(files[i]);

② 、reader.getNumberOfPages()获取一个PDF有多少页

2)第二层循环:一个PDF文件的页数,一个PDF有几页

①、每一页都放入PdfCopy即可

   PdfImportedPage page = copy.getImportedPage(reader, 第几页);

   copy.addPage(page);

3、代码如下:

1)使用PdfCopy:

  1. <span style="font-family:SimSun;">    /**
  2. * PDF文件合并 使用PdfCopy
  3. *
  4. * @author
  5. * @param files
  6. * @param os
  7. */
  8. public boolean mergePdfFiles(String[] files, String newfile) {
  9. boolean retValue = false;
  10. Document document = null;
  11. try {
  12. document = new Document();
  13. PdfCopy copy = new PdfCopy(document, new FileOutputStream(newfile));
  14. document.open();
  15. for (int i = 0; i < files.length; i++) {// 几个pdf文件循环
  16. PdfReader reader = new PdfReader(files[i]);
  17. int n = reader.getNumberOfPages();
  18. for (int j = 1; j <= n; j++) {// 一个文件有多少页循环
  19. document.newPage();
  20. PdfImportedPage page = copy.getImportedPage(reader, j);
  21. copy.addPage(page);
  22. }
  23. }
  24. retValue = true;
  25. } catch (Exception e) {
  26. e.printStackTrace();
  27. } finally {
  28. document.close();
  29. }
  30. return retValue;
  31. }
  32. </span>

2)使用PdfWriter实现PDF合并

  1. <span style="font-family:SimSun;">    /**
  2. * 合并PDF
  3. *
  4. * @author ShaoMin
  5. * @throws Exception
  6. *
  7. */
  8. public void mergePdf() throws Exception {
  9. String[] files = { "source/pdf/1.pdf", "source/pdf/2.pdf" };
  10. String savepath = "source/pdf/mergePdf.pdf";
  11. Document document = new Document();
  12. PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(savepath));
  13. // PdfCopy copy = new PdfCopy(document, new
  14. // FileOutputStream(newfile));//使用copy
  15. document.open();
  16. PdfContentByte cb = writer.getDirectContent();// 得到层
  17. for (int i = 0; i < files.length; i++) {
  18. PdfReader reader = new PdfReader(files[i]);
  19. int n = reader.getNumberOfPages();
  20. for (int j = 1; j <= n; j++) {
  21. document.newPage();
  22. // PdfImportedPage page = copy.getImportedPage(reader, j);
  23. // copy.addPage(page);
  24. PdfImportedPage page = writer.getImportedPage(reader, j);
  25. cb.addTemplate(page, 0, 0);// 使用writer需要使用pdf的层,然后后添加
  26. }
  27. }
  28. document.close();
  29. // 使用PdfCopy 实现Pdf合并
  30. //      mergePdfFiles(files, savepath);
  31. }
  32. </span>

(十)、删除pdf页

1、思路:读取pdf文档,然后页码,然后输出到新的PDF

2、实现:

  1. <span style="font-family:SimSun;">    /**
  2. * 删除页
  3. *
  4. * @author ShaoMin
  5. * @throws Exception
  6. *
  7. */
  8. public void deletePage() throws Exception {
  9. //      Document document = new Document();
  10. //      PdfWriter.getInstance(document, out);
  11. //      document.open();
  12. //      document.add(new Paragraph("First page"));
  13. //      document.add(new Paragraph(Document.getVersion()));
  14. //      document.newPage();
  15. //      document.add(new Paragraph("New page1"));
  16. //      document.newPage();
  17. //      document.add(new Paragraph("New page2"));
  18. //      document.close();
  19. // 删除的方法在于读取,然后选择页数,然后在输出到另一个pdf
  20. PdfReader reader = new PdfReader("deletePage.pdf");// 读取pdf
  21. reader.selectPages("1,3");// 选择页数
  22. PdfStamper stamp = new PdfStamper(reader, out);// 输出
  23. stamp.close();
  24. reader.close();
  25. }
  26. </span>

【PDF】java使用Itext生成pdf文档--详解相关推荐

  1. Java使用freemarker生成word文档并转pdf文档

    Java使用freemarker生成word文档后转pdf 先来看看效果图 进入正题 项目需求: 为订单后生成对应的pdf文档,文档内包含图片. 方案一:使用freemarker和itext把html ...

  2. Java使用itext生成Pdf

    Java使用itext生成Pdf 背景 所需依赖 解决jpedal-lgpl jar包问题 示例代码 生成带图片的PDF(使用本地文件系统图片) 生成带图片的PDF(使用网络图片) 背景 在某些业务场 ...

  3. java 生成字体文件,java使用itext生成pdf文件-设置字体,itextpdf,import com.l

    java使用itext生成pdf文件-设置字体,itextpdf,import com.limport com.lowagie.text.Document;import com.lowagie.tex ...

  4. 通过Java组件iText生成PDF报表或合同,完成pdf上传,预览,存入数据库

    因业务需要,做了一个通过Java组件iText生成PDF合同,运行成功了,做个记录,也分享给大家. 首先,我们需要准备好一个有文本域的pdf文件. 1.先用word做出你需要的模板,并保存. 2.通过 ...

  5. JSP学习笔记(四十九):抛弃POI,使用iText生成Word文档

    POI操作excel的确很优秀,操作word的功能却不敢令人恭维.我们可以利用iText生成rtf文档,扩展名使用doc即可. 使用iText生成rtf,除了iText的包外,还需要额外的一个支持rt ...

  6. Java使用poi-tl生成word文档

    Java使用poi-tl生成word文档,可以对模板文件进行文本替换,图片.表格.超链接添加.图表处理等.大概的说明都在代码注释里,只有一个地方需要注意,就是图表的替换,占位符{{barChart}} ...

  7. 英集芯ip6809规格书pdf芯片文档详解及典型电路原理图

    英集芯ip6809芯片是一款无线充电发送端控制器SOC芯片,兼容WPC Qi v1.2.4新标准.支持2-3线圈无线充电发射端应用,支持A28线圈.MP-A8线圈,支持客户线圈定制方案,支持5W.苹果 ...

  8. java使用iText生成pdf文档的对齐方式

    一.前言 在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表的Java组件--iText.通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超级连接显示或 ...

  9. Java:iText生成pdf文档

    依赖 <!-- pdf:start --> <dependency><groupId>com.itextpdf</groupId><artifac ...

最新文章

  1. domino大百科常见问题总汇1(转载)
  2. Third Week :Linux下的C语言
  3. CSS3属性之圆角效果——border-radius属性
  4. 自定义验证规则ValidationAttribute的使用
  5. 计算机网络基石 —— 集线器
  6. 理论物理考研攻略!!!
  7. 通信电子线路实验-调幅模块仿真(发送与接收)
  8. CCNA(三)-路由器
  9. Delphi2010及注册码下载地址
  10. 基于uniapp的QQ小程序开发(前端篇)
  11. linux内存测试工具memtest,Linux基础教程:内存测试工具(Memtest86+)
  12. Spring乱码问题解决
  13. PCL-ICP(IterativeClosestPoint)源码解析
  14. BYD精制项目除铜工艺去除铜离子
  15. 【推荐系统】协同过滤
  16. 关于torch.bmm()函数计算过程
  17. Linux关于网络通信的命令
  18. UE4导入PMX模型记录
  19. 海思3559万能平台搭建:OSD实时叠加的支持1SDL库 FREETYPE库 SDL_TTF库的移植
  20. 2020年黑五软件折扣!最值得买的工作学习APP清单

热门文章

  1. android禁止弹出保存此图片,安卓手机相册总是出现陌生图片?教你彻底清除!...
  2. Es7.x使用RestHighLevelClient进行聚合操作
  3. QNX系列:一、进程和线程
  4. 罗大佑的童年用计算机咋弹,罗大佑《童年》吉他弹奏教学-520吉他网
  5. iOS直播APP流程和相关技术介绍
  6. mysql database alias_mysql小结——基础篇
  7. STM32+LCD实现简单的贪吃蛇小游戏
  8. 同步时序逻辑电路分析——数电第六章学习
  9. win10锁屏c语言,Win10秘笈:如何在锁屏打开任意应用程序?
  10. win10 锁屏时间无法设置 解决方法