我有一个4 x A4页的PDF表格。我使用iTextSharp填写字段。这一部分都很好。
然后,我需要将许多这些表单合并为一个PDF文档。计划使用这种方法:Using iTextSharp to generate multiple page PDF from existing PDF Form。
然而,这些A4页需要合并成一张A3纸,打印在一本小册子中。类型配置,即正面和背面,如下面
A3 Front ----- turn over ----> A3 Back
------------------------------- -------------------------------
| | | | | |
| | | | | |
| | | | | |
| Page | Page | | Page | Page |
| 4 | 1 | | 2 | 3 |
| | | | | |
| | | | | |
| | | | | |
------------------------------- -------------------------------
(ascii ftw)
当A3被折成两半时,它会读取(从左到右),第1页,第2页,第3页,第4页。然后,我将以这种方式组合所有已完成的表单,然后打印整个PDF A3背靠背的文件。
我发现这篇文章(http://forums.asp.net/t/1692347.aspx?Merging+two+pdf+pages+into+one+using+itextsharp)提到在页面上放置一个PdfPTable,然后抓取页面的图像,并将其嵌入表格单元格中......
如果我这样做了,PDF文件不会很大,因为它基本上都是图像?有没有更好的方法来实现这一目标?
答案 0 :(得分:1)
想出来......按照这种方法:
using (var copyms = new MemoryStream())
{
var document = new Document();
using (PdfSmartCopy copy = new PdfSmartCopy(document, copyms))
{
document.Open();
foreach (var item in Items)
{
// Read the template
var pdfReader = new PdfReader(TemplateLocation);
// Save the current completed template to a MemoryStream
using (var ms = new MemoryStream())
{
using (PdfStamper stamper = new PdfStamper(pdfReader, ms))
{
var fields = stamper.AcroFields;
// Set the field values here
stamper.FormFlattening = true;
}
pdfReader = new PdfReader(ms.ToArray());
// Copy the memorystream to the main document
copy.AddDocument(pdfReader);
}
}
}
document.CloseDocument();
// Combine on A3 pages in new document
var a3doc = new Document(PageSize.A3.Rotate(), 0, 0, 0, 0);
var a3reader = new PdfReader(copyms.ToArray());
var a3writer = PdfWriter.GetInstance(a3doc, new FileStream(outputFileLocation, FileMode.Create));
a3doc.Open();
var a3cb = a3writer.DirectContent;
PdfImportedPage page;
int totalPages = a3reader.NumberOfPages;
for (int i = 1; i <= (int)Math.Ceiling(totalPages / 2); i++)
{
// Create an A3 page
a3doc.NewPage();
var a3size = PageSize.A3.Rotate();
page = a3writer.GetImportedPage(a3reader, (i * 2) + 1);
a3cb.AddTemplate(page, 0, 0);
page = a3writer.GetImportedPage(a3reader, (i * 2) + 2);
a3cb.AddTemplate(page, (int)(a3size.Width / 2), 0);
}
a3doc.CloseDocument();
}
所以基本上,将所有内容保存在内存中,最后使用编写器的DirectContent将A4页面粘贴到A3页面的某个位置。此外,使用PdfSmartCopy来保持文件大小较低,因为每次添加填充副本时都不会添加模板页面内容。