如何使用裁剪后的打印机的硬边距而不是平移来打印PDF?

时间:2019-04-13 07:54:29

标签: java printing pdfbox java-print

我正在尝试在特殊类型的纸张上打印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如下:

original-pdf

但是,已打印的已转移:

printed-pdf-with-pdf-box

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

不幸的是,我无法在不移动内容的情况下打印PDF。

1 个答案:

答案 0 :(得分:0)

如果使用PrinterJob方法设置了setPrintable的内容,则在PrinterJob内进行一些操作,并修改指定的PageFormat,...

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

    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 :使用可分页的setPageableBookBook使用指定的页面格式进行打印:

    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的工作原理如何,那么我会很高兴,并且很高兴为您提供更详细的答案。