2

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

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

       } 

      } 
     } 

ответ

5

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

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

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

Или:

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

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

+0

Я выполнил ваш первый подход и создал временный файл с использованием шаблона, который позже использовался для замены исходного файла. Но поскольку PDF-файл публикуется из SDL Tridion и сохраняется в файловой системе Tridion, мы не можем вносить никаких изменений в исходное-редактировать/удалять его. Evrytime Я пытаюсь удалить исходный код, приведенный ниже: e: \ Web \ Compliance \ NonPCI \ SDL \ wwwroot \ xyzrights \ updatePdf.aspx: строка 150Access к пути 'E: \ Web \ Compliance \ NonPCI \ SDL \ wwwroot \ xyzrights \ Images \ ListPrograming_Part1_AcroForm.pdf 'отклоняется. Пожалуйста, помогите .. – tk2013

+1

Если у вас нет разрешения на удаление файла, у вас, вероятно, также нет разрешения на его обновление. Его разрешения, вероятно, установлены только для чтения. Вам нужно связаться с системным администратором. Это уже не вопрос iText, а вопрос о разрешениях файлов. –

+0

@BrunoLowagie не могли бы вы объяснить это немного больше, пожалуйста? => ** используйте путь к исходному файлу для PdfStamper. ** – jason