替换文本字段itext

时间:2017-02-22 11:14:48

标签: pdf replace stream itext

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

为什么我看不到文字?

由于

1 个答案:

答案 0 :(得分:2)

请不要在现实生活中使用该iText示例,除非您确定只处理哪些文件

  1. 使用标准字体编码( WinAnsiEncoding MacRomanEncoding );
  2. 在文本绘图指令参数中使用文字字符串(不是十六进制字符串);和
  3. 将您的占位符/字符序列替换为单个文本绘图指令字符串参数。
  4. 虽然这些假设在早期PDF版本的许多PDF文档中都是正确的,但现在越来越多的文档打破了这些假设。因此,其他一些PDF库已经删除了与您从其分布和站点中引用的示例等效的示例。

    对于您的文档,实际上没有任何假设成立:

    1. 使用自定义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编码通常用于嵌入字体子集。)

    2. 使用十六进制字符串(斜角括号中的十六进制数字)。

    3. 搜索字符串中只有两个字形“M”= <0506>位于同一个PDF字符串对象中,所有其他字形由小位移分隔,最有可能是字距调整。