2017-02-01 21 views
0

私は、HTMLページからデータを受け取り、そのデータをPDFにスタンプして、サードパーティのイメージングシステムに保存するプロセスを持っています。iTextSharp - PDFを複数回入力して1つのpdfにマージする

HTMLページでは、最大8人のユーザーの情報を受け入れます。ただし、PDFには最大4人のユーザーのためのスペースしかありません。したがって、4つ以上の情報が入力された場合は、PDFを2回入力して2つのPDFを1つのファイルにマージしてイメージングシステムに送信する必要があります。

ストリーム、pdfReaders、pdfStampersのネストを試みましたが、結果のPDFは常に破損しています。どんな助けでも大歓迎です。前もって感謝します。

var pdfTemplate = ConfigurationManager.AppSettings["PdfFileLocation"] + formName + ".pdf"; 
var pdfReader = new PdfReader(pdfTemplate); 

using (var stream = new MemoryStream()) 
{ 
    using (var pdfStamper = form == null 
    ? new PdfStamper(pdfReader, stream, '\0', false) 
    : processType == 1 // printing form 
     ? new PdfStamper(pdfReader, new FileStream(Path.GetTempPath() + "UserForm_" + UserNumber + ".pdf", FileMode.Create)) // temporarily save form 
     : new PdfStamper(pdfReader, stream, '\0', false)) // use a stream if submitting 
    { 
     var overContent1 = pdfStamper.GetOverContent(1); 
     var overContent2 = pdfStamper.GetOverContent(2); 
     var overContent3 = pdfStamper.GetOverContent(3); 
     var overContent4 = pdfStamper.GetOverContent(4); 
     var pdfFormFields = pdfStamper.AcroFields; 

     ... Code to fill out other pages of the PDF goes here ... 

     #region User Form Page #3 

     foreach (var user in users) 
     { 
      var eligibility = _sharedFormService.GetEligibility(user.Eligibility); 
      pdfFormFields.SetField("User" + nameof(user.Name) + user.Id, user.Name); 
      pdfFormFields.SetField("User" + nameof(user.Eligibility) + user.Id, eligibility); 
      pdfFormFields.SetField("User" + nameof(user.Title) + user.Id, user.Title); 
      pdfFormFields.SetField("User" + nameof(user.Type) + user.Id, user.Type); 
      pdfFormFields.SetField("User" + nameof(user.FamilyMemberName) + user.Id, user.FamilyMemberName); 

      try 
      { 
       if (user.Signature != null) 
       { 
        var sigImage = _imageHelpers.LoadImage(user.Signature); 
        var image = Image.GetInstance(sigImage, System.Drawing.Imaging.ImageFormat.Gif); 
        var sigPostitions = pdfFormFields.GetFieldPositions("User" + nameof(user.Signature) + user.Id)[0].position; 

        image.Transparency = new int[] { 255, 255 }; 
        image.SetAbsolutePosition(sigPostitions.Left, sigPostitions.Bottom); 
        image.ScalePercent(15); 

        overContent3.AddImage(image); 
       } 
      } 
      catch (DocumentException dex) 
      { 
       response.Success = false; 
       response.ErrorMessage += "StampPdf - UserSignature" + user.Id + ": " + (dex.InnerException != null 
        ? dex.InnerException.Message 
        : dex.Message) + ", "; 
      } 
      catch (IOException ioex) 
      { 
       response.Success = false; 
       response.ErrorMessage += "StampPdf - UserSignature" + user.Id + ": " + (ioex.InnerException != null 
        ? ioex.InnerException.Message 
        : ioex.Message) + ", "; 
      } 
     } 

     #endregion 

     pdfStamper.FormFlattening = true; 
    } 

    response.Stream = stream.ToArray(); 
} 

答えて

1

をグーグルのより数日後、私は最終的に私はから探していた答えが見つかりました:4ユーザー入力された - ここで

は1がある場合にPDFをスタンプ処理します私は現在持っているコードですiTextのよくある質問サイト、( http://developers.itextpdf.com/question/how-merge-forms-different-files-one-pdf

を「同一フォーム(同じフィールドを有する)マージ」の下にここに私が使用して終了コードがあります:

public static byte[] ManipulatePdf(string src, string dest) 
    { 
     var ms = new MemoryStream(); 
     Document document = new Document(); 
     PdfCopy copy = new PdfSmartCopy(document, ms); 
     copy.SetMergeFields(); 
     document.Open(); 
     List<PdfReader> readers = new List<PdfReader>(); 
     for (int i = 0; i < 2;) 
     { 
      PdfReader reader = new PdfReader(RenameFields(src, ++i)); 
      readers.Add(reader); 
      copy.AddDocument(reader); 
     } 
     document.Close(); 
     foreach (var reader in readers) 
     { 
      reader.Close(); 
     } 

     return ms.ToArray(); 
    } 

    public static byte[] RenameFields(String src, int i) 
    { 
     MemoryStream baos = new MemoryStream(); 
     PdfReader reader = new PdfReader(src); 
     PdfStamper stamper = new PdfStamper(reader, baos); 
     AcroFields form = stamper.AcroFields; 
     var keys = new HashSet<string>(form.Fields.Keys); 
     foreach (var key in keys) 
     { 
      form.RenameField(key, string.Format("{0}_{1}", key, i)); 
     } 
     stamper.Close(); 
     reader.Close(); 
     return baos.ToArray(); 
    } 
関連する問題