Как печатать PDF с жесткими полями обрезанного принтера вместо сдвига? - PullRequest
0 голосов
/ 13 апреля 2019

Я пытаюсь напечатать PDF на бумаге специального типа, где положение контента имеет значение, а смещение не допускается.

Я использую java.awt.print.PrinterJob и org.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 голосов
/ 13 апреля 2019

Если содержимое PrinterJob задается с помощью метода setPrintable, то во время PrinterJob работает некоторое оборудование внутри и модифицирует указанные PageFormat, ...

Рабочий раствор #1 : используйте setPageable и 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 : используйте setPageable и Book с возможностью просмотра.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 все работает, тогда я буду рад, и с радостью одобрю ваш более подробный ответ.

...