Объединение 2-х байтовых потоков PDF с использованием Itextsharp - PullRequest
0 голосов
/ 24 декабря 2011

У меня есть метод, который возвращает поток байтов в формате pdf (из заполняемого файла pdf). Существует ли прямой способ объединения двух потоков в один поток и создания из него одного файла pdf? Мне нужно запустить мой метод дважды, но мне нужно два файла PDF в поток One PDF. Спасибо.

1 Ответ

3 голосов
/ 25 декабря 2011

Вы не сказали, сглаживаете ли вы заполненные формы с помощью PdfStamper, поэтому я просто скажу, что необходимо сгладить перед тем, как попытаться объединить их. Вот рабочий обработчик HTTP .ashx:

<%@ 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 не будет работать (для заполняемых форм), поскольку Acrofield s не учитываются. На самом деле, если вы посмотрите на stackoverflow о теге itextsharp" SO FAQ & Popular " в Объединение файлов PDF , это упомянуто в третьем комментарии для правильного помеченный ответ @Ray Cheng.

Еще один способ объединить заполняемый PDF (без выравнивания формы) - переименовать поля формы для второй / последующих страниц, но это еще не все.

...