Есть две основные проблемы с кодом. @ Ник его ответ уже указал первый: если во втором проходе вы хотите отредактировать версию вашего документа, содержащую изменения с первого прохода, вы должны взять выходной документ первого прохода в качестве ввода второго прохода, а не снова исходного шаблона. Он также представил код, который исправил эту проблему.
Второй номер находится здесь:
if (File.Exists(OutputPath + outputFile))
{
pdfStamper = new PdfStamper(reader, new FileStream(OutputPath + outputFile,
FileMode.Append, FileAccess.Write));
}
else
{
pdfStamper = new PdfStamper(reader, new FileStream(OutputPath + outputFile,
FileMode.Create));
}
Если выходной файл уже существует, вы добавляете к нему вывод вашего PdfStamper
. Это не верно! Выходные данные PdfStamper
уже содержат содержимое исходного PDF (из PdfReader
), поскольку оно не изменяется. Таким образом, ваш код эффективно создает конкатенацию полного выходного PDF первого прохода и полного выходного PDF второго прохода.
PDF - это двоичный формат, для которого объединение подобных файлов не приводит к действительному PDF-файлу. Таким образом, программа просмотра PDF, загружающая ваш конечный результат, пытается восстановить этот двойной PDF, предполагая, что он является единственным. Результат может или не может выглядеть так, как вы хотите.
Чтобы устранить вторую проблему, просто замените if{...}else{...}
выше содержимым только ветки else
:
pdfStamper = new PdfStamper(reader, new FileStream(OutputPath + outputFile,
FileMode.Create));
(FileMode.Create
определяется как
Указывает, что операционная система должна создать новый файл. Если файл уже существует, он будет перезаписан. Это требует разрешения Write
. FileMode.Create
эквивалентно запросу, что если файл не существует, используйте CreateNew
; в противном случае используйте Truncate
. Если файл уже существует, но является скрытым, выдается исключение UnauthorizedAccessException
.
Таким образом, он также будет выполнять необходимые действия, если файл уже существует.)
Вы можете распознать проблемы кода с Append
, запустив его несколько раз и наблюдая, как выходной файл растет и растет по мере необходимости. Кроме того, если вы откроете этот файл в Adobe Reader и закроете снова, Adobe Reader предложит сохранить изменения; изменения - ремонтные работы.
Возможно, вы слышали о инкрементных обновлениях PDF-файлов, где изменения добавлены в исходный PDF. Но это отличается от простой конкатенации, ревизии в результате специально связаны, а смещения всегда рассчитываются с начала первой ревизии, а не с начала текущей ревизии. Кроме того, инкрементные обновления должны содержать только измененных объектов.
iText содержит конструктор PdfStamper
с 4 параметрами, включая последний логический параметр append
. Использование этого конструктора и установка append
в true
заставляет iText создавать инкрементные обновления. Но даже здесь вы не используете FileMode.Append
...