2017-02-15 5 views
0

Я написал программу C# для удаления аннотаций без каких-либо действий из файлов PDF. Я использую iTextSharp. Однако в одном из моих файлов удаляется одна непустая аннотация (это действие JavaScript), в то время как другие непустые не удаляются. Это так? Это из-за моего кода или неисправен PDF file?Удаление пустых аннотаций из PDF

using System; 
using System.IO; 
using iTextSharp.text.pdf; 

namespace removeEmpty 
{ 
    class Program 
    { 
     public static void Main() 
     { 
      //Bytes will hold our final PDFs 
      byte[] bytes; 

      using (var ms = new MemoryStream()) { 
       using (var reader = new PdfReader("sandri6.pdf")) { 
        using (var stamper = new PdfStamper(reader, ms)) { 
         for (int i = 1; i <= reader.NumberOfPages; i++) { 
          // get a page a PDF page 
          PdfDictionary page = reader.GetPageN(i); 
          // get all the annotations of page i 
          PdfArray annotationsArray = page.GetAsArray(PdfName.ANNOTS); 

          // if page does not have annotations 
          if (annotationsArray == null) { 
           continue; 
          } 

          // for each annotation 
          for (int j = 0; j < annotationsArray.Size; j++) { 
           // for current annotation 
           PdfDictionary currentAnnotation = annotationsArray.GetAsDict(j); 

           PdfDictionary annotationAction = currentAnnotation.GetAsDict(PdfName.AA); 
           if (annotationAction == null) { 
            annotationsArray.Remove(j); 
            Console.Write("Removed annotation {0} with no action from page {1}\n", j, i); 
           } 
          } 
         } 
        } 
       } 

       //grab the bytes before closing things out 
       bytes = ms.ToArray(); 
      } 

      //write thebytes to disk 
      File.WriteAllBytes("output.pdf", bytes); 
      Console.ReadKey(); 
     } 
    } 
} 

ответ

1

Предоставленный документ содержит 13 аннотаций на единственной странице. И в отличии от вашего предположения (что все аннотации связаны действия), второй не имеет действия, и, следовательно, правильно удален код:

Annotations screenshot

Как вы видите, второй аннотаций в объекте 778 нет записи A.


Таким образом, в случае вашего образца документа ваш код работает правильно.

Помните, что некоторые типы аннотаций могут не только иметь стандартное действие (A), они могут также (или вместо этого!) Иметь дополнительные действия в ответ на различные события триггера. Таким образом, для общего решения вы также должны проверить записи AA в аннотации этих типов.


В коде есть код ошибки, хотя он не запускается в документе образца. В цикле удаления аннотаций мы видим:

for (int j = 0; j < annotationsArray.Size; j++) { 
    // for current annotation 
    PdfDictionary currentAnnotation = annotationsArray.GetAsDict(j); 

    PdfDictionary annotationAction = currentAnnotation.GetAsDict(PdfName.A); 
    if (annotationAction == null) { 
     annotationsArray.Remove(j); 
     Console.Write("Removed annotation {0} with no action from page {1}\n", j, i); 
    } 
} 

Теперь давайте предположим, что мы имеем документ со страницей с двумя последовательными аннотациями без действия. Запустив код для этого документа, только первый будет удален, а не второй, потому что annotationsArray.Remove(j) перемещает аннотацию по адресу j+1 в позицию j, а затем переменная цикла увеличивается, т. Е. Аннотация, следующая за удаленным, не тестируется вообще !

Вы можете исправить это, либо зацикливание в обратном направлении, т.е.

for (int j = annotationsArray.Size - 1; j >= 0; j--) 

или декремента j после annotationsArray.Remove(j) вызова.

. Изолирование назад имеет то преимущество, что выход Console имеет больше смысла, в последнем случае индекс аннотации не всегда представляет индекс в исходном массиве, только в текущем промежуточном массиве.

+0

Благодарим за ответ. Означает ли это, что ** AA ** запись в JavaScript хранит во второй аннотации. Я озадачен тем, что в другом [файле] (https://www.upload.ee/files/6680430/sandri6.pdf.html), где аннотации пусты (Adobe Acrobat так говорит), они не удаляются кодом. Как это исправить? – menteith

+0

@menteith * «Значит ли это, что запись в АА хранит JavaScript во второй аннотации». - Нет. Как вы видите на скриншоте, во второй аннотации нет ни ** ** **, ни ** ** ** **. – mkl

+0

@menteith Относительно другого файла: Я не могу воспроизвести ваше наблюдение. Именно эти аннотации без действия (которые, как представляется, являются аннотациями ссылок вокруг имен авторов) удаляются. И я проверил оба, осмотрев объекты PDF и щелкнув в Acrobat. – mkl

Смежные вопросы