使用Itextsharp合并2个pdf字节流

时间:2011-12-24 09:09:37

标签: itextsharp

我有一个返回pdf字节流的方法(来自可填写的pdf)是否有直接的方法将2个流合并为一个流并从中生成一个pdf?我需要运行我的方法两次,但需要将两个pdf转换为One pdf流。感谢。

1 个答案:

答案 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的另一种方法(不展平表单)是重命名第二页/后页的表单字段,但这样做更有效。