2016-04-19 5 views
1

Я хочу удалить все аннотации из PDF. Я использую этот код:PdfArray.remove() не удаляет все аннотации

void removeAnnotations(string inputPath,string outputPath) 
     { 
      PdfReader pdfReader = new PdfReader(inputPath); 
      PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(outputPath, FileMode.Create)); 
      PdfDictionary pageDict = pdfReader.GetPageN(1); 
      PdfArray annotArray = pageDict.GetAsArray(PdfName.ANNOTS); 
      for (int i = 0; i < annotArray.Size; i++) 
      { 
       annotArray.Remove(i); 
      } 
      pdfStamper.Close(); 
     } 

Когда я первый создать annotArray, он имеет 217 пунктов. После цикла for annotArray.Remove() у него есть 108 элементов, и я все еще вижу некоторые выноски и строки в PDF, сгенерированные на outputPath. Мне сразу не ясно, что общего у остальных предметов, почему они были пропущены annotArray.Remove(). Как удалить каждую аннотацию?

ответ

4

Предположим, у вас есть 10 элементов в массиве:

array = [a, b, c, d, e, f, g, h, i, j] 

Вы затем цикл по массиву, как это:

for (int i = 0; i < array.Size; i++) 
{ 
    array.Remove(i); 
} 

Тогда это то, что происходит шаг за шагом:

шаг 0

Удалить элемент 0. Результат: [b, c, d, e, f, g, h, i, j]

шаг 1

Удалить элемент 1. Результат: [b, d, e, f, g, h, i, j]

шаг 2

Удалить элемент 2. Результат: [b, d, f, g, h, i, j]

шаг 3

Снять элемент 3. Результат: [b, d, f, h, i, j]

шаг 4

Удалить элемент 4. Результат: [b, d, f, h, j]

шаг 5

Удалить элемент 5. Там нет элемента 5, так что нет ничего Удалить. Результат: [b, d, f, h, j]

шаг 6 до 9

Удалить элемент 6 до 9. Там нет элемента 6 до 9, так что нет ничего, чтобы удалить. Результат: [b, d, f, h, j]

Хотя мой массив насчитывает только 10 элементов, тогда как ваш насчитывает 128, принцип тот же: вы не удаляете все аннотации из-за логической ошибки в коде. Другой тип массива будет генерировать исключение из диапазона исключений, но PdfArray этого не делает, потому что он более терпим к ошибкам PDF-файлов с неполными массивами.

Вы можете исправить свой код, как это:

int n = annotArray.Size; 
for (int i = 0; i < n; i++) 
{ 
    annotArray.Remove(0); 
} 

Или, как вы узнали себя, вы можете удалить все аннотации сразу:

pdfReader.RemoveAnnotations(); 
+1

Как снимать движущуюся цель ...;) – mkl

0

Отказ от ответственности: Я не использовал itextSharp. Мне было любопытно, почему он не должен удалять. Кодекс выглядит нормально. Я искал Google и нашел то, что может вас заинтересовать. Надеюсь, это поможет.

Вы не можете удалить аннотации «на месте» с помощью iTextSharp. Вы должны создать новый PDF на основе оригинала, а способ сделать это - открыть оригинал с помощью PDFReader, использовать RemoveAt, чтобы избавиться от нежелательных аннотаций в памяти, а затем использовать PDFstamper или PDFcopy для . PDF на основе того, что осталось.

Remove Annotation from PDF

Remove Annotation using PDF Object Number

Remove hyperlinks from a PDF document (iTextSharp)

How do I remove link annotations from a PDF using iText?

+2

код не выглядит нормально, потому что ему содержит ошибку против элементарной логики. То, что вы пишете, верно, но OP уже делает это. Он использует 'PdfStamper' для создания нового PDF-файла. –

+0

Спасибо, что указали мою ошибку. С уважением. –

0

Удаление всех аннотаций оказывается довольно легко:

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

      pdfReader.RemoveAnnotations(); 
      pdfStamper.Close(); 
     } 
+1

Это действительно легко, но это не объясняет, почему ваша первоначальная попытка не сработала. Как оказалось, вы сделали логическую ошибку, двигаясь вперед в массиве, удаляя объекты из этого массива. –

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

  • Нет связанных вопросов^_^