如何使用PDFBox动态创建指定格式与方向的PDPage对象
实现方法
最简便的实现不需要硬编码4种页面规格的常量,按拆分参数、匹配尺寸、适配方向的逻辑写工具方法即可,代码可维护性高,也不会出现尺寸错误:
import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.common.PDRectangle; public class PdfCreateUtils { /** * 创建带指定规格页面的PDDocument对象 * @param pageSpec 页面规格,仅支持 A4-Portrait/A4-Landscape/A3-Portrait/A3-Landscape * @return 已添加对应规格页面的PDDocument实例 */ public static PDDocument createDocWithTargetPage(String pageSpec) { String[] specParts = pageSpec.split("-"); if (specParts.length != 2) { throw new IllegalArgumentException("参数格式非法,请按「尺寸-方向」格式传入,如A3-Landscape"); } // 匹配基础纸张尺寸 PDRectangle baseSize; switch (specParts[0]) { case "A3": baseSize = PDRectangle.A3; break; case "A4": baseSize = PDRectangle.A4; break; default: throw new IllegalArgumentException("暂不支持该纸张尺寸,仅支持A3、A4"); } // 适配页面方向 PDRectangle finalPageSize; switch (specParts[1]) { case "Portrait": // 竖版直接使用基础尺寸即可 finalPageSize = baseSize; break; case "Landscape": // 横版直接交换基础尺寸的宽高,无需额外记内置常量 finalPageSize = new PDRectangle(baseSize.getHeight(), baseSize.getWidth()); break; default: throw new IllegalArgumentException("暂不支持该页面方向,仅支持Portrait、Landscape"); } PDDocument document = new PDDocument(); document.addPage(new PDPage(finalPageSize)); return document; } }
方案优势
- 逻辑拆分清晰,后续如果要新增A5、A2等其他纸张尺寸,只需要在尺寸匹配的分支里加对应case即可,方向处理逻辑完全不用改
- 不需要依赖PDFBox是否提供横版对应的内置常量,交换宽高是PDFBox官方推荐的横版页面实现方式,尺寸精度和内置常量完全一致
- 自带参数校验,非法输入会抛出明确的异常信息,方便调用方排查问题
调用时直接传入对应参数字符串即可,比如传入"A3-Landscape",就会自动生成A3横版的页面添加到新文档中返回。
内容的提问来源于stack exchange,提问作者Arshad Rehmani
相关产品推荐
相关产品推荐

