2011-12-24 2 views
0

У меня есть метод, который возвращает поток байтов PDF (из заполняемого pdf). Есть ли прямой способ объединить 2 потока в один поток и сделать из него один pdf-файл? Мне нужно запустить мой метод дважды, но вам нужны два pdf-файла в один поток PDF. Благодарю.Объединить 2 потока байтов pdf с использованием Itextsharp

+0

Являются ли потоки байтов iTextSharp? Являются ли отдельные байтовые потоки из двух разных заполняемых форм или одной формы? Если они исходят из одной формы, вы их сгладили? – kuujinbo

+0

Забудьте о потоках байтов на мгновение. Действительно ли ваш вопрос «как объединить два PDF-файла в один?» –

+0

Это тот же заполняемый PDF. Я использовал Itexsharp pdf stamper. Прямо сейчас, используя его в asp.net и передавая этот PDF-файл в браузер. Поэтому мне нужно также вызвать мой метод, который передает один и тот же PDF-документ, но дает разные данные и помещает eevrything в один поток. Таким образом, тот же PDF-файл будет отображаться дважды как один PDF-файл. – user282807

ответ

3

Вы не сказали, если вы уплощение заполненных форм с 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's about itextsharp tag «SO FAQ & Популярные» до Merge PDFs, это упоминается в третьем комментарии для правильно обозначенного ответа @Ray Cheng.

Другим способом слияния заполняемого PDF (без сглаживания формы) является переименование полей формы для второй/следующей страницы, но это больше работает.

+0

Спасибо Kuujinbo за ответ и объяснение. – user282807

+0

Cheers dude, отличный материал –

Смежные вопросы