如何在iText 7中为不同页面设置不同的PageSize?
使用iText为PDF特定页面设置不同尺寸
需求
需要为PDF的特定页面设置不同尺寸:比如第2页设为new Rectangle(155, 155),第3页设为A4尺寸,其余页面使用默认尺寸。
实现思路
iText中全局的setDefaultPageSize无法直接针对单页生效,必须通过页面事件处理器监听页面创建事件,在对应页码动态修改页面的MediaBox(PDF定义页面尺寸的核心属性),同时同步更新文档的默认尺寸以适配布局。
完整代码示例
import com.itextpdf.kernel.geom.PageSize; import com.itextpdf.kernel.geom.Rectangle; import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.kernel.pdf.event.PdfDocumentEvent; import com.itextpdf.layout.Document; import com.itextpdf.layout.element.Div; import com.itextpdf.layout.element.Paragraph; import com.itextpdf.layout.event.IEventHandler; public class CustomPageSizeDemo { public static void main(String[] args) throws Exception { String outputPath = "custom_page_size.pdf"; PdfWriter writer = new PdfWriter(outputPath); PdfDocument pdfDoc = new PdfDocument(writer); // 初始化文档,默认用A5尺寸 Document doc = new Document(pdfDoc, PageSize.A5); // 注册页面开始事件处理器 pdfDoc.addEventHandler(PdfDocumentEvent.START_PAGE, (event) -> { PdfDocumentEvent docEvent = (PdfDocumentEvent) event; PdfDocument pdf = docEvent.getDocument(); int currentPage = pdf.getNumberOfPages(); Rectangle targetSize = null; // 根据页码匹配目标尺寸 if (currentPage == 2) { targetSize = new Rectangle(155, 155); } else if (currentPage == 3) { targetSize = PageSize.A4; } if (targetSize != null) { // 修改当前页面的MediaBox(物理尺寸) pdf.getPage(currentPage).setMediaBox(targetSize); // 更新文档默认尺寸,确保内容布局适配 doc.setDefaultPageSize(targetSize); } else { // 非目标页码恢复默认尺寸 doc.setDefaultPageSize(PageSize.A5); } }); // 添加测试内容 String line = "Hello! Welcome to iTextPdf"; Div contentDiv = new Div(); for (int i = 0; i < 30; i++) { contentDiv.add(new Paragraph(line + " " + i)); } doc.add(contentDiv); doc.close(); } }
关键要点
- 事件触发时机:
START_PAGE事件在每个页面创建后立即触发,此时可以准确获取当前页码并修改尺寸。 - MediaBox修改:
setMediaBox是直接修改PDF页面尺寸的底层操作,确保页面物理尺寸生效。 - 布局同步:同步更新
Document的默认页面尺寸,避免内容布局出现错位或溢出。
内容的提问来源于stack exchange,提问作者mobiw
相关产品推荐
相关产品推荐

