使用 PDFbox 创建引用 OTF 字体的 PDF

Using PDFbox to create PDF referencing OTF fonts

提问人:Corinna 提问时间:10/30/2014 更新时间:11/12/2020 访问量:3170

问:

早上好!

我有一个新手 PDFbox 问题,我希望能得到一些帮助......

我刚刚(上周)从 github 下载了最新的 PDFbox 源代码,并尝试根据 HelloWorldTTF.java 示例创建一个 HelloWorldOTF.java,希望创建一个使用 OTF 字体的 PDF 文件(在本例中为 Adobe Caslon Pro Regular)将文本添加到输出 PDF。

这是我目前所拥有的:

        doc = new PDDocument();

        PDPage page = new PDPage();
        doc.addPage(page);

        String testOtfFontFile =  "c:/windows/fonts/ACaslonPro-Regular.otf";
        String testTtfFontFile = "c:/windows/fonts/arial.ttf";
        String testPdfFile = "c:/tmp/pdfboxtest.pdf";

        CFFFont font = loadCFFFont(testOtfFontFile);

        PDFont ttfFont = PDTrueTypeFont.loadTTF(doc, new File(testTtfFontFile));

        PDPageContentStream contentStream = new PDPageContentStream(doc,
                page);
        contentStream.beginText();
        // How to set the CFFFont?
        contentStream.setFont(ttfFont, 12);
        contentStream.moveTextPositionByAmount(100, 700);
        contentStream.drawString(text);
        contentStream.endText();
        contentStream.close();
        doc.save(testPdfFile);
        System.out.println(testPdfFile + " created!");

我可以使用以下代码加载 CFFFont:(loadCFFFont()):

            CFFFont cff = null;
            input = new FileInputStream(file);
            byte[] bytes = IOUtils.toByteArray(input);
            CFFParser cffParser = new CFFParser();
            cff = cffParser.parse(bytes).get(0);

...但我一生都无法弄清楚如何从 CFFFont 到 PDFont,以便能够使用它通过 setFont() 设置字体。

任何帮助或指示将不胜感激......

感谢一百万阅读到此为止;)

Java PDF PDF框 嵌入字体

评论

1赞 Tilman Hausherr 10/31/2014
我怀疑它会起作用......我只见过用 TT 字体编写 PDF 的例子。您提到的类将用于渲染。如果你在这里没有得到答案,我建议你在用户列表中询问,如果你得到没有或否定的答案,请在PDFBox JIRA中打开一个增强请求。或者,尝试 iText。(我简直不敢相信我正在写这个。一旦我们支持使用 CFFFonts 进行编写,请回到 PDFBox :-))
0赞 Corinna 11/4/2014
嘿蒂尔曼 - 非常感谢您的回复;我已经尝试了用户列表,但无济于事,所以看起来下一步是打开增强请求......这样我就可以完全避免使用iText;)

答:

2赞 sin_kai 11/12/2020 #1

通过参考此链接,它对我有用。

使用 OTFParser 将 otf 转换为 ttf。

OTFParser otfParser = new OTFParser();
OpenTypeFont otf = otfParser.parse(new File("C:/Users/beder/Downloads/code/CODE Light.otf"));

PDFont font = PDType0Font.load(document, otf, false);

评论

3赞 mkl 11/12/2020
另请阅读 Benjamin Eder 提出该方法后对 PDFBOX-2482 的评论。显然,结果并不完全符合PDF规范。