【问题标题】:java - generate unicode pdf with Apache PDFBoxjava - 使用 Apache PDFBox 生成 unicode pdf
【发布时间】:2015-03-23 21:38:52
【问题描述】:

我必须在我的 spring mvc 应用程序中生成 pdf。最近我测试了iTextPdf library,但我无法生成 unicode pdf 文档。事实上,我在生成的文档中没有看到非拉丁字符。我决定为我的目的使用 Apache PDFBox,但我不知道它是否支持 unicode 字符?如果有,有没有学习pdfBox的好教程?如果没有,我应该使用哪个库? 提前致谢。

【问题讨论】:

  • 如果使用得当,iText 和 PDFBox 都可用于打印拉丁字符以外的字符。正如@Tilman 回答的那样,最近才在 PDFBox 中引入了一种简单的方法。 IText 还提供了一种简单的方法。如果您碰巧不仅指非拉丁语,还指非 LTR,您可能应该说出来。
  • 我需要在一个文档中同时使用拉丁语和非拉丁语(例如波斯语)字符。事实上,我的页面有 LTR 和 RTL 文本。
  • 恐怕应该添加到问题中。人们通常只会想到某些拉丁字符的非常特殊的变体,或者在这种情况下会想到西里尔字母或 Dingbats。需要特殊连字和 RTL 的字符不一定在他们的脑海中。
  • 你为什么声称 iText 不支持 unicode?这不是真的,所以请调整您的问题。

标签: java pdf encoding utf-8 pdfbox


【解决方案1】:

1.8.* 版本不支持使用 Unicode 生成 PDF,但 2.0.* 版本支持。这是 EmbeddedFonts.java 的示例:

public class EmbeddedFonts
{
    public static void main(String[] args) throws IOException
    {
        PDDocument document = new PDDocument();
        PDPage page = new PDPage(PDRectangle.A4);
        document.addPage(page);

        String dir = "../pdfbox/src/main/resources/org/apache/pdfbox/resources/ttf/";
        PDType0Font font = PDType0Font.load(document, new File(dir + "LiberationSans-Regular.ttf"));

        PDPageContentStream stream = new PDPageContentStream(document, page);

        stream.beginText();
        stream.setFont(font, 12);
        stream.setLeading(12 * 1.2);

        stream.newLineAtOffset(50, 600);
        stream.showText("PDFBox Unicode with Embedded TrueType Font");
        stream.newLine();

        stream.showText("Supports full Unicode text ?");
        stream.newLine();

        stream.showText("English русский язык Tiếng Việt");

        stream.endText();
        stream.close();

        document.save("example.pdf");
        document.close();
    }
}

请注意,与 iText 不同,PDFBox 对 PDF 创建的支持非常低,即我们不支持开箱即用的段落或表格。没有教程,但是有很多例子。 API 以 PDF 规范为导向。

【讨论】:

  • 当前 SNAPSHOT 中的字体子集仍有一个小错误:如果在同一页面上您首先使用没有子集的字体 (stream.setFont(font, 12, false);),然后添加一些文本,然后使用相同的带有子集的字体(stream.setFont(font, 12, true);),然后再添加一些文本,到第二次字体设置操作绘制的文本可能不完整。 (但正如我看到最近已修复此上下文中的其他故障,我认为这也将很快修复。);)
【解决方案2】:

当前版本的 Apache PDFBox 无法处理 Unicode,见: https://pdfbox.apache.org/ideas.html

iTextPdf v. 5.x 使用 Unicode 生成 pdf 文件。这里有一个例子: iText 实战:第 11 章:选择正确的字体 part3.chapter11.Unicode 示例 http://itextpdf.com/examples/iia.php?id=199

要运行它,您只需要调整 EncodingExample.FONT 的值并添加一些代码来创建输出文件。

【讨论】:

    猜你喜欢
    • 2016-09-19
    • 2013-11-07
    • 2022-11-25
    • 2015-10-02
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    相关资源
    最近更新 更多