【PDF】java使用Itext生成pdf文档--详解

时间:2022-09-27 22:37:22
【API接口】【PDF】java使用Itext生成pdf文档--详解 


一、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] view plaincopy
  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] view plaincopy
  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] view plaincopy
// 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>

);// 边框
  • tRectangle.setBorderColor(BaseColor.BLUE);// 边框颜色
  • tRectangle.setBorderWidth(244.2f);// 边框宽度
  • Document doc = new Document(tRectangle);// 定义文档
  • doc = new Document(tRectangle.rotate());// 横向打印
  • PdfWriter writer = PdfWriter.getInstance(doc, out);// 书写器
  • // PDF版本(默认1.4)
  • writer.setPdfVersion(PdfWriter.PDF_VERSION_1_2);
  • // 2-PDF文档属性
  • doc.addTitle("Title@sample");// 标题
  • doc.addAuthor("Author@rensanning");// 作者
  • doc.addSubject("Subject@iText sample");// 主题
  • doc.addKeywords("Keywords@iText");// 关键字
  • doc.addCreator("Creator@iText");// 谁创建的
  • // 3-综合属性:
  • doc.setMargins(10, 20, 30, 40);// 页边空白
  • doc.open();// 打开文档
  • doc.add(new Paragraph("Hello World"));// 添加内容
  • // 4-添加下一页
  • doc.newPage();
  • writer.setPageEmpty(true);// fasle-显示空内容的页;true-不会显示
  • doc.newPage();
  • doc.add(new Paragraph("New page"));
  • doc.close();
  • }
  • </span>

  • (三)内容对象:

    1、中文支持:

    1)BaseFont-确认支持中文

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

    3)固定用法如下:

    [java] view plaic
    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)

    【PDF】java使用Itext生成pdf文档--详解


    3、 Chunk

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

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

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

    setTextRise(6)-上浮

    [java] view plaincop
    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] view plaincopy
    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] view plaincopy
    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>

    .5f, 1f, 1.5f); // 设置背景色
  • tChunk2.setTextRise(6); // 上浮
  • tChunk2.setUnderline(0.2f, -2f); // 下划线
  • document.add(tChunk2);
  • document.add(Chunk.NEWLINE); // 新建一行
  • // document.add(new Phrase("Phrase page  :")); //会上浮,不知道原因??
  • // 2-Phrase短语对象: a List of Chunks with leading
  • document.add(new Phrase("Phrase page  :"));
  • Phrase tPhrase = new Phrase();
  • Chunk name = new Chunk("China");
  • name.setUnderline(0.2f, -2f);
  • tPhrase.add(name);
  • tPhrase.add(Chunk.NEWLINE);// 放在容器中好用
  • tPhrase.add(new Chunk("换行了 :", getChineseFont()));
  • tPhrase.add(new Chunk("chinese"));
  • tPhrase.setLeading(14f);// 行间距
  • document.add(tPhrase);
  • // 这边就好用,上面是Chunk,就不好用
  • // 放在段落或短语中又好用
  • document.add(Chunk.NEWLINE);
  • Phrase director2 = new Phrase();
  • Chunk name2 = new Chunk("换行了---Japan", getChineseFont());
  • name2.setUnderline(0.2f, -2f);
  • director2.add(name2);
  • director2.add(new Chunk(","));
  • director2.add(new Chunk(" "));
  • director2.add(new Chunk("japanese上浮下", getChineseFont()).setTextRise(3f));
  • director2.setLeading(24);
  • document.add(director2);
  • // 3-Paragraph段落对象: a Phrase with extra properties and a newline
  • document.add(new Paragraph("Paragraph page"));
  • Paragraph info = new Paragraph();
  • info.add(new Chunk("China "));
  • info.add(new Chunk("chinese"));
  • info.add(Chunk.NEWLINE); // 好用的
  • info.add(new Phrase("Japan "));
  • info.add(new Phrase("japanese"));
  • info.setSpacingAfter(10f);// 设置段落下空白
  • document.add(info);
  • // 段落是比较好用的
  • Paragraph tParagraph = new Paragraph("段落是文章中最基本的单位。内容上它具有一个相对完整的意思;在文章中,段具有换行的标。段是由句子或句群组成的,在文章中用于体现作者的思路发展或全篇文章的层次。有的段落只有一个句子,称为独句段,独句段一般是文章的开头段、结尾段、"
  • + "过渡段强调段等特殊的段落。多数段落包括不止一个句子或句群,叫多句段。中文段落开头前一般空两个格。", getChineseFont());
  • tParagraph.setAlignment(Element.ALIGN_JUSTIFIED);// 对齐方式
  • tParagraph.setIndentationLeft(12);// 左缩进
  • tParagraph.setIndentationRight(12);// 右缩进
  • tParagraph.setFirstLineIndent(24);// 首行缩进
  • tParagraph.setLeading(20f);// 行间距
  • tParagraph.setSpacingBefore(5f);// 设置上空白
  • tParagraph.setSpacingAfter(10f);// 设置段落下空白
  • document.add(tParagraph);
  • // 每个新的段落会另起一行
  • tParagraph = new Paragraph("新的段落", getChineseFont());
  • tParagraph.setAlignment(Element.ALIGN_CENTER);// 居中
  • document.add(tParagraph);
  • document.close();
  • }
  • </span>