【问题标题】:Cyrillic symbols西里尔符号
【发布时间】:2018-02-19 16:16:34
【问题描述】:

我正在使用 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

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

我做错了什么?谢谢!

【问题讨论】:

  • 如果您阅读我在您所引用的示例中添加的评论,您会看到我写道:这是一种快速而肮脏的方法(尤其是非常肮脏)和 你可以严重搞砸布局。在您的情况下,您将一种字体的文本替换为完全不同字体的文本,期望这会简单地工作。没那么简单。你不应该断章取义地使用这个例子。该示例仅适用于 PDF 专家,您不是 PDF 专家。 你在做什么错,不是问题。真正的问题是你没有做错什么!

标签: java pdf itext itext7


【解决方案1】:

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

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

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

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

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

总结: - PDF 不是可编辑的格式!

如果您想做与您的用例类似的事情,请考虑以下选项:

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

【讨论】:

    猜你喜欢
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 2011-12-17
    • 2014-06-01
    • 1970-01-01
    • 2014-03-04
    • 2019-08-18
    相关资源
    最近更新 更多