Как обновить PDF без создания нового PDF?

Мне необходимо заменить слово в существующем PDF AcroField на другое слово. Я использую PDFStamper из iTEXTSHARP, чтобы сделать то же самое, и он работает нормально. Но при этом необходимо создать новый PDF, и я бы хотел, чтобы это изменение было отражено в самом существующем PDF. Если я задаю имя файла назначения так же, как и исходное имя файла, изменения не отображаются. Я новичок в iTextSharp, я что-то не так делаю? Пожалуйста, помогите.. Я предоставляю часть кода, который я использую

  private void ListFieldNames(string s)
    {
        try
        {
            string pdfTemplate = @"z:\TEMP\PDF\PassportApplicationForm_Main_English_V1.0.pdf";
            string newFile = @"z:\TEMP\PDF\PassportApplicationForm_Main_English_V1.0.pdf";
            PdfReader pdfReader = new PdfReader(pdfTemplate);

            for (int page = 1; page <= pdfReader.NumberOfPages; page++)
            {
                PdfReader reader = new PdfReader((string)pdfTemplate);
                using (PdfStamper stamper = new PdfStamper(reader, new FileStream(newFile, FileMode.Create, FileAccess.ReadWrite)))
                {
                    AcroFields form = stamper.AcroFields;
                    var fieldKeys = form.Fields.Keys;
                    foreach (string fieldKey in fieldKeys)
                    {
                        //Replace Address Form field with my custom data
                        if (fieldKey.Contains("Address"))
                        {
                            form.SetField(fieldKey, s);
                        }    
                    }
                    stamper.FormFlattening = true;
                    stamper.Close();

                }

            }
        }

1 ответ

Как задокументировано в моей книге " iText in Action", вы не можете читать и записывать файлы одновременно. Подумайте, как работает Word: вы не можете открыть документ Word и писать прямо в него. Word всегда создает временный файл, записывает в него изменения, затем заменяет исходный файл им и затем выбрасывает временный файл.

Вы можете сделать это тоже:

  • читать оригинальный файл с PdfReader,
  • создать временный файл для PdfStamperи когда вы закончите,
  • замените исходный файл временным файлом.

Или же:

  • прочитать оригинальный файл в byte[],
  • Создайте PdfReader с этим byte[], а также
  • использовать путь к исходному файлу для PdfStamper,

Этот второй вариант более опасен, так как вы потеряете исходный файл, если сделаете что-то, вызывающее исключение в PdfStamper,

Другие вопросы по тегам