You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 07:09:18