西里尔符号
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。
这有两个原因
PDF 文档将其信息存储在对象中。为了能够引用对象,存储了一个字节偏移量。如果你开始替换数据,你就会搞砸这个内部 table 的字节偏移量。
PDF 文档不包含这样的文本。您应该将它们更多地视为指令的容器。改变指令的顺序,或者某些指令的内容是不会得到你想要的结果的。
重排(在插入、删除或替换文本时自动布置文本)无法在文档中动态完成。当您使用像您这样的代码时,它(几乎总是)会弄乱回流。
也有例外。在网站上的一个示例中,单词 "World" 被替换为 "Bruno"。这是有效的,因为 "World" 和 "Bruno" 具有相同数量的字母(因此具有相同数量的字节),并且在我提到的示例中,它们显示为各自行的最后一个单词。所以回流焊不是问题。
总结:
- PDF 不是 editable 格式!
如果您想执行与您的用例类似的操作,请考虑以下选项:
- 每次都从头开始生成 PDF
- 使用表单(XFA 或 Acro)来拥有某种可以接受动态内容的字段
- 使用 pdfHTML
将 HTML(动态生成)转换为 PDF
我正在使用 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。 这有两个原因
PDF 文档将其信息存储在对象中。为了能够引用对象,存储了一个字节偏移量。如果你开始替换数据,你就会搞砸这个内部 table 的字节偏移量。
PDF 文档不包含这样的文本。您应该将它们更多地视为指令的容器。改变指令的顺序,或者某些指令的内容是不会得到你想要的结果的。
重排(在插入、删除或替换文本时自动布置文本)无法在文档中动态完成。当您使用像您这样的代码时,它(几乎总是)会弄乱回流。
也有例外。在网站上的一个示例中,单词 "World" 被替换为 "Bruno"。这是有效的,因为 "World" 和 "Bruno" 具有相同数量的字母(因此具有相同数量的字节),并且在我提到的示例中,它们显示为各自行的最后一个单词。所以回流焊不是问题。
总结: - PDF 不是 editable 格式!
如果您想执行与您的用例类似的操作,请考虑以下选项:
- 每次都从头开始生成 PDF
- 使用表单(XFA 或 Acro)来拥有某种可以接受动态内容的字段
- 使用 pdfHTML 将 HTML(动态生成)转换为 PDF