使用/ Annot Widget将没有/ AcroForm字段的PDF展平

时间:2016-11-10 14:18:27

标签: c# pdf itext

我正在努力使用iTextSharp 5.5.10进行扁平化。此代码代表了在SO和Google搜索上找到的代码之后展示此PDF的各种努力。

import org.antlr.v4.runtime.*;
import java.util.List;

public class ParserRuleRewriter {
    private TokenStreamRewriter rewriter;

    public ParserRuleRewriter(ParserRuleContext parserRule, CommonTokenStream tokenStream) {
        Token start = parserRule.getStart();
        Token stop = parserRule.getStop();
        List<Token> ruleTokens = tokenStream.getTokens(start.getTokenIndex(), stop.getTokenIndex());
        ListTokenSource tokenSource = new ListTokenSource(ruleTokens);
        CommonTokenStream commonTokenStream = new CommonTokenStream(tokenSource);
        commonTokenStream.fill();
        rewriter = new TokenStreamRewriter(commonTokenStream);
    }

    public void replace(Token token, ParserRuleContext rule) {
        rewriter.replace(token, rule.getText());
    }

    @Override
    public String toString() {
        return rewriter.getText();
    }
}

有关如何将“字段”转换为文本的任何提示,请参阅Acrobat?

This是我试图压扁的PDF。

This是此代码的输出。

1 个答案:

答案 0 :(得分:1)

问题是您的表单已损坏。它确实有/Annots,这些注释是小部件注释,它们的条目也是字段字典中的条目,但是没有形式PDF。或者更确切地说:有一个表单,但/Fields数组为空。

由于/Fields数组为空,因此没有要展平的字段。小部件注释已删除,您无法看到任何内容。这不是iText错误:您需要在填写之前修复表单。

在Java中,您可以修复如下表单:

PdfReader reader = new PdfReader(src);
PdfDictionary root = reader.getCatalog();
PdfDictionary form = root.getAsDict(PdfName.ACROFORM);
PdfArray fields = form.getAsArray(PdfName.FIELDS);

PdfDictionary page;
PdfArray annots;
for (int i = 1; i <= reader.getNumberOfPages(); i++) {
    page = reader.getPageN(i);
    annots = page.getAsArray(PdfName.ANNOTS);
    for (int j = 0; j < annots.size(); j++) {
        fields.add(annots.getAsIndirectObject(j));
    }
}
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
stamper.close();
reader.close();

将它移植到C#应该相当容易。我不是C#开发人员,但这是一个(未经测试的)尝试创建端口:

PdfReader reader = new PdfReader(src);
PdfDictionary root = reader.Catalog;
PdfDictionary form = root.GetAsDict(PdfName.ACROFORM);
PdfArray fields = form.GetAsArray(PdfName.FIELDS);
PdfDictionary page;
PdfArray annots;
for (int i = 1; i <= reader.NumberOfPages; i++) {
    page = reader.GetPageN(i);
    annots = page.GetAsArray(PdfName.ANNOTS);
    for (int j = 0; j < annots.Size; j++) {
        fields.Add(annots.GetAsIndirectObject(j));
    }
}
PdfStamper stamper = new PdfStamper(reader, new FileStream(dest, FileMode.Create));
stamper.Close();
reader.Close();

一旦你修好了这样的表格,你就可以正确地压扁它。