0

我正在尝试在特殊类型的纸张上打印 PDF,其中内容的位置很重要,并且不允许移动。

我正在使用java.awt.print.PrinterJoborg.apache.pdfbox.printing.PDFPrintable


    public void printPDF(byte[] pdf) throws IOException, PrinterException {
        MediaSize media = MediaSize.getMediaSizeForName(MediaSizeName.ISO_A4);

        PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
        attributes.add(media.getMediaSizeName());
        attributes.add(new MediaPrintableArea(
                0, 0, media.getSize(1)[0], media.getSize(1)[1],
                1
        ));

        PrinterJob job = PrinterJob.getPrinterJob();

        if (job.printDialog(attributes)) {
            PageFormat pageFormat = (PageFormat) job.getPageFormat(attributes).clone();


            Paper paper = pageFormat.getPaper();
            paper.setImageableArea(0, 0, paper.getWidth(), paper.getHeight());
            pageFormat.setPaper(paper);

            PDDocument document = PDDocument.load(pdf);
            PDFPrintable printable = new PDFPrintable(
                    document,
                    Scaling.ACTUAL_SIZE,
                    false,
                    0,
                    false
            );
            job.setPrintable(printable, pageFormat);
            job.print(attributes);
        }
    }

原始 PDF 如下所示:

原文-pdf

但是,打印出来的内容发生了变化:

印刷的pdf-with-pdf-box

因此,我希望不打印虚线边框而不是移位,而不是移位整个文档。

不幸的是,我无法在不改变内容的情况下打印 PDF,..

4

1 回答 1

0

如果PrinterJob' 的内容是使用setPrintable方法设置的,那么在PrinterJob里面做一些机器,并修改指定PageFormat的,...

工作解决方案#1:使用setPageableand PDFPageable,它使用文档的页面格式进行打印:

    public void printPDF(byte[] pdf) throws IOException, PrinterException {
        PDDocument document = PDDocument.load(pdf);

        PrinterJob job = PrinterJob.getPrinterJob();
        job.setPageable(new PDFPageable(document));

        if (job.printDialog()) {
            job.print();
        }
    }

工作解决方案#2:使用setPageableBook可分页。Book使用指定的页面格式进行打印:

    public void printPDF(byte[] pdf) throws IOException, PrinterException {
        PDDocument document = PDDocument.load(pdf);

        MediaSize media = MediaSize.getMediaSizeForName(MediaSizeName.ISO_A4);
        PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
        attributes.add(media.getMediaSizeName());

        PrinterJob job = PrinterJob.getPrinterJob();

        if (job.printDialog(attributes)) {
            PageFormat pageFormat = (PageFormat) job.getPageFormat(attributes).clone();

            Paper paper = pageFormat.getPaper();
            paper.setImageableArea(0, 0, paper.getWidth(), paper.getHeight());
            pageFormat.setPaper(paper);

            PDFPrintable printable = new PDFPrintable(document, Scaling.ACTUAL_SIZE, false, 0, false);

            Book book = new Book();
            book.append(printable, pageFormat);
            job.setPageable(book);

            job.print(attributes);
        }
    }

其他解决方案:这是我自己对自己问题的回答。答案基于在此问题上花费的几个小时的工作/调查,幸运的是找到了一些解决方案。

如果您知道下面发生了什么,并且可以提供更详细的答案,解释实际发生的事情以及PrinterJob事情的具体运作方式,那么我会很高兴,并很乐意批准您更详细的答案。

于 2019-04-13T15:11:32.437 回答