Не знаю, как у вас две части работают вместе, но вот как я это сделал для своего приложения.
По сути, я отделяю штампование от добавления структурированного контента и затем объединяю результаты в один большойPDF.Вы можете попробовать сделать все это вместе за один большой шаг, используя table.WriteSelectedRows
(который принимает PdfContentByte
в качестве одного из аргументов), но время, которое мне приходится тратить на макеты вручную, имеет тенденцию перевешивать выгоду от того, что этовсе сделано за один шаг (кроме того факта, что он становится одним огромным методом, который трудно поддерживать / повторно использовать)
Для разъяснения и тестирования я использовал FileStream, но, конечно, то же самое прекрасно работает с MemoryStreamи повторно использовать потоки, если в итоге вы создадите одну монолитную функцию в своем коде разработки.
Вот мое тестовое приложение, которое я использовал для подтверждения кода и запуска вашего сценария:
Шаги:
- Создать Test2.pdf (штампованное содержимое оригинального источника) из Test.pdf (наш оригинальный источник)
- Создать Test3.pdf (содержащий весь наш контент, который будет добавлен в конце)
- Откройте Test2.pdf & Test3.pdf и объедините их в финальный поток Test4.pdf
Примечание. Я не использовал код для печати изображений, и вы можетепридется настроить using
на Document
в первом разделе, если PdfStamper
также закрывает базовый Document
(не могу вспомнить, если это происходит с моей головы, но это вызовет полезное исключение в случае, если вам нужноскорректируйте оператор using
)
private static void Main(string[] args)
{
using (FileStream ms = new FileStream("C:\\Test2.pdf", FileMode.Create))
using (FileStream formFile = new FileStream("C:\\Test.pdf", FileMode.Open))
{
PdfReader reader = new PdfReader(formFile);
using (Document document = new Document(reader.GetPageSizeWithRotation(1)))
{
//PdfStamper outStamper = new PdfStamper(reader, ms);
//PdfContentByte body = outStamper.GetOverContent(reader.NumberOfPages);
//document.Open(); //Open document to work with
//AcroFields fields = outStamper.AcroFields;
//// UPDATE THE FORM FIELDS
//fields.SetField("Text1", "John Smith");
//fields.SetField("Text2", "1234567890");
//fields.SetField("Text3", "1234567890");
////ADD LOGO
//iTextSharp.text.Image headerlogo = iTextSharp.text.Image.GetInstance(Server.MapPath("logo.jpg"));
//headerlogo.ScaleToFit(140, 399);
//headerlogo.Alignment = iTextSharp.text.Image.UNDERLYING;
//headerlogo.SetAbsolutePosition(200, 500);
//body.AddImage(headerlogo);
//outStamper.Close();
}
}
using (FileStream ms = new FileStream("C:\\Test3.pdf", FileMode.Create))
using (FileStream formFile = new FileStream("C:\\Test2.pdf", FileMode.Open))
{
PdfReader reader = new PdfReader(formFile);
using (Document document = new Document(reader.GetPageSizeWithRotation(1)))
{
PdfWriter pdfWriter = PdfWriter.GetInstance(document, ms);
document.Open();
PdfPTable table = new PdfPTable(3);
PdfPCell cell = new PdfPCell(new Phrase("Header spanning 3 columns")) { Colspan = 3, BorderWidth = 5, HorizontalAlignment = 1 };
table.AddCell(cell);
table.AddCell("Col 1 Row 1");
table.AddCell("Col 2 Row 1");
table.AddCell("Col 3 Row 1");
table.AddCell("Col 1 Row 2");
table.AddCell("Col 2 Row 2");
table.AddCell("Col 3 Row 2");
table.CompleteRow(); //Added - table won't add the final row if its cells are incomplete - safe to have it ending a table
document.Add(table);
}
}
using (FileStream ms = new FileStream("C:\\Test4.pdf", FileMode.Create))
using (FileStream stampedfile = new FileStream("C:\\Test2.pdf", FileMode.Open))
using (FileStream appendfile = new FileStream("C:\\Test3.pdf", FileMode.Open))
{
PdfReader stampedContentReader = new PdfReader(stampedfile);
PdfReader appendContentReader = new PdfReader(appendfile);
using (Document document = new Document(stampedContentReader.GetPageSizeWithRotation(1)))
{
PdfCopy pdfCopy = new PdfCopy(document, ms);
document.Open();
for (int i = 1; i <= stampedContentReader.NumberOfPages; i++)
pdfCopy.AddPage(pdfCopy.GetImportedPage(stampedContentReader, i));
for (int i = 1; i <= appendContentReader.NumberOfPages; i++)
pdfCopy.AddPage(pdfCopy.GetImportedPage(appendContentReader, i));
}
}
}
Надеюсь, это поможет.