西里尔符号

Cyrillic symbols

我正在使用 iText7。
我的 class 在服务器上处理 pdf 文件(这是一个带有西里尔符号的模板)。

首先我阅读了文档。 其次,我编辑了一些信息并尝试将其保存在我的本地机器上,但我遇到了问题。我的新文本显示不正确。

如果我用 ttf 字体创建一个新的 pdf 文件并将其添加到新创建的 pdf 文件中,一切正常,但如果我修改我的模板,文本不正确(仅适用于西里尔符号)。

我正在尝试使用来自官方网站的简单示例之一 - http://developers.itextpdf.com/examples/stamping-content-existing-pdfs/clone-replacing-pdf-objects

这是我的代码的相关部分:

PdfDocument document = new PdfDocument(new PdfReader(template), new PdfWriter(dest));
        PdfPage page = document.getFirstPage();
        PdfDictionary dictionary = page.getPdfObject();
        PdfObject object = dictionary.get(PdfName.Contents);

        if (object instanceof PdfStream) {
            PdfStream stream = (PdfStream) object;
            byte[] data = stream.getBytes(true);

            stream.setData(new String(data).replace("user_fio", "Петров А.А.").getBytes("utf-8"));
}
document.close();

我正在尝试使用语言环境:http://www.oracle.com/technetwork/java/javase/javase7locales-334809.html

但结果是“?????? ?.?”。或类似的东西。

我做错了什么?谢谢!

PDF 不是所见即所得的格式。您不能希望简单地替换内容流中的信息并获得漂亮的 pdf。 这有两个原因

  1. PDF 文档将其信息存储在对象中。为了能够引用对象,存储了一个字节偏移量。如果你开始替换数据,你就会搞砸这个内部 table 的字节偏移量。

  2. PDF 文档不包含这样的文本。您应该将它们更多地视为指令的容器。改变指令的顺序,或者某些指令的内容是不会得到你想要的结果的。

    重排(在插入、删除或替换文本时自动布置文本)无法在文档中动态完成。当您使用像您这样的代码时,它(几乎总是)会弄乱回流。

    也有例外。在网站上的一个示例中,单词 "World" 被替换为 "Bruno"。这是有效的,因为 "World" 和 "Bruno" 具有相同数量的字母(因此具有相同数量的字节),并且在我提到的示例中,它们显示为各自行的最后一个单词。所以回流焊不是问题。

总结: - PDF 不是 editable 格式!

如果您想执行与您的用例类似的操作,请考虑以下选项:

  • 每次都从头开始生成 PDF
  • 使用表单(XFA 或 Acro)来拥有某种可以接受动态内容的字段
  • 使用 pdfHTML
  • 将 HTML(动态生成)转换为 PDF