OpenPDF的学习文档(第五章·页眉页脚、段落、纸张相关)

纸张相关

  • 纸张大小
    • PageSize
    • 除了常见的A4,从A0到A10,B0到B10,还有各种各样的纸张大小。
    • Document document = new Document(PageSize.A4);
      
  • 页边距
    • // 一定要先设置页边距,再newPage
      72 = 磅数
      document.setMargins(72, 72, 72, 72);
      document.newPage();
      
  • 纸张旋转
    • // 将A4纸张旋转
      // 先旋转,再newPage
      document.setPageSize(PageSize.A4.rotate());
      document.newPage();
      

页码

  • PdfPageLabels
  • PdfPageLabels pageLabels = new PdfPageLabels();
    
    // page = 物理页的起始页码,numberStyle = 编号风格, text = 编号前缀,firstPage = 逻辑页的起始页码
    // addPageLabel(int page, int numberStyle, String text, int firstPage);
    // 第1、2页 使用Cover作为页码
    pageLabels.addPageLabel(1, PdfPageLabels.EMPTY, "Cover");
    // 第3、4页 使用大写罗马字母
    pageLabels.addPageLabel(3, PdfPageLabels.UPPERCASE_ROMAN_NUMERALS);
    // 第5、6页 使用小写罗马字母
    pageLabels.addPageLabel(5, PdfPageLabels.LOWERCASE_ROMAN_NUMERALS);
    // 第7、8页 使用数字
    pageLabels.addPageLabel(7, PdfPageLabels.DECIMAL_ARABIC_NUMERALS);
    // 第9、10页 使用大写英文字母,当26个字母用完后,使用AA,AB。以此类推。
    pageLabels.addPageLabel(9, PdfPageLabels.UPPERCASE_LETTERS);
    // 第11页及以后页 使用小写英文字母,当26个字母用完后,使用aa,ab。以此类推。
    pageLabels.addPageLabel(11, PdfPageLabels.LOWERCASE_LETTERS);
    
    // 将页码规则写入 Writer
    writer.setPageLabels(pageLabels);
    
  • 注意: 这个规则是给PDF阅读器看到,不是直接印在PDF的纸张中!

