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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:50:02