当前位置: 首页 > 知识库问答 >
问题:

向Apache Pdfbox添加字体?

湛文乐
2023-03-14

有没有办法在Apache Pdfbox中添加额外的字体样式?

我们目前正在尝试在系统中打印PDF(目前正在使用PDF渲染器)我一直在寻找各种替代方案(pdfbox、jpedal、jPDFPrint)

我们希望有一个免费的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中使用的字体,因此更改了正在使用的字体。因此,文档看起来非常奇怪(行间距和字符大小不同,看起来很奇怪)。我经常看到以下日志消息,或类似的东西:

Apr16, 2014 2:56:21PMorg.apache.pdfbox.pdmodel.font.PDSimpleFont绘图字符串警告:更改字体

是否有人知道如何将新的fonttype添加到pdfbox中的方法(或参考)?否则,如何更改默认字体类型?

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

共有3个答案

胡博艺
2023-03-14

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

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

颜哲彦
2023-03-14

我在试图解决同样的问题时遇到了这篇文章。PDFBox 2.0 API文档目前还不是很好。

您要查找的是Fontbox中的FontFileFinder。确保您使用的是完整的pdfbox应用程序jar,其中包括Fontbox。

我只在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();
    }
}
司徒翼
2023-03-14

未发布的2.0版本支持嵌入式字体的呈现。您可以将其作为快照获取https://repository.apache.org/content/groups/snapshots/org/apache/pdfbox/或通过“svn签出”http://svn.apache.org/repos/asf/pdfbox/trunk/“。该API与1.8.x版本略有不同,可能会发生更改,最好是查看代码示例。下载“pdfbox应用程序”可以快速测试文件是否会正确呈现。”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您的文件名。pdf还有一个打印功能。

祝你好运!

2016年更新:2.0版本已经发布,请在此处下载。如果您使用过1.8版本,请阅读迁移指南。

 类似资料:
  • 假设我在一个数组列表中添加了2个用户Apple和Orange。然后我想将牛顿添加到苹果的朋友列表中。所以苹果应该有1个朋友,而橙色仍然没有任何朋友,因为我还没有添加他们。 我的问题是,当我把牛顿添加到苹果的朋友中时,牛顿也会出现在orange的朋友中。我只需要一个朋友出现在苹果和橙色没有。 我认为这是我为用户的朋友设置arraylist的方式,但我不确定如何更改它。

  • 问题内容: 创建密钥后,是否可以向Python字典添加密钥?它似乎没有方法。 问题答案:

  • 我看到过一些关于的博客,这些博客似乎可以很好地为类添加行为。 但是,如果我有一个并且我要怎么办?作为一个case类,我不能扩展它(不推荐/强烈不鼓励从case类继承)。这些皮条客模式是否允许我将数据添加到case类中?

  • 我不得不向现有文档添加一个新字段/s。 下面是用于测试目的的过程AddNewField。 我做错了什么? 在调用fmongo.update后,我的收藏现在有两个文档!

  • 嗨,我试图创建一个由JComboBox和JTextField组成的接口。我已经整理好了向JComboBox添加标签的代码,但是我在向文本字段添加标签时遇到了麻烦。如有任何帮助,不胜感激。

  • 我想序列化一个模型,但希望包含一个额外的字段,该字段需要对要序列化的模型实例进行一些数据库查找: 做这件事的正确方法是什么?我看到你可以传递额外的“上下文”到序列化器,正确的答案是在上下文字典中传递额外的字段吗? 使用这种方法,获取所需字段的逻辑将不是序列化程序定义自包含的,这是理想的,因为每个序列化实例都需要。在DRF序列化器文档的其他地方,它说“额外的字段可以对应于模型上的任何属性或可调用的”