页眉页脚

  • HeaderFooter
    • // 创建页眉
      HeaderFooter header = new HeaderFooter(new Phrase("我是页眉:这是第", FontUtils.scFont_10), new Phrase("页", FontUtils.scFont_10));
      // 设置页眉为 居中对齐
      header.setAlignment(Element.ALIGN_CENTER);
      // 创建页脚
      HeaderFooter footer = new HeaderFooter(new Phrase("我是页脚:这是第", FontUtils.scFont_10), new Phrase("页", FontUtils.scFont_10));
      // 设置页脚为 右对齐
      footer.setAlignment(Element.ALIGN_RIGHT);
      document.setHeader(header);
      document.setFooter(footer);
      
    • 严重警告:上述代码必须在document.open();之前执行!
    • image
    • image
    • image
    • 如果认为这个页眉页脚不好看,可以继承HeaderFooter类,重写方法。
  • 自定义继承PdfPageEventHelper
    • 这个很难,很绕。先展示代码。
    • public class HeaderAndFooter extends PdfPageEventHelper {
          public static void main(String[] args) throws DocumentException, FileNotFoundException {
      
              Document document = new Document(PageSize.A4, 36, 36, 65, 36);
              PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("C:/tmp/HeaderAndFooter.pdf"));
      
              // 关键点:设置 PDF 的页面事件
              writer.setPageEvent(new HeaderAndFooter());
              document.open();
      
              Paragraph pageBody = new Paragraph("Page content.");
              pageBody.setAlignment(Element.ALIGN_CENTER);
              for (int i = 0; i < 5; i++) {
                  document.add(pageBody);
                  document.newPage();
              }
      
              document.close();
              writer.close();
          }
      
          /**
           * 页面已经创建好,但是未写入正文时:
           */
          @Override
          public void onStartPage(PdfWriter writer, Document document) {
      
              PdfPTable table = new PdfPTable(3);
              table.setTotalWidth(510);
              table.setWidths(new int[]{38, 36, 36});
              table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER);
              table.getDefaultCell().setPaddingBottom(5);
              table.getDefaultCell().setBorder(Rectangle.BOTTOM);
      
              PdfPCell emptyCell = new PdfPCell(new Paragraph(""));
              emptyCell.setBorder(Rectangle.NO_BORDER);
      
              table.addCell(emptyCell);
              Paragraph title =  new Paragraph("Header", new Font(Font.COURIER, 20, Font.BOLD));
              PdfPCell titleCell = new PdfPCell(title);
              titleCell.setPaddingBottom(10);
              titleCell.setHorizontalAlignment(Element.ALIGN_CENTER);
              titleCell.setBorder(Rectangle.NO_BORDER);
              table.addCell(titleCell);
              table.addCell(emptyCell);
      
              Font cellFont = new Font(Font.HELVETICA, 8);
              table.addCell(new Paragraph("Phone Number: 888-999-0000", cellFont));
              table.addCell(new Paragraph("Address : 333, Manhattan, New York", cellFont));
              table.addCell(new Paragraph("Website : http://grogu-yoda.com", cellFont));
      
              table.writeSelectedRows(0, -1, 34, 828, writer.getDirectContent());
          }
      
          /**
           * 页面结束时:
           */
          @Override
          public void onEndPage(PdfWriter writer, Document document) {
      
              // step 3: create a footer
              PdfPTable table = new PdfPTable(2);
              table.setTotalWidth(510);
              table.setWidths(new int[]{50, 50});
              table.getDefaultCell().setPaddingBottom(5);
              table.getDefaultCell().setBorder(Rectangle.TOP);
      
              Paragraph title =  new Paragraph("Footer", new Font(Font.HELVETICA, 10));
              PdfPCell titleCell = new PdfPCell(title);
              titleCell.setPaddingTop(4);
              titleCell.setHorizontalAlignment(Element.ALIGN_LEFT);
              titleCell.setBorder(Rectangle.TOP);
              table.addCell(titleCell);
      
              Paragraph pageNumberText =  new Paragraph("Page " + document.getPageNumber(), new Font(Font.HELVETICA, 10));
              PdfPCell pageNumberCell = new PdfPCell(pageNumberText);
              pageNumberCell.setPaddingTop(4);
              pageNumberCell.setHorizontalAlignment(Element.ALIGN_RIGHT);
              pageNumberCell.setBorder(Rectangle.TOP);
              table.addCell(pageNumberCell);
      
              table.writeSelectedRows(0, -1, 34, 36, writer.getDirectContent());
          }
      }
      
    • 首先继承PdfPageEventHelper类;实现onStartPage()onEndPage()两个方法。
    • 调用逻辑
      • 首先创建new Document()
      • 绑定事件writer.setPageEvent(event)
      • 开始写入document.open()
        • 执行事件PdfPageEventHelper.onStartPage()
        • 写入正文document.add(...)
        • 页面自动排满或者手动document.newPage()
        • 执行事件PdfPageEventHelper.onEndPage()
        • 创建新页面后,循环上面的操作。
      • 执行事件PdfPageEventHelper.onCloseDocument()
      • 关闭文档document.close()
    • image
    • image
    • 有的AI工具提示:在onEndPage()方法写入页眉页脚。但是官方例子是使用了onStartPage()写入页眉。
    • 因为官方例子先设定了纸张大小页边距,在PDFTable中使用了writeSelectedRows()方法定义Table位置,也定死了Table的大小。无论正文如何拥挤也不会出现内容遮盖的问题。
    • onStartPage()中,AI推荐全页背景色铺满、防伪水印、底纹图案等。

段落

  • Paragraph段落类
    • 使用自定义字体,请看上文。
    • 内部使用new Chunk(),请看上文。
    • 对齐方式
      • setAlignment(int alignment)
      • // 左对齐
        Element.ALIGN_LEFT
        // 居中对齐
        Element.ALIGN_CENTER
        // 右对齐
        Element.ALIGN_RIGHT
        // 两端对齐
        Element.ALIGN_JUSTIFIED
        
      • image
    • 段落前后间距
      • setSpacingBefore(float spacing) 段前间距
      • setSpacingAfter(float spacing) 段后间距
      • image
    • 首行缩进、左右缩进
      • setFirstLineIndent(float firstLineIndent) 首行缩进
      • 注意firstLineIndent的值,一般中文排版是首行缩进2个字符;首先确定字号大小,比如14号。那么firstLineIndent = 28f
      • image
      • setIndentationLeft(float indentation) 整段左缩进
      • setIndentationRight(float indentation) 整段右缩进
      • firstLineIndent同上,注意字号。
      • image
    • 行间距
      • setLeading(float fixedLeading) 固定行高
      • setMultipliedLeading(float multipliedLeading) 倍数行距
      • fixedLeading = 字号(磅数)multipliedLeading = 倍数
      • image
    • 防止段落分页切割
      • setKeepTogether(boolean keeptogether)
      • 如果这个段落遇到分页,当 keeptogether = true 时,段落不会截断。
      • image
  • Footnote脚注类
    • 基本不可用,没玩儿明白。
    • 如想使用请参考自定义继承PdfPageEventHelper类。
  • ListItem列表项类
    • 看下来与直接list.add("字符串")没什么区别。
posted @ 2026-07-29 12:09  铁锅炖大鹅ing  阅读(16)  评论(0)    收藏  举报