假设我有一个三页的PDF,所有三个都有AcroFields。我需要能够生成第2页重复N次的新PDF。页面2的每个新实例都需要修改字段名称,以使其不同于页面2的其他实例。在解决此问题之前,有人可以提供语法示例吗?
这可以工作,但是会生成一个大文件。我猜这是因为第2页上的图像被重复了很多次,而不是被重复使用。
public static void ExpandRepeatingPages(string sourcePdfPath, string outputPdfPath)
{
/* figure out how many pages we are working with */
var transientPdfReader = new PdfReader(sourcePdfPath);
var numberOfPages = transientPdfReader.NumberOfPages;
transientPdfReader.Close();
var outputFileStream = new FileStream(outputPdfPath, FileMode.Create);
var pdfCopyFields = new PdfCopyFields(outputFileStream);
foreach (var pageNumber in Enumerable.Range(1, numberOfPages))
{
var pdfBytes = ExtractPageToBytes(sourcePdfPath, pageNumber);
var pdfReader = new PdfReader(pdfBytes);
pdfCopyFields.AddDocument(pdfReader);
pdfReader.Close();
if (pageNumber == 2)
{
foreach (var extraPageNumber in Enumerable.Range(2, 200))
{
var extraPagePdfBytes = RenamePageFields(pdfBytes, extraPageNumber);
pdfReader = new PdfReader(extraPagePdfBytes);
pdfCopyFields.AddDocument(pdfReader);
pdfReader.Close();
}
}
}
pdfCopyFields.Close();
}
public static byte[] ExtractPageToBytes(string sourcePdfPath, int pageNumber)
{
using (var memoryStream = new MemoryStream())
{
var pageNumbers = new System.Collections.ArrayList { pageNumber };
var pdfReader = new PdfReader(sourcePdfPath);
var pdfCopyFields = new PdfCopyFields(memoryStream);
pdfReader.SelectPages(pageNumbers);
pdfCopyFields.AddDocument(pdfReader);
pdfReader.RemoveUnusedObjects();
pdfCopyFields.Close();
pdfReader.Close();
return memoryStream.ToArray();
}
}
private static byte[] RenamePageFields(byte[] pdfBytes, int pageNumber)
{
using (var memoryStream = new MemoryStream())
{
var pdfReader = new PdfReader(pdfBytes);
var pdfStamper = new PdfStamper(pdfReader, memoryStream);
var acroFields = pdfStamper.AcroFields;
var fieldNames = acroFields.Fields.Keys.Cast<String>().ToList();
foreach (var fieldName in fieldNames)
{
var newName = String.Format("{0}_{1}", fieldName, pageNumber);
acroFields.RenameField(fieldName, newName);
}
pdfStamper.Close();
pdfReader.Close();
return memoryStream.ToArray();
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句