iTextSharp -将多个A4文档组合成双面A3小册子
本文关键字:A3 小册子 组合 文档 A4 iTextSharp | 更新日期: 2023-09-27 18:18:12
我有一个4 x A4页的PDF表单。我使用iTextSharp完成字段。这部分都没问题。
然后我需要将这些表单组合成一个PDF文档。计划使用这种方法:使用iTextSharp从现有的PDF表单生成多页PDF。
然而,这些A4页需要合并成一个A3页,以"小册子"类型的配置打印,即像下面的正反两面
A3 Front ----- turn over ----> A3 Back
------------------------------- -------------------------------
| | | | | |
| | | | | |
| | | | | |
| Page | Page | | Page | Page |
| 4 | 1 | | 2 | 3 |
| | | | | |
| | | | | |
| | | | | |
------------------------------- -------------------------------
(ascii增值)
当A3被对折时,它会读(从左到右),第1页,第2页,第3页,第4页。然后,我将以这种方式组合所有已完成的表格,然后在A3上背靠背打印整个PDF文档。
我发现这篇文章(http://forums.asp.net/t/1692347.aspx?Merging+two+pdf+pages+into+one+using+itextsharp)提到在页面上放置PdfPTable,然后抓取页面的图像,并将其嵌入到表格单元格中…
如果我这样做,PDF文件不是很大吗,因为它基本上都是图像?有更好的方法来实现这一点吗?
明白了…遵循以下方法:
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来保持文件大小较低,因为每次添加填充副本时都不会添加模板页面内容。