我尝试使用oficial itext页面的示例替换OpenOffice创建的PDF文本,但我不能
http://developers.itextpdf.com/examples/stamping-content-existing-pdfs-itext5/replacing-pdf-objects
我将所有流提取到文件中,但我没有对要替换的文本进行本地化。
这是操纵PDF的一个例子:
public void manipulatePdf(PdfReader reader,String temp) throws IOException, DocumentException {
PdfObject obj;
for (int i = 1; i <= reader.getXrefSize(); i++) {
obj = reader.getPdfObject(i);
if (obj != null && obj.isStream()) {
PRStream stream = (PRStream)obj;
byte[] b;
try {
b = PdfReader.getStreamBytes(stream);
String p = new String(b);
//stream.setData(new String(p).replace("firmantes", "HELLO WORLD").getBytes());
stream.setData(p.replace("HOLA MUNDO", "mamamamamamamam").getBytes());
}
catch(UnsupportedPdfException e) {
b = PdfReader.getStreamBytesRaw(stream);
}
FileOutputStream fos = new FileOutputStream(String.format(DEST_STREAMS, i));
fos.write(b);
fos.flush();
fos.close();
}
}
}
我的文档只有文字&#34; HOLA MUNDO&#34;。
这是我认为包含我的数据的流:
0.1 w
q 0 0.1 595.2 841.8 re
W* n
q 0 0 0 rg
BT
56.8 774.1 Td /F1 12 Tf[<01>-2<02>-2<03>2<04>55<0506>-2<07>5<08>-2<09>5<02>]TJ
ET
Q
Q
为什么我看不到文字?
由于
答案 0 :(得分:2)
请不要在现实生活中使用该iText示例,除非您确定只处理哪些文件
虽然这些假设在早期PDF版本的许多PDF文档中都是正确的,但现在越来越多的文档打破了这些假设。因此,其他一些PDF库已经删除了与您从其分布和站点中引用的示例等效的示例。
对于您的文档,实际上没有任何假设成立:
使用自定义ad-hoc编码:
1 : "H"
2 : "O"
3 : "L"
4 : "A"
5 : " "
6 : "M"
7 : "U"
8 : "N"
9 : "D"
因此,“HOLA MUNDO”使用字节01 02 03 04 05 06 07 08 02进行编码。(这种ad-hoc编码通常用于嵌入字体子集。)
使用十六进制字符串(斜角括号中的十六进制数字)。
搜索字符串中只有两个字形“M”= <0506>
位于同一个PDF字符串对象中,所有其他字形由小位移分隔,最有可能是字距调整。