有没有办法将其他字体样式添加到Apache Pdfbox中?
我们目前正在尝试在我们的系统中打印PDF(目前正在使用PDF Renderer完成)。我一直在寻找各种替代方案(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中使用的字体,因此会更改所使用的字体。因此,文档看起来非常奇怪(间距和字符大小不同,看起来很奇怪)。我经常看到以下日志消息,或者类似的东西:
2014年4月16日下午2:56:21 org.apache.pdfbox.pdmodel.font.PDSimpleFont drawString警告:更改<>上的字体从<NimbusMono>转换为默认字体
有人知道如何在pdfbox中添加新字体类型的方法吗?除此之外,如何更改默认字体类型?
据我所知,pdfbox支持14种标准字体。不幸的是,NimbusMono不是其中之一。如有任何指导,我们将不胜感激。
未发布的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-app"是查看文件是否正确呈现的快速测试https://repository.apache.org/content/groups/snapshots/org/apache/pdfbox/pdfbox-app/2.0.0-SNAPSHOT/然后运行查看器:java-jar pdfbox-app-2.0.0-2014 0416.173452-273.jar PDFReader your-file-name.pdf还有一个打印功能。
祝你好运!
更新2016:2.0版本已经发布,请在此处下载。如果您使用过1.8版本,请阅读迁移指南。
我在试图解决同样的问题时遇到了这篇文章。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();
}
}
我在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分支的不稳定字体问题。