使用PDFBOX 2转换混合方向PDF为PostScript后打印丢失自动方向的解决咨询
解决PDFBOX 2转换PDF到PS时丢失自动打印方向的问题
我之前也碰到过一模一样的问题,核心原因就是PDF里的页面旋转属性在转PS过程中没有被正确转换成打印机能识别的自动旋转逻辑,要么没生成对应的PS指令,要么没调整页面的实际尺寸。下面给你两种实用的解决方案:
方法一:启用PS自动旋转指令(推荐)
PDFBOX自带的PDFToPS工具类有现成的自动旋转配置,只要开启setAutoRotatePages(true),生成的PS文件就会包含AutoRotatePages /All指令,直接告诉打印机自动匹配页面方向和纸张方向,效果和直接打印原PDF完全一致。
代码示例:
import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.tools.PDFToPS; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; public class PdfToPsAutoRotate { public static void main(String[] args) throws IOException { File inputPdf = new File("你的输入文件.pdf"); File outputPs = new File("你的输出文件.ps"); try (PDDocument document = PDDocument.load(inputPdf); FileOutputStream fos = new FileOutputStream(outputPs)) { PDFToPS converter = new PDFToPS(document, fos); // 关键配置:开启自动旋转页面 converter.setAutoRotatePages(true); converter.process(); } } }
这个方法最省心,现在绝大多数现代打印机都支持AutoRotatePages指令,生成的PS文件也能完美保留原PDF的方向逻辑。
方法二:手动调整页面尺寸(兼容老打印机)
如果你的打印机不支持PS的自动旋转指令,可以手动处理每个PDF页面的旋转属性,调整页面的媒体箱(MediaBox)尺寸,把旋转后的页面尺寸直接写入PS文件,这样打印机不需要自动旋转就能正确打印。
代码示例:
import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.printing.PSDocumentWriter; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; public class PdfToPsManualRotate { public static void main(String[] args) throws IOException { File inputPdf = new File("你的输入文件.pdf"); File outputPs = new File("你的输出文件.ps"); try (PDDocument document = PDDocument.load(inputPdf); FileOutputStream fos = new FileOutputStream(outputPs)) { // 遍历处理每个页面的旋转和尺寸 for (PDPage page : document.getPages()) { int rotation = page.getRotation(); // 仅处理90/270度的旋转(横向转纵向或反之) if (rotation == 90 || rotation == 270) { PDRectangle mediaBox = page.getMediaBox(); // 交换宽高,适配旋转后的页面方向 float tempWidth = mediaBox.getWidth(); mediaBox.setWidth(mediaBox.getHeight()); mediaBox.setHeight(tempWidth); // 重置页面旋转为0,因为已经通过尺寸调整实现了方向转换 page.setRotation(0); } } // 生成最终的PS文件 PSDocumentWriter writer = new PSDocumentWriter(); writer.write(document, fos); } } }
这个方法相当于把PDF的旋转效果“固化”到页面尺寸里,PS文件的每个页面本身就是正确的方向,完全不依赖打印机的自动旋转功能。
注意事项
- 确保你使用的是PDFBOX 2.x版本,上述API都是2.x版本新增的,1.x版本的逻辑差异很大。
- 测试时可以先用Acrobat Reader打开生成的PS文件预览,确认页面方向正确后再进行打印测试。
内容的提问来源于stack exchange,提问作者Rajat Talwar
相关产品推荐
相关产品推荐

