我有一个返回pdf字节流的方法(来自可填写的pdf)是否有直接的方法将2个流合并为一个流并从中生成一个pdf?我需要运行我的方法两次,但需要将两个pdf转换为One pdf流。感谢。
答案 0 :(得分:3)
您没有说明是否使用PdfStamper
展平填充的表单,因此我只是说必须在尝试之前展平合并他们。这是一个有效的.ashx HTTP处理程序:
<%@ WebHandler Language="C#" Class="mergeByteForms" %>
using System;
using System.IO;
using System.Web;
using iTextSharp.text;
using iTextSharp.text.pdf;
public class mergeByteForms : IHttpHandler {
HttpServerUtility Server;
public void ProcessRequest (HttpContext context) {
Server = context.Server;
HttpResponse Response = context.Response;
Response.ContentType = "application/pdf";
using (Document document = new Document()) {
using (PdfSmartCopy copy = new PdfSmartCopy(
document, Response.OutputStream) )
{
document.Open();
for (int i = 0; i < 2; ++i) {
PdfReader reader = new PdfReader(_getPdfBtyeStream(i.ToString()));
copy.AddPage(copy.GetImportedPage(reader, 1));
}
}
}
}
public bool IsReusable { get { return false; } }
// simulate your method to use __one__ byte stream for __one__ PDF
private byte[] _getPdfBtyeStream(string data) {
// replace with __your__ PDF template
string pdfTemplatePath = Server.MapPath(
"~/app_data/template.pdf"
);
PdfReader reader = new PdfReader(pdfTemplatePath);
using (MemoryStream ms = new MemoryStream()) {
using (PdfStamper stamper = new PdfStamper(reader, ms)) {
AcroFields form = stamper.AcroFields;
// replace this with your form field data
form.SetField("title", data);
// ...
// this is __VERY__ important; since you're using the same fillable
// PDF, if you don't set this property to true the second page will
// lose the filled fields.
stamper.FormFlattening = true;
}
return ms.ToArray();
}
}
}
希望内联评论有意义。上面的_getPdfBtyeStream()
方法模拟了您的PDF字节流。您需要将FormFlattening
设置为true
的原因是,当您填写PDF表单字段时,名称应该是唯一的。在您的情况下,第二页是相同的可填写PDF表单,因此它具有与第一页相同的字段名称,当您填写它们时,它们将被忽略。注释掉上面的示例行:
stamper.FormFlattening = true;
看看我的意思。
换句话说,很多用于在互联网上合并PDF甚至是stackoverflow 上的PDF的通用代码都不起作用(对于可填写的表单)因为Acrofield
没有被计算在内对于。事实上,如果你看一下stackoverflow的about itextsharp tag“ SO FAQ&amp; Popular ”到Merge PDFs,那么@Ray正确标记的答案会在第三条评论中提及程。
合并可填写PDF的另一种方法(不展平表单)是重命名第二页/后页的表单字段,但这样做更有效。