Вы не сказали, сглаживаете ли вы заполненные формы с помощью 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 (без выравнивания формы) - переименовать поля формы для второй / последующих страниц, но это еще не все.