如何使用第三方字体从 Unicode 字符集语言创建 PDF 文档
我正在使用 PDFBox 和 iText 创建各种语言的简单(仅段落)pdf 文档。类似于:
pdfBox:
private static void createPdfBoxDocument(File from, File to) {
PDDocument document = null;
try {
document = new TextToPDF().createPDFFromText(new FileReader(from));
document.save(new FileOutputStream(to));
} finally {
if (document != null)
document.close();
}
}
private void createPdfBoxDoc() throws IOException, FileNotFoundException, COSVisitorException {
PDDocument document = new PDDocument();
PDPage page = new PDPage();
document.addPage(page);
PDPageContentStream contentStream = new PDPageContentStream(document, page);
PDType1Font font = PDType1Font.TIMES_ROMAN;
contentStream.setFont(font, 12);
contentStream.beginText();
contentStream.moveTextPositionByAmount(100, 400);
contentStream.drawString("š");
contentStream.endText();
contentStream.close();
document.save("test.pdf");
document.close();
}
itext:
private static Font blackFont = new Font(Font.FontFamily.COURIER, 12, Font.NORMAL, BaseColor.BLACK);
private static void createITextDocument(File from, File to) {
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream(to));
document.open();
addContent(document, getParagraphs(from));
document.close();
}
private static void addContent(Document document, List<String> paragraphs) {
for (int i = 0; i < paragraphs.size(); i++) {
document.add(new Paragraph(paragraphs.get(i), blackFont));
}
}
输入文件以 UTF-8 编码,并且 Unicode 字符集的某些语言(如俄语字母等)在 pdf 中无法正确呈现。我想这两个库中的字体都不支持 Unicode 字符集,并且我找不到任何有关如何添加和使用第三方字体的文档。有人可以帮我举个例子吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
如果您使用 iText,它有很好的支持。
在 iText in Action(第 2.2.2 章)中,您可以阅读更多内容。
您必须下载一些 unicode 字体,例如 arialuni.ttf 并执行以下操作:
arialuni.ttf 字体对我有用,到目前为止我检查了它的支持
,并且只有罗马尼亚语语言的 PDF 未正确创建...
对于 PDFBox 几乎是一样的:
但是正如 Gagravarr 所说,由于这个问题它不起作用 PDFBOX-903 。即使使用 1.6.0-SNAPSHOT 版本。也许行李箱会起作用。我建议你使用 iText。它在那里完美地工作。
If you are using iText, it has quite good support.
In iText in Action (chapter 2.2.2) you can read more.
You have to download some unicode Fonts like arialuni.ttf and do it like this :
arialuni.ttf fonts work for me, so far I checked it support for
and only PDF in Romanian language wasn't created properly...
With PDFBox it's almost the same:
However as Gagravarr says, it doesn't work because of this issue PDFBOX-903 . Even with 1.6.0-SNAPSHOT version. Maybe trunk will work. I suggest you to use iText. It works there perfectly.
您可能会发现这个答案很有帮助- 它确认您无法使用标准类型 1 字体之一执行您需要的操作,因为它们只是 Latin1
理论上,您只需要 将合适的字体嵌入到文档中,该字体处理您的所有代码点,并使用它。然而,在编写 unicode 字符串时至少存在一个未解决的错误,因此有一个可能它还不能工作...也尝试一下 svn trunk 中的最新 pdfbox,看看它是否有帮助!
You may find this answer helpful - it confirms that you can't do what you need with one of the standard type 1 fonts, as they're Latin1 only
In theory, you just need to embed a suitable font into the document, which handles all your codepoints, and use that. However, there's at least one open bug with writing unicode strings, so there's a chance it might not work just yet... Try the latest pdfbox from svn trunk too though to see if it helps!
在我的项目中,我只是将支持UTF8(或任何你想要的语言)的字体复制到一个目录(或者你可以使用Windows字体路径)并添加一些代码,它看起来像这样
现在,你可以使用这个字体来显示你的各种语言的文本。
In my project, I just copied the font that supported UTF8 (or whatever language you want) to a directory (or you can used Windows fonts path) and add some code, it looked like this
Now, you can use this font to show your text in various languages.
//使用此代码。有时 setfont() 不适用于 Paragraph
//use this code.Sometimes setfont() willnot work with Paragraph