2017-08-27 72 views
1

当我将注释从一个PDF文档复制到另一个PDF文档时,我想更新FreeText注释中的文本内容,但出于某种原因,使用下面显示的方法不能在最终的PDF中更新文本。注释对象更新,但PDF中的最终结果不反映FreeText注释类型的更新内容。奇怪的是,墨水类型注释确实得到了修改后的内容的更新,因为它以粘滞注释的形式显示,并在墨迹注释本身的顶部覆盖注释。itext7更新注释文本

下面是我使用的代码(如果需要的话,我可以添加更多)的快速片段:

foreach (var anno in annots) 
{ 
    var a = anno.GetPdfObject().CopyTo(masterPdfDoc); 

    PdfAnnotation ano = PdfAnnotation.MakeAnnotation(a); 
    var contents = ano.GetContents().ToString(); 
    ano.SetContents(new PdfString("COMMENT: " + contents)); 
    //ano.Put(PdfName.Contents, new PdfString("COMMENT: " + contents)); 

    masterDocPage.AddAnnotation(ano); 
} 

将不胜感激提供任何意见。谢谢

+1

您更新'/ Contents'条目的值,但我没有看到你在任何地方改变了外观('/ AP')。 –

+0

感谢Bruno的快速反应!很高兴得到创建者的回应:-)我对itext7和PDF规范一般都很陌生,所以我不明白外观如何影响文本注释中显示的文本内容。我似乎应该能够更新内容并将其反映出来。我使用GetAppearanceDictionary()和GetAppearanceCharacteristics()来查看数据,我无法弄清楚我需要在那里更改。 –

+0

@BrunoLowagie我也发现这个https://stackoverflow.com/questions/36902331/cant-change-contents-of-annotation后,但无法做任何工作。我试着看着DA,N等,但对我而言,我并不清楚我应该改变什么。我也尝试通过'ano.Remove(PdfName.AP);'在标记的答案中建议删除AP。 –

回答

1

以下代码片段复制并修改1 PDF中的FreeText注释的文本内容(即annot)并将修改后的注释保存到新的PDF中。一大堆代码与this post的答案类似,但是针对iText7进行了更新。

foreach (var anno in annots) 
{ 
    var a = anno.GetPdfObject().CopyTo(masterPdfDoc); 
    PdfAnnotation ano = PdfAnnotation.MakeAnnotation(a); 

    var apDict = ano.GetAppearanceDictionary(); 
    if (apDict == null) 
    { 
     Console.WriteLine("No appearances."); 
     continue; 
    } 
    foreach (PdfName key in apDict.KeySet()) 
    { 
     Console.WriteLine("Appearance: {0}", key); 
     PdfStream value = apDict.GetAsStream(key); 
     if (value != null) 
     { 
      var text = ExtractAnnotationText(value); 
      Console.WriteLine("Extracted Text: {0}", text); 

      if (text != "") 
      { 
       var valueString = Encoding.ASCII.GetString(value.GetBytes()); 
       value.SetData(Encoding.ASCII.GetBytes(valueString.Replace(text, "COMMENT: " + text))); 
      } 
     } 
    } 
    masterDocPage.AddAnnotation(ano); 
} 

public static String ExtractAnnotationText(PdfStream xObject) 
{ 
    PdfResources resources = new PdfResources(xObject.GetAsDictionary(PdfName.Resources)); 
    ITextExtractionStrategy strategy = new LocationTextExtractionStrategy(); 

    PdfCanvasProcessor processor = new PdfCanvasProcessor(strategy); 
    processor.ProcessContent(xObject.GetBytes(), resources); 
    var text = strategy.GetResultantText(); 
    return text; 
}