使用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
相关产品推荐
相关产品推荐

