2017-02-01 1 views
0

나는 HTML 페이지의 데이터를 받아들이고 그 데이터를 PDF에 스탬프 처리하고 타사 이미징 시스템에 PDF를 저장하는 프로세스가 있습니다.iTextSharp - PDF를 여러 번 채우고 하나의 pdf로 병합

HTML 페이지는 최대 8 명의 사용자에 대한 정보를 허용합니다. 그러나 PDF에는 최대 4 명의 사용자를위한 공간 만 있습니다. 따라서 4 개 이상의 정보가 입력되면 PDF를 두 번 작성하고 두 PDF를 하나의 파일로 병합하여 이미지 시스템에 제출해야합니다.

중첩 스트림, 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 스탬프 처리 나는 현재 가지고있는 코드입니다

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(); 
    } 
"동일한 양식 (동일한 필드를 갖는) 병합"에서 iText를 자주 묻는 질문 사이트 ( http://developers.itextpdf.com/question/how-merge-forms-different-files-one-pdf)

여기 내가 사용 결국 코드입니다