带有嵌入式字体的Java打印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);

我已经编写了使用传入的打印机名称和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问题:

今年(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之前的版本不会成功。