2016-04-27 4 views
0

Ich versuche, den Text in einigen PDF-Annotationen mit iTextSharp zu ändern. Hier ist mein Code:Kann nicht geändert werden/Inhalt der Annotation

void changeAnnotations(string inputPath, string outputPath) 
    { 
     PdfReader pdfReader = new PdfReader(inputPath); 
     PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(outputPath, FileMode.Create)); 

     //get the PdfDictionary of the 1st page 
     PdfDictionary pageDict = pdfReader.GetPageN(1); 

     //get annotation array 
     PdfArray annotArray = pageDict.GetAsArray(PdfName.ANNOTS); 

     //iterate through annotation array 
     int size = annotArray.Size; 
     for (int i = 0; i < size; i++) 
     { 

      //get value of /Contents 
      PdfDictionary dict = annotArray.GetAsDict(i); 
      PdfString contents = dict.GetAsString(PdfName.CONTENTS); 

      //check if /Contents key exists 
      if (contents != null) 
      { 

       //set new value 
       dict.Put(PdfName.CONTENTS, new PdfString("value has been changed")); 
      } 
     } 
     pdfStamper.Close(); 
    } 

Wenn ich öffnen Sie die Ausgabedatei in Adobe Reader, kein Text in einem der Anmerkungen geändert hat. Wie sollte ich den neuen Wert in einer Anmerkung festlegen?

UPDATE: Ich habe festgestellt, dass der Wert in dem Popup-Fenster geändert wird, das erscheint, wenn ich auf die Anmerkung klicke. Und in einigen Fällen, wenn ich diesen Wert in der Popup-Box ändere, wird die Änderung dann auf die Annotation angewendet.

+0

Sie überprüfen nicht, ob die betreffende Anmerkung einen Aussehensstrom hat. Wenn dies der Fall ist, können PDF-Viewer die Annotation einfach als in diesem Stream definiert anzeigen, anstatt eine eigene Darstellung zu generieren. Darüber hinaus kann der ** Inhalt ** Text für eine Anmerkung sein oder auch nicht, vgl. die Spezifikation: * Text, der für die Annotation angezeigt werden soll, oder, wenn dieser Typ der Annotation keinen Text anzeigt, eine alternative Beschreibung des Annotationsinhalts der in lesbarer Form *. – mkl

+0

@ mkl, kann ich nicht herausfinden, wie man feststellen kann, ob es einen Aussehensstrom gibt. Ist das die '/ AP'-Eigenschaft? Ich habe das für eine der Anmerkungen überprüft und es ist ein Wörterbuch mit einem einzigen Eintrag, dessen Wert "28 0 R" ist, aber keines der Elemente in "annotArray" hat diesen Wert. Diese Annotation ist ein 'FreeText', wie finde und ändere ich den Text, der in diesem Textfeld angezeigt wird? – sigil

Antwort

1

Als OP in einem Kommentar zu klären:

Diese Anmerkung ist ein FreeText, wie kann ich den Text finden und ändern, die in diesem Textfeld angezeigt wird?

Freie Textanmerkungen ermöglichen eine Reihe von Mechanismen, um den angezeigten Text zu setzen:

  • Ein vorformatiert Aussehen Strom, bezogen von dem N Eintrag im AP Wörterbuch
  • A Rich-Text-String mit einem Standard-Style-String gegeben in RC und DS bzw.
  • Eine Standarddarstellung Zeichenfolge auf den Inhalt angewendet in gegeben DA und Inhalt bzw.

(Einzelheiten vgl die PDF-Spezifikation ISO 32000-1 Abschnitt 12.5.6.6 Free Text Annotations)

Wenn Sie den Text mit einer dieser Mechanismen ändern möchten, stellen Sie sicher, dass Sie die Inhalte der Einträge für die anderen Mechanismen entfernen oder anzupassen; Andernfalls ist Ihre Änderung bei einigen Zuschauern möglicherweise nicht sichtbar oder sichtbar, bei anderen jedoch nicht sichtbar.

Ich kann nicht herausfinden, wie man feststellen kann, ob es einen Aussehensstrom gibt. Ist das die /AP Eigenschaft? Ich habe das für eine der Anmerkungen überprüft und es ist ein Wörterbuch mit einem einzelnen Eintrag, dessen Wert 28 0 R ist.

dass also eine der Anmerkungen kommt in der Tat mit einem Auftritt Strom. Der Einzeleintrag, dessen Wert 28 0 R ist, hat vermutlich den N Namen, um die normale Erscheinung anzuzeigen. 28 0 R ist eine Referenz auf das indirekte Objekt mit der Objektnummer 28 und der Generation 0. Wenn Sie den Textinhalt ändern möchten, aber nicht mit den Formatierungsdetails umgehen möchten, sollten Sie den Eintrag AP entfernen.

+0

Durch Entfernen des ** AP ** -Schlüssels aus jeder Anmerkung wurde dieses Problem behoben. Gibt es Risiken beim Entfernen dieses Schlüssels, z. B. gibt es bestimmte Adobe Reader/Acrobat-Funktionen, die fehlschlagen, wenn eine Anmerkung diesen Schlüssel nicht enthält? – sigil

+0

Das Hauptrisiko besteht darin, dass es einige einfache PDF-Viewer (meist sogenannte Previewer) gibt, die darauf angewiesen sind, dass Aussehensströme vorhanden sind und keinen Code haben, um sie selbst zu erstellen. Diese Zuschauer werden Ihre Anmerkung nach der ** AP ** -Entfernung überhaupt nicht rendern. – mkl

+0

Ja, ich habe festgestellt, dass sie in der Vorschau von Outlook nicht angezeigt werden. Gibt es einen anderen Weg, dies zu erreichen? Siehe auch [diese Frage] (http://stackoverflow.com/questions/37014984/how-to-read-text-of-appearance-stream), die ich gerade gepostet habe; In beiden Fällen umfasst die Lösung das Identifizieren, wo der Darstellungstext festgelegt ist. – sigil