gpt4 book ai didi

java - IText - 使用 PdfDictionary 和 PDF Stamper 编辑西类牙语文档

转载 作者:行者123 更新时间:2023-12-02 12:03:38 32 4
gpt4 key购买 nike

我正在尝试使用 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)

将字节转换为字符串(使用某种默认编码)和

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

关于java - IText - 使用 PdfDictionary 和 PDF Stamper 编辑西类牙语文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47065334/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com