0

我正在尝试使用 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[] ,发现读取本身没有正确获取该字符。

有什么建议吗?

4

1 回答 1

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 中具有特殊含义的字符,并且您必须确保不会偶然更改字符串。

于 2017-11-02T05:33:04.107 回答