将字体添加到Apache Pdfbox?

11

有没有一种方法可以将额外的字体样式添加到Apache Pdfbox中?

我们目前正在尝试解决系统中打印PDF的问题(目前使用PDF-Renderer)。我一直在寻找各种替代方案(pdfboxjpedaljPDFPrint)。

我们希望使用一个免费的GPL兼容库,因此我们倾向于pdfbox。我已经编写了一些示例代码来打印PDF,代码是有效的。请参见下面:

PDDocument doc;
try {
        doc = PDDocument.load("test.pdf");
        doc.print();
    } catch (Exception e) {
        // Come up with better thing to do on fail.
        e.printStackTrace();
    }

就像我之前提到的,这个方法是可行的,但我遇到了一个问题,那就是PdfBox似乎无法识别PDF中使用的字体,从而更改正在使用的字体。因此,文档看起来非常奇怪(间距和字符大小不同且看起来很奇怪)。我经常会看到以下日志消息或类似消息:

Apr 16, 2014 2:56:21 PM org.apache.pdfbox.pdmodel.font.PDSimpleFont drawString WARNING: Changing font on < > from < NimbusMono > to the default font

有人知道如何添加新字体类型到pdfbox的方法(或参考文献)吗?或者如果没有这样的方法,如何更改默认字体类型?

据我所知,pdfbox支持14种标准字体。不幸的是,NimbusMono不在其中。任何指导都将不胜感激。


问题已在此处得到解答,并且适用于2.0版本。进入链接 - Kabsyaks
3个回答

9
未发布的2.0版本支持嵌入字体渲染。您可以在快照中获取它:https://repository.apache.org/content/groups/snapshots/org/apache/pdfbox/ 或通过 "svn checkout http://svn.apache.org/repos/asf/pdfbox/trunk/" 获取。API与1.8.x版本略有不同,可能会发生变化,最好查看代码示例。测试文件是否能正确渲染的快速方法是下载 “pdfbox-app”https://repository.apache.org/content/groups/snapshots/org/apache/pdfbox/pdfbox-app/2.0.0-SNAPSHOT/ 然后运行查看器:java -jar pdfbox-app-2.0.0-20140416.173452-273.jar PDFReader your-file-name.pdf 同样也有打印功能。
祝你好运!
更新于 2016: 2.0版本已发布,可在此处下载:here。如果您使用过1.8版本,请阅读migration guide

1
谢谢!老实说,我听说过2.0.0分支,但是在你在这里发布链接之前,我找不到它的原因。虽然1.8.x版本对我来说不起作用,但2.0.0分支似乎有我需要的东西。 - K.Niemczyk

3

我在尝试解决同样的问题时发现了这篇文章。目前,PDFBox 2.0 API文档并不是很好。

你要寻找的是Fontbox中的FontFileFinder。 确保你使用的是包含Fontbox的完整pdfbox-app jar。

我只在Windows上尝试过这个方法,但看到类似的代码似乎也支持其他主流操作系统。

以下是我编写的简单示例类,它在PDF的左下角写出一小段文本,使用的是非标准字体。

import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.util.List;

import org.apache.fontbox.util.autodetect.FontFileFinder;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
import org.apache.pdfbox.pdmodel.font.PDType1Font;

public class TestPDFWrite {

    public static void main(String[] args) throws IOException {

        FontFileFinder fontFinder = new FontFileFinder();
        List<URI> fontURIs = fontFinder.find();

        File fontFile = null;

        for (URI uri : fontURIs) {
            File font = new File(uri);
            if (font.getName().equals("CHILLER.TTF")) {
                fontFile = font;
            }
        }

        PDDocument document = new PDDocument();
        PDPage page = new PDPage();
        document.addPage(page);

        PDPageContentStream contentStream = new PDPageContentStream(document, page);
        contentStream.beginText();

        if (fontFile != null) {
            contentStream.setFont(PDType0Font.load(document, fontFile), 12);
        } else {
            contentStream.setFont(PDType1Font.HELVETICA, 12);
        }

        contentStream.newLineAtOffset(10, 10);
        contentStream.showText("Hello World");
        contentStream.endText();
        contentStream.close();
        document.save("C:/Hello World.pdf");
        document.close();
    }
}

1

我在使用PDFBox时遇到了类似的问题。可以使用Java的javax.print包以简单的方式打印PDF。以下代码略微修改自javax.print的API文档。

DocFlavor flavor = DocFlavor.INPUT_STREAM.PDF;
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
aset.add(MediaSizeName.ISO_C6); //letter size
PrintService[] pservices = PrintServiceLookup.lookupPrintServices(flavor, aset);
if (pservices.length > 0) {
   DocPrintJob pj = pservices[0].createPrintJob();
   try {
       FileInputStream fis = new FileInputStream("test.pdf");
       Doc doc = new SimpleDoc(fis, flavor, null);
       pj.print(doc, aset);
   } catch (FileNotFoundException | PrintException e) {
       //do something
   }

这段代码假定打印机可以直接接收PDF文件,但它允许您绕过PDFBox 1.8分支的字体问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接