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("字符串")没什么区别。
- 看下来与直接












浙公网安备 33010602011771号