astro 2024-10-18 18:40 采纳率: 50%
浏览 1

Java打印Pdf文件,输入pdf是横向pdf,打印到Print to Pdf这个打印机,输出的pdf变成竖向,代码如下,怎样控制输出的pdf是横向?

Java打印Pdf文件,输入pdf是横向pdf,打印到Print to Pdf这个打印机,输出的pdf变成竖向,代码如下,怎样控制输出的pdf是横向?
以下代码,假如输入的是横向pdf,输出无论怎样设置,都是竖向的Pdf,求指教!

public void printPdf(InputStream file) throws IOException, PrinterException {
        PrintService[] printServices = PrintServiceLookup.lookupPrintServices(null, null);

        // 根据打印机的名称选择打印服务
        PrintService selectedPrintService = null;
        for (PrintService printService : printServices) {
            log.info("发现打印机:{}", printService.getName());
            if (printService.getName().equals("Print to Pdf")) {
                selectedPrintService = printService;
                log.info("选中打印机:{}", printService.getName());
                break;
            }
        }

        if (Objects.isNull(selectedPrintService)) {
            throw new RuntimeException("未找到打印机");
        }

        // 加载PDF文件
        PDDocument document = PDDocument.load(file);

        PrinterJob printerJob = PrinterJob.getPrinterJob();
        printerJob.setPrintService(selectedPrintService);
        PageFormat pageFormat = printerJob.defaultPage();
        Paper paper = pageFormat.getPaper();

        double pdfw = convertToPx(9.4);
        double pdfh = convertToPx(4.9);

        // 设置纸张大小
        paper.setSize(convertToPx(9.5), convertToPx(5.0));

        // 设置打印区域
        paper.setImageableArea(0 + invLeft, 0 + invTop, pdfw, pdfh);

        //设置打印方向 PORTRAIT 竖向  REVERSE_LANDSCAPE 横向
        pageFormat.setOrientation(PageFormat.PORTRAIT);
        pageFormat.setPaper(paper); //自定义纸张大小
        PDFPrintable printable = new PDFPrintable(document, Scaling.ACTUAL_SIZE, false, 0.0F, false);
        Book book = new Book();
        book.append(printable, pageFormat);
        printerJob.setPageable(book);
        printerJob.print();
        document.close();
    }

输入PDF如下

img

  • 写回答

1条回答 默认 最新

  • 无疆76 2024-10-18 18:57
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    您遇到的PDF文件在打印过程中变为竖向的问题可能与几个因素有关,其中包括打印机驱动的限制以及代码中处理打印配置的方式。解决此问题,您可以尝试以下几个步骤:

    1. 检查打印机驱动和设置:确保您使用的打印机驱动支持横向打印,并且打印机的物理设置允许横向打印。某些打印机默认设置为竖向打印,即使您尝试更改方向也可能无法改变。此外,确保打印机的物理设置中没有启用自动旋转页面或类似的选项。
    2. 调整代码中的纸张尺寸和方向设置:确保纸张尺寸设置与实际输入PDF的原始尺寸匹配。另外,根据实际需求调整代码中的打印方向设置。当您设置纸张尺寸时,确保宽度和高度与实际PDF文件的尺寸相匹配。此外,尝试调整pageFormat.setOrientation()方法的参数来改变打印方向。在这个例子中,虽然您使用了PageFormat.PORTRAIT来表示竖向打印,但是也可以尝试使用PageFormat.REVERSE_LANDSCAPE来强制设置为横向打印。同时,检查PDF的原始尺寸和页面方向是否正确,并相应地调整代码中的打印配置。例如,如果原始PDF是横向的并且内容较少以适应标准纵向纸张格式(比如典型的Letter纸张),您可以调整纸张尺寸设置来适应原始横向页面布局并允许它横向打印。这可能意味着需要手动调整纸张尺寸或缩放比例来匹配原始PDF的布局和意图。代码可能需要根据原始PDF的精确尺寸进行自定义设置以保留原始的页面布局和尺寸。您也可以考虑使用专业的PDF处理库(如Apache PDFBox或iText)来更精确地控制PDF的布局和打印配置。这些库提供了更高级的API来处理PDF文件的内容和方向等属性。通过这种方式,您可以更精确地控制输出PDF的方向和内容布局。这些库通常允许更精细地控制页面布局和方向等属性,可能有助于解决您遇到的问题。总的来说,这个问题可能需要综合考虑打印机设置、代码配置以及PDF文件的原始布局来解决。尝试上述建议的步骤,并根据具体情况进行调整和优化以解决您的问题。
    评论

报告相同问题?

问题事件

  • 修改了问题 10月18日
  • 修改了问题 10月18日
  • 创建了问题 10月18日

悬赏问题

  • ¥15 校内二手商品转让网站
  • ¥20 高德地图聚合图层MarkerCluster聚合多个点,但是ClusterData只有其中部分数据,原因应该是有经纬度重合的地方点,现在我想让ClusterData显示所有点的信息,如何实现?
  • ¥100 求Web版SPC控制图程序包调式
  • ¥20 指导如何跑通以下两个Github代码
  • ¥15 大家知道这个后备文件怎么删吗,为啥这些文件我只看到一份,没有后备呀
  • ¥15 C++为什么这个代码没报错运行不出来啊
  • ¥15 一道ban了很多东西的pyjail题
  • ¥15 关于#r语言#的问题:如何将生成的四幅图排在一起,且对变量的赋值进行更改,让组合的图漂亮、美观@(相关搜索:森林图)
  • ¥15 C++识别堆叠物体异常
  • ¥15 微软硬件驱动认证账号申请