Java печать PDF со встроенными шрифтами

#java #printing #fonts #pdfbox

#java #печать #шрифты #pdfbox

Вопрос:

Я написал код для печати PDF-файла, используя переданное имя принтера и URL-адрес PDF. Это работает, за исключением случаев, когда я передаю ему PDF-файл с китайскими иероглифами, символы — это просто поля. Шрифт Unicode встроен в PDF, поэтому в идеале я хотел бы как-то его использовать. Вот код, который выполняет печать:

 PDDocument document = PDDocument.load(new URL(fileUrl));

PrinterJob job = PrinterJob.getPrinterJob();
job.setPrintService(printer);

PageFormat pageFormat = job.defaultPage();
Paper paper = pageFormat.getPaper();
Book pBook = new Book();

List allPages = document.getDocumentCatalog().getAllPages();

for (Object pdPage : allPages)
{
    PDPage page = (PDPage) pdPage;
    double width = page.findMediaBox().getWidth();
    double height = page.findMediaBox().getHeight();
    double margin = 0.0d;
    paper.setSize(width, height);
    paper.setImageableArea(margin, margin, width - (margin * 2), height - (margin * 2));
    pageFormat.setOrientation(PageFormat.PORTRAIT);
    pageFormat.setPaper(paper);
    PageFormat validatePage = job.validatePage(pageFormat);
    pBook.append(document.getPrintable(allPages.indexOf(pdPage)), validatePage);
    job.setPageable(pBook);
}

job.setJobName(jobName);
job.print();
  

Как вы можете видеть, я использую PDFBox (версия 1.8.7). Я провел некоторый поиск по этому вопросу, но не смог найти ничего полезного. Однако я обнаружил эту проблему с JIRA: https://issues.apache.org/jira/browse/PDFBOX-490

Кажется, возможно, что-то было сделано в версии 2.0, которая была выпущена в этом году (2016). В какой-то момент я попытался обновить до последней версии, но было так много изменений, что я решил не делать этого.

Является ли обновление моим единственным вариантом? Есть ли что-нибудь, что я могу сделать в 1.8.7?

Спасибо!

Комментарии:

1. «Кажется, что-то было сделано в версии 2.0» — действительно, с версией до 2.0 у вас ничего не получится.

Ответ №1:

Согласно комментарию mkl, я обновился до версии 2.0.3, и китайские иероглифы напечатаны правильно. Вот мой новый код по сравнению с моим старым, чтобы увидеть, что необходимо было обновить:

 PrinterJob job = PrinterJob.getPrinterJob();
job.setPrintService(printer);

PageFormat pageFormat = job.defaultPage();
Paper paper = pageFormat.getPaper();
Book pBook = new Book();

PDDocument document = PDDocument.load(new URL(fileUrl).openStream()); // Needs to be a stream now

PDPageTree allPages = document.getPages(); // no getDocumentCatalog
for (Object pdPage : allPages)
{
    PDPage page = (PDPage) pdPage;
    double width = page.getMediaBox().getWidth();   // getMediaBox instead of find
    double height = page.getMediaBox().getHeight(); // getMediaBox instead of find
    double margin = 0.0d;
    paper.setSize(width, height);
    paper.setImageableArea(margin, margin, width - (margin * 2), height - (margin * 2));
    pageFormat.setOrientation(PageFormat.PORTRAIT);
    pageFormat.setPaper(paper);
    PageFormat validatePage = job.validatePage(pageFormat);
    pBook.append(new PDFPrintable(document), validatePage, document.getNumberOfPages()); // Completely different
}

job.setPageable(pBook); // Moved this out of the loop, just cause it only needs to be called once
job.setJobName(jobName);
job.print();