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

使用iText 5创建双书写方向PDF及页面180度旋转的技术咨询

嘿,我来帮你搞定用iText 5实现PDF页面180度旋转的需求!你的思路用PdfPageEventHelper页面事件来设置旋转属性是完全正确的,我给你梳理完整的可运行实现方案,还有几个要注意的细节:

使用iText 5实现PDF页面180度旋转(基于PageEvent)

1. 完善你的旋转事件类

你的RotateEvent类核心逻辑没问题,我给你补全依赖导入和规范写法,注意PdfPage.INVERTEDPORTRAIT就是iText预定义的180度旋转常量:

import com.itextpdf.text.Document;
import com.itextpdf.text.pdf.PdfName;
import com.itextpdf.text.pdf.PdfPage;
import com.itextpdf.text.pdf.PdfPageEventHelper;
import com.itextpdf.text.pdf.PdfWriter;

public class RotateEvent extends PdfPageEventHelper {
    @Override
    public void onStartPage(PdfWriter writer, Document document) {
        // 给当前页面的字典添加ROTATE条目,指定180度旋转
        writer.addPageDictEntry(PdfName.ROTATE, PdfPage.INVERTEDPORTRAIT);
    }
}

2. 主生成程序中注册事件

接下来要在创建PdfWriter的时候注册这个事件,这样每一页在开始生成前都会自动应用旋转设置,不会影响后续的报表内容编写:

import com.itextpdf.text.Document;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter;

import java.io.FileOutputStream;
import java.util.List;

public class KlantPdfGenerator {
    public static void makeKlantSpecificPDF(List<Klant> klanten, String outputPath) {
        Document document = new Document();
        try {
            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(outputPath));
            // 关键步骤:注册旋转页面事件
            writer.setPageEvent(new RotateEvent());
            
            document.open();
            // 这里继续编写你的报表内容就行,比如遍历客户列表生成信息
            for (Klant klant : klanten) {
                document.add(new Paragraph("客户姓名: " + klant.getNaam()));
                document.add(new Paragraph("客户地址: " + klant.getAdres()));
                document.add(new Paragraph("------------------------"));
            }
            document.close();
            writer.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 假设你的项目里已经有Klant类,这里是示例用的简化版
    static class Klant {
        private String naam;
        private String adres;

        public String getNaam() { return naam; }
        public void setNaam(String naam) { this.naam = naam; }
        public String getAdres() { return adres; }
        public void setAdres(String adres) { this.adres = adres; }
    }

    // 测试用的主方法,你可以直接运行看效果
    public static void main(String[] args) {
        List<Klant> klanten = List.of(
            createKlant("Jan Jansen", "Amsterdamseweg 1"),
            createKlant("Piet Pietersen", "Rotterdamsestraat 2")
        );
        makeKlantSpecificPDF(klanten, "rotated_klant_report.pdf");
    }

    private static Klant createKlant(String naam, String adres) {
        Klant klant = new Klant();
        klant.setNaam(naam);
        klant.setAdres(adres);
        return klant;
    }
}

3. 几个关键注意点

  • 必须用onStartPage:一定要在onStartPage方法里设置旋转,因为这个方法是在页面内容生成前触发的;如果用onEndPage,页面内容已经渲染完,旋转设置可能不会生效。
  • 旋转常量说明:iText 5给了几个现成的旋转常量,不用自己写数字:
    • PdfPage.PORTRAIT:0度(默认)
    • PdfPage.LANDSCAPE:90度
    • PdfPage.REVERSELANDSCAPE:270度
    • PdfPage.INVERTEDPORTRAIT:180度(就是你需要的倒置)
  • 按需旋转特定页面:如果不是所有页面都要旋转,可以在事件里加判断,比如通过writer.getPageNumber()来指定某一页旋转,比如只旋转第2页:
    @Override
    public void onStartPage(PdfWriter writer, Document document) {
        if (writer.getPageNumber() == 2) {
            writer.addPageDictEntry(PdfName.ROTATE, PdfPage.INVERTEDPORTRAIT);
        }
    }
    

这样生成的PDF页面就会自动旋转180度,你可以正常编写后续的报表内容,完全不影响。

内容的提问来源于stack exchange,提问作者glenn schrooyen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:53:06