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 编辑西班牙语文档的主要内容,如果未能解决你的问题,请参考以下文章

新手如何使用itext7生成pdf盖章

使用 iText 将字体嵌入 PDF 文件

Itext 7 - PdfReader 未使用所有者密码错误打开

使用 itext 7 在 PDF 中添加新页面

我们可以使用 iText 压缩 PDF 文件的大小吗?

作家无法解决itext