Java IText-使用PdfDictionary和PDF压模编辑西班牙语文档

Java IText-使用PdfDictionary和PDF压模编辑西班牙语文档,java,pdf,character-encoding,itext,character-set,Java,Pdf,Character Encoding,Itext,Character Set,我正在尝试使用itext读取文档并替换其中的字符串。但一旦被操纵,所有的西班牙语字符都会变成垃圾字符。下面是更改pdf的代码 PdfReader reader = new PdfReader(src); PdfDictionary dict = reader.getPageN(1); PdfObject object = dict.getDirectObject(PdfName.CONTENTS); if (object instanceof

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

有什么建议吗

您使用

new String(data)
将字节转换为字符串(使用一些默认编码)并

将字符串转换回字节(使用utf-8)

因此,如果第一个操作中的默认编码与utf-8不匹配,这些转换将创建如上所示的人工制品

所以请使用

new String(data, encoding)

相反


也就是说,utf-8在这里是一种非常不合适的编码,请使用类似拉丁语-1/ISO-8559-1的编码



也就是说,您编辑内容的方法只适用于非常特定的PDF。特别是,所用字体的编码必须是winansionoding,并且必须在单个指令中绘制线条或“字段”。此外,替换内容的长度不得超过替换文本的长度,且不得包含Latin-1和WinAnsienceODing不同的字符或在PDF中具有特殊含义的字符,并且必须确保不会在字符串之外更改指令

我不能做++1,因为我的声誉不高,但这对我很有用:::String dataString=new String(数据,“ISO-8859-1”);dataString=dataString.replace(sourceString,replacementString);setData(dataString.getBytes(“ISO-8859-1”);好。不过,要小心下面的警告:如果PDF的制作人发生了变化,您的代码可能会突然停止工作。顺便说一句,你确实不能向上投票,但你可以接受答案,只需点击左上角投票箭头右下方的勾号即可。我自己是从IText创建pdf的,而不是在下面的一些地方更改文本,所以我是本例中的制作人和消费者:)谢谢
new String(data, encoding)
dataString.getBytes(encoding)