我正在努力使用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是此代码的输出。
答案 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();
一旦你修好了这样的表格,你就可以正确地压扁它。