Как обновить 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
,