【问题标题】:Java print PDF with embedded fonts带有嵌入字体的 Java 打印 PDF
【发布时间】:2017-02-19 04:14:57
【问题描述】:

我编写了代码来使用传入的打印机名称和 PDF 网址打印 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

似乎在今年(2016 年)发布的 2.0 版中做了一些事情。有一次,我尝试更新到最新版本,但更改太多,我选择不更新。

更新是我唯一的选择吗? 1.8.7 有什么我可以做的吗?

谢谢!

【问题讨论】:

  • “似乎在 2.0 版本中做了一些事情” - 事实上,使用 2.0 之前的版本你不会成功。

标签: java printing fonts pdfbox


【解决方案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();

【讨论】:

    猜你喜欢
    • 2017-08-13
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 2010-11-01
    • 2012-01-28
    • 1970-01-01
    相关资源
    最近更新 更多