.net,Itextsharp,如何压扁评论(特别是邮票)?

时间:2014-03-19 22:49:57

标签: .net pdf itextsharp acrobat flatten

简而言之,我有特别的问题"扁平化"使用Itextsharp在PDF格式中标记注释。我正在寻找的效果与您在打印到PDF"时所获得的效果相同。来自Acrobat(不能再移动/编辑标记等等,但您仍然可以选择它可能具有的任何文本)。使用一些非常简单的Javascript代码似乎也很好(this.flattenPages)。

这个问题似乎特别适用于邮票,这是它的真正伎俩。我已成功使用pdfstamper类来使用以下方法展平其他类型的页面注释和注释(例如文本框):

   stamper.FormFlattening = True 
   stamper.FreeTextFlattening = True

但这对我尝试过的任何邮票都不起作用(默认包含在Acrobat或用户创建的邮票中)。该文档在另一端以相同的可编辑图章出现。所以...任何想法?如果我能提供任何其他信息,请告诉我。谢谢。

更新:显然这与其他注释不同。无论它的价值如何,邮票(特别是)都显示为过度的。如何更改标志或以其他方式将其合并/展平到页面上是我无法找到的文档。

1 个答案:

答案 0 :(得分:1)

感谢mkl的评论(见上文)指出了我正确的方向,我找到了解决方案。这是对此修复的非常简略的解释:

我下载并编辑了Itextsharp的源代码,并使用我需要的小改动重新编译了.dll。显然还有其他途径,但事实证明这是最简单,最优雅的解决方案。它实际上只需要在本代码中包含一些额外的OR语句。我想指出,这可能是目前未包含在官方图书馆中的原因,所以买家要小心:

在PdfStamperImp类中,需要进行一些小的编辑,使其平整邮票并完全按照我的意愿行事。对FlatFreeTextFields过程进行了所有更改:

if (!(annDic.Get(PdfName.SUBTYPE)). Equals(PdfName.FREETEXT)) 
                    continue;
}

更改为:

if (!(annDic.Get(PdfName.SUBTYPE)).Equals(PdfName.FREETEXT) | (annDic.Get(PdfName.SUBTYPE)).Equals(PdfName.STAMP)) {
                    continue;
}

if (PdfName.FREETEXT.Equals(annot.Get(PdfName.SUBTYPE))) {
            annots.Remove(idx);
            --idx;
}

更改为:

if (PdfName.FREETEXT.Equals(annot.Get(PdfName.SUBTYPE)) | PdfName.STAMP.Equals(annot.Get(PdfName.SUBTYPE))) {
           annots.Remove(idx);
           idx -= 1;
}

正如您所看到的,它并不是世界上最复杂的变化。从这里开始,你只需像普通一样调用stamper.freetextflatten = true,它现在也可以获得邮票。理论上你也可以完全摆脱这些陈述,它会(至少尝试)用你页面上的所有注释来做这件事。我怀疑这可能不是一个安全的想法,但我无法确定。