IText - 使用 PdfDictionary 和 PDF Stamper 编辑西班牙语文档
Posted
技术标签:
【中文标题】IText - 使用 PdfDictionary 和 PDF Stamper 编辑西班牙语文档【英文标题】:IText - Edit Spanish Document Using PdfDictionary and PDF Stamper 【发布时间】:2018-04-14 09:20:11 【问题描述】:我正在尝试使用 itext 读取文档并替换其中的字符串。但是一旦被操纵,所有的西班牙字符都会变成垃圾字符。下面是修改pdf的代码。
PdfReader reader = new PdfReader(src);
PdfDictionary dict = reader.getPageN(1);
PdfObject object = dict.getDirectObject(PdfName.CONTENTS);
if (object instanceof PRStream)
PRStream stream = (PRStream) object;
byte[] data = PdfReader.getStreamBytes(stream);
String dataString = new String(data);
dataString = dataString.replace(sourceString, replacementString);
stream.setData(dataString.getBytes("UTF-8"));
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
stamper.close();
reader.close();
在实际的 pdf 中有一个字符串 $address-line-one 我将其替换为“20th Street”
这可行,但使用流中的这个西班牙语单词
Documentación 变成 Documentaci�n
其他西班牙语单词也一样。
我还在 java 控制台中打印了 bytes[],发现读取本身没有正确获取该字符。
有什么建议吗?
【问题讨论】:
【参考方案1】:你使用
new String(data)
将字节转换为字符串(使用一些默认编码)和
dataString.getBytes("UTF-8")
将字符串转回字节(使用 utf-8)。
因此,如果第一个操作中的默认编码与 utf-8 不匹配,这些转换将创建如上所示的伪像。
所以请使用
new String(data, encoding)
和
dataString.getBytes(encoding)
相反。
话虽如此,utf-8 在这里是一种非常不合适的编码,请改用 Latin-1 / ISO-8559-1 的内容。
也就是说,您编辑内容的方法仅适用于非常特定的 PDF。特别是所用字体的编码必须是 WinAnsiEncoding 并且行或“字段”必须在每个指令中绘制。此外,您的替换内容不能比被替换的文本长很多,并且不能包含 Latin-1 和 WinAnsiEncoding 不同的字符或在 PDF 中具有特殊含义的字符,并且您必须确保不会偶然更改字符串。
【讨论】:
不能做 ++1,因为我的声誉并不高,但这对我有用::: String dataString = new String(data, "ISO-8859-1");dataString = dataString.replace(sourceString, replacementString);stream.setData(dataString.getBytes("ISO-8859-1")); 好。但是,请注意下面的警告:如果您的 PDF 的制作者会改变,您的代码可能会突然停止工作。顺便说一句,你确实不能投票,但你可以接受一个答案,只需点击左上角的勾号,就在投票箭头的正下方。 我自己正在从 IText 创建 pdf,而不是在某些地方更改文本,所以在这种情况下,我是生产者和消费者 :) 谢谢以上是关于IText - 使用 PdfDictionary 和 PDF Stamper 编辑西班牙语文档的主要内容,如果未能解决你的问题,请参考以下文章