西里尔符号

时间:2017-09-11 12:08:01

标签: java pdf itext itext7

我使用的是iText7 我的班级在服务器上使用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

但结果是" ????? ??"或类似的东西。

我做错了什么?谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

  2. PDF文档不包含此类文本。您应该将它们视为指令的容器。更改指令的顺序或某些指令的内容不会得到您想要的结果。

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

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

  3. 要点: - PDF不是可编辑的格式!

    如果您想要使用类似于您的用例的内容,请考虑以下选项:

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