带有嵌入式字体的Java打印PDF
我已经编写了使用传入的打印机名称和PDF url打印PDF的代码。这是可行的,除了当我传递一个带有中文字符的PDF文件时,字符只是方框。Unicode字体嵌入了PDF,因此理想情况下,我希望以某种方式利用它。以下是进行打印的代码:带有嵌入式字体的Java打印PDF,java,printing,fonts,pdfbox,Java,Printing,Fonts,Pdfbox,我已经编写了使用传入的打印机名称和PDF url打印PDF的代码。这是可行的,除了当我传递一个带有中文字符的PDF文件时,字符只是方框。Unicode字体嵌入了PDF,因此理想情况下,我希望以某种方式利用它。以下是进行打印的代码: PDDocument document = PDDocument.load(new URL(fileUrl)); PrinterJob job = PrinterJob.getPrinterJob(); job.setPrintService(printer);
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问题:
今年(2016年)发布的2.0版似乎做了些什么。有一次,我尝试更新到最新的版本,但有太多的变化,我选择不更新
更新是我唯一的选择吗?1.8.7中有什么我可以做的吗
谢谢 根据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();
“似乎2.0版中做了些什么”——事实上,2.0之前的版本不会成功。