#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();