繁体   English   中英

将字体添加到Apache Pdfbox?

[英]Adding fonts to Apache Pdfbox?

有没有办法在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警告:将<>上的字体从<NimbusMono>更改为默认字体

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

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

未发布的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版本已发布,请在此处下载。 如果您使用的是1.8版本,请阅读迁移指南

我遇到了与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分支的不稳定字体问题。

我试图解决同样的问题时遇到了这篇文章。 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();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM