2016-04-27 173 views
0

我試圖使用iTextSharp更改某些PDF註釋中的文本。這是我的代碼:無法更改/註釋的內容

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

當我在Adobe Reader中打開輸出文件時,任何註釋中的文本都沒有改變。我應該如何在註釋中設置新值?

更新:我發現在單擊註釋時出現的彈出框中更改了值。在某些情況下,當我在彈出框中修改此值時,更改將應用​​於註釋。

+0

您不檢查相關注釋是否有外觀流。如果確實如此,則PDF查看器可以選擇僅在該流中預先定義註釋,而不是生成自己的外觀。此外,**內容**可能會或可能不會顯示爲註釋文本,參見參考資料。規範:*應爲註釋顯示的文本,或者,如果此類註釋不顯示文本,則以人類可讀的形式*替代描述註釋的內容。 – mkl

+0

@mkl,我無法弄清楚如何確定是否有外觀流。那是'/ AP'屬性嗎?我檢查了其中一個註釋,它是一個單個條目的值爲'28 0 R'的字典,但是'annotArray'中沒有任何項目具有該值。這個註釋是一個'FreeText',我如何查找和更改顯示在這個文本框中的文本? – sigil

回答

1

正如評論明確了OP:

此註解是一個FreeText,我該如何查找和更改中顯示的有關該文本框中的文本?

自由文本註釋允許多種機制來設置顯示的文本:

  • 甲預格式化外觀流,通過在AP字典
  • A中的Ñ入口參照富文本字符串,默認樣式字符串爲RCDS分別爲
  • 甲默認外觀串應用於DA給出的含量和內容分別

(詳情參見PDF規範ISO 32000-1部分12.5.6.6 免費文本註釋

如果你想改變使用這些機制中的一個文本,請確保您刪除或調整條目的內容爲其他機制;否則您的更改可能在某些查看器中不可見或不可見,但在其他查看器中不可見。

我不知道如何確定是否有外觀流。這是/AP屬性?我檢查了其中一個註釋,它是一個單詞條目,其值爲28 0 R

這樣其中一個註釋確實帶有一個外觀流。 單個條目的值爲28 0 R想必N名稱表示正常的出現。 28 0 R是對物體編號28和代碼0的間接對象的引用。

如果要更改文本內容但不想處理格式詳細信息,應刪除條目。

+0

從每個註釋中刪除** AP **鍵可解決此問題。刪除此密鑰是否存在風險,例如,如果註釋沒有此密鑰,是否存在某些Adobe Reader/Acrobat功能將失敗? – sigil

+0

主要的風險是,有一些簡單的PDF查看器(大多數所謂的預覽器)依賴於呈現流存在,並沒有任何代碼來自己創建它們。在刪除** AP **之後,這些觀看者完全不會呈現您的註釋。 – mkl

+0

是的,我發現他們不顯示在Outlook的預覽。有沒有另外一種方法來完成這個?參見我剛剛發佈的[this question](http://stackoverflow.com/questions/37014984/how-to-read-text-of-appearance-stream);在這兩種情況下,解決方案都涉及識別外觀文本的設置位置。 – sigil