【问题标题】:Replace text field itext替换文本字段 itext
【发布时间】:2017-02-22 11:14:47
【问题描述】:

我尝试使用官方 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();
         }
      }
}

我的文档只有文本“HOLA MUNDO”。

这是我认为包含我的数据的流:

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 

为什么我看不到文字?

谢谢

【问题讨论】:

  • 很可能,您的文本已“优化” - 转换为字形而不映射到原始字符。 “HOLA MUNDO”在[&lt;01&gt;-2&lt;02&gt;-2&lt;03&gt;2&lt;04&gt;55&lt;0506&gt;-2&lt;07&gt;5&lt;08&gt;-2&lt;09&gt;5&lt;02&gt;] 中被描述,其中 O 是符号 - 请注意,它在最后一个字符中重复使用。
  • @Lyth 不一定没有映射到原始字符​​i>:我相当乐观地认为 OpenOffice 会为匹配的字体定义添加足够的 ToUnicode 映射允许文本提取。

标签: pdf replace stream itext


【解决方案1】:

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

  1. 使用标准字体编码(WinAnsiEncodingMacRomanEncoding);
  2. 在其文本绘制指令参数中使用文字字符串(不是十六进制字符串);和
  3. 将要替换的占位符/字符序列放入单个文本绘图指令字符串参数中。

虽然这些假设在早期 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 09 02 进行编码。(这种特殊编码通常用于嵌入字体子集。)

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

  3. 您的搜索字符串中只有两个字形“M”=&lt;0506&gt; 位于同一个 PDF 字符串对象中,所有其他字形都由小位移分隔,很可能用于字距调整。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 2019-03-13
    相关资源
    最近更新 更多