2017-08-27 3 views
1

Ich möchte den Textinhalt innerhalb einer FreeText-Annotation aktualisieren, wenn ich die Annotation von einem PDF-Dokument in ein anderes kopiere, aber aus irgendeinem Grund wird der Text im endgültigen PDF nicht mit dem unten gezeigten Ansatz aktualisiert. Das Annotationsobjekt wird aktualisiert, aber das Endergebnis in der PDF-Datei spiegelt nicht den aktualisierten Inhalt für den Annotationstyp FreeText wider. Seltsamerweise werden Tintentyp-Anmerkungen mit dem überarbeiteten Inhalt aktualisiert, da er in Form eines Haftnotizen-Kommentars angezeigt wird, der über der Ink-Anmerkung selbst eingeblendet wird.itext7 update annotation text

Hier ist ein kurzer Ausschnitt aus dem Code, den ich verwendet habe (benötigt, wenn ich kann mehr hinzugefügt werden):

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); 
} 

Würde schätzt eine Beratung zur Verfügung gestellt. Danke

+1

Sie aktualisieren den Wert des Eintrags '/ Contents', aber ich sehe nicht, dass Sie das Aussehen ('/AP') ändern. –

+0

Danke für die schnelle Antwort Bruno! Schön, eine Antwort vom Ersteller zu bekommen :-) Ich bin ziemlich neu bei itext7 und den PDF-Spezifikationen im Allgemeinen, daher verstehe ich nicht, wie sich das Aussehen auf den Textinhalt auswirkt, der in der Textanmerkung präsentiert wird. Es scheint, dass ich nur in der Lage sein sollte, den Inhalt zu aktualisieren, und es spiegelt sich wider. Ich habe mir die Daten mit GetAppearanceDictionary() und GetAppearanceCharacteristics() angeschaut und kann nicht herausfinden, was ich dort ändern müsste. –

+0

@BrunoLowagie Ich fand auch diese https://stackoverflow.com/questions/36902331/cant-change-contents-of-annotation Beitrag, war aber nicht in der Lage, etwas zu arbeiten. Ich habe versucht, den DA, N usw. zu sehen, aber es ist mir nicht klar, was ich ändern soll. Ich habe auch versucht, den AP ganz zu entfernen, wie in der markierten Antwort über 'ano.Remove (PdfName.AP); –

Antwort

1

Das folgende Code-Snippet kopiert und ändert den Textinhalt von FreeText-Anmerkungen aus 1 PDF (d. H. Anmerkungen) und speichert die geänderten Anmerkungen in einem neuen PDF. Ein guter Teil des Codes ist der Antwort von this post ähnlich, wurde aber für iText7 aktualisiert.

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; 
}