【问题标题】:Adding fonts to Apache Pdfbox?向 Apache Pdfbox 添加字体?
【发布时间】:2014-05-31 20:03:05
【问题描述】:

有没有办法在 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 中使用的字体,因此会更改正在使用的字体。结果文档看起来很奇怪(间距和字符大小不同,看起来很奇怪)。我经常看到以下日志消息或类似的内容:

2014 年 4 月 16 日下午 2:56:21 org.apache.pdfbox.pdmodel.font.PDSimpleFont drawString 警告:将 上的字体从 更改为默认字体

有没有人知道如何将新字体类型添加到 pdfbox 中的方法(或参考)?或者除此之外,如何更改默认字体类型?

据我所知,pdfbox 支持14 standard fonts。不幸的是 NimbusMono 不是其中之一。任何指导将不胜感激。

【问题讨论】:

标签: java pdf fonts pdfbox


【解决方案1】:

未发布的 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

【讨论】:

  • 谢谢!老实说,我听说过 2.0.0 分支,但由于某种原因找不到它,直到您在此处发布链接。虽然 1.8.x 版本不适合我,但 2.0.0 分支似乎有我需要的东西。
【解决方案2】:

我在使用 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 分支的不稳定字体问题。

【讨论】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-29
      • 1970-01-01
      • 1970-01-01
      • 2019-01-17
      • 1970-01-01
      相关资源
      最近更新 更多