我有一个PDF文件流,并希望在PDF中添加一个Excel或文本文件附件。 以下代码完成这项工作,但它基本上将现有PDF页面逐页复制到新页面并添加附件。我必须逐页复制,因为PdfWriter无法从PdfReader打开现有PDF。有没有更好的方法来做到这一点?我也玩过PdfStamper,但看起来无论你需要什么PdfWriter来附加文件。使用iTextSharp添加附件到现有的PDF文件
该代码是从ASP.Net MVC应用程序的Action方法。
[HttpPost]
public ActionResult Index(HttpPostedFileBase file)
{
string s = System.Web.HttpContext.Current.Server.MapPath(@"~/temp/");
PdfReader reader = new PdfReader(file.InputStream);
Document document = new Document();
MemoryStream ms = new MemoryStream();
PdfWriter writer = PdfWriter.GetInstance(document, ms);
document.Open();
document.AddDocListener(writer);
for (int i = 1; i <= reader.NumberOfPages; i++)
{
document.SetPageSize(reader.GetPageSize(i));
document.NewPage();
PdfContentByte cb = writer.DirectContent;
PdfImportedPage page = writer.GetImportedPage(reader, i);
int rotation = reader.GetPageRotation(i);
if (rotation == 90 || rotation == 270)
cb.AddTemplate(page, 0, -1.0F, 1.0F, 0, 0, reader.GetPageSizeWithRotation(i).Height);
else
cb.AddTemplate(page, 1.0F, 0, 0, 1.0F, 0, 0);
}
PdfFileSpecification pfs = PdfFileSpecification.FileEmbedded(writer, s + "test.xlsx", "test.xlsx", null);
writer.AddFileAttachment(pfs);
document.Close();
return File(ms.ToArray(), "application/pdf", "test.pdf");
}
您是否考虑过使用PdfStamper? – mkl 2014-10-16 22:06:28
是的,但即使是PdfStamper也需要PdfWriter,这让我回到了如何将现有文档放入PdfWriter中的相同问题。在我看到的stamper.getWriter()的Java示例中,但是该方法在我拥有的C#iTextSharp版本(最新版本)中不可用。 – Tigran 2014-10-16 22:10:46
首先,PdfStamper依赖于派生自PdfWriter的类,并不要求您逐页复制,而且在底层也没有这样做。 – mkl 2014-10-16 22:29:15