2017-01-17 3 views
-1

워터 마크를 추가 한 pdf 문서가 있습니다. 결과는 좋지만, 결과 PDF에 밑줄을 긋기 위해 워터 마크를 사용하면 텍스트 문서의 일부분이 보이기 때문에 밑줄 결과가 잘못되었습니다.
다음은 워터 마크를 적용하는 데 사용 내 코드 :iTextSharp에서 워터 마크가있는 문서에 밑줄 친다

using (System.IO.MemoryStream memWatermark = new MemoryStream(pdfWatermark)) 
using (System.IO.MemoryStream memIn = new MemoryStream(pdfin)) 
using (System.IO.MemoryStream memOut = new MemoryStream()) 
{ 
    memWatermark.Position = 0; 
    memIn.Position = 0; 
    memOut.Position = 0; 
    PdfReader reader = new PdfReader(memIn); 
    PdfReader wmReader = new PdfReader(memWatermark); 

    int j = wmReader.NumberOfPages; 
    if (wmReader.NumberOfPages > 0) 
    {  
     Rectangle wmSize = wmReader.GetPageSize(1); 
     int wmRotation = wmReader.GetPageRotation(1); 

     using (Document doc = new Document(wmSize)) 
     { 
      PdfWriter writer = PdfWriter.GetInstance(doc, memOut); 
      doc.Open(); 

      PdfImportedPage waterMarkPage = writer.GetImportedPage(wmReader, 1); 
      PdfImportedPage currentPage; 
      for (int i = 1; i <= reader.NumberOfPages; i++) 
      { 
       currentPage = writer.GetImportedPage(reader, i); 

       //Add the first file to coordinates 0,0 
       if (wmRotation == 90 || wmRotation == 270) 
       { 
        writer.DirectContent.AddTemplate(currentPage, 0, -1f, 1f, 0, 0, wmReader.GetPageSizeWithRotation(i).Height); 
       } 
       else 
       { 
        writer.DirectContent.AddTemplate(currentPage, 1f, 0, 0, 1f, 0, 0); 
       } 

       // set transparency for watermark 
       var gstate = new PdfGState { FillOpacity = 0.2f, StrokeOpacity = 0.4f }; 
       writer.DirectContent.SaveState(); 
       writer.DirectContent.SetGState(gstate); 

       //Since we don't call NewPage the next call will operate on the same page 
       if (wmRotation == 90 || wmRotation == 270) 
       { 
        writer.DirectContent.AddTemplate(waterMarkPage, 0, -1f, 1f, 0, 0, wmReader.GetPageSizeWithRotation(1).Height); 
       } 
       else 
       { 
        writer.DirectContent.AddTemplate(waterMarkPage, 1f, 0, 0, 1f, 0, 0); 
       } 

       // reset transparency state to default before adding next page 
       writer.DirectContent.RestoreState(); 

       // now move to following page 
       if (i < reader.NumberOfPages) 
       { 
        doc.NewPage(); 
       } 
      } 

      // flush writer but leave the stream open! 
      writer.Flush(); 
      writer.CloseStream = false; 
     } 
    } 
    memOut.Position = 0; 
    if (memOut.Length > 0) 
    { 
     pdfout = new byte[memOut.Length]; 
     pdfout = memOut.ToArray(); 
     done = true; 
    } 
} 
+0

"밑줄"은 서명 추가를 의미합니까? 워터 마크 자체를 추가하면 원하는 결과를 얻었지만 문서에 더 많은 것을 추가 할 때는 코드가 깨져서 코드가 표시되어야합니다. – Filburt

+0

@ Filburt 안드로이드에서 pspdfkit sdk로 최종 PDF (원본 + 워터 마크)를 편집 중입니다. "밑줄"은 주석을 작성하고 서명이 아닌 문서 텍스트에 밑줄을 긋는 것을 의미합니다. – Marco

+1

설명해 주셔서 감사합니다. itextsharp를 사용하여 밑줄 부분을 사용하고 있다는 인상을받을 수 있으므로 pspdfkit에 대해 언급하는 것이 중요합니다. – Filburt

답변

0

나는이 솔루션을 발견했다. 이미지에서 워터 마크의 pdf 페이지를 변환하고 그 이미지를 추가하고 최종 PDF의 각 페이지에 추가하십시오. 나는 PdfiumViewer 라이브러리를 사용하여 Pdf 페이지를 PNG 이미지로 변환했다.
여기에 코드 :

using (System.IO.MemoryStream memIn = new MemoryStream(pdfin)) 
using (System.IO.MemoryStream memOut = new MemoryStream()) 
{ 
    byte[] image = null; 

    using (System.IO.MemoryStream memWatermark = new MemoryStream(pdfWatermark))           
    using (var document = PdfiumViewer.PdfDocument.Load(memWatermark)) 
    { 
     using (var ms = new MemoryStream()) 
     { 
      document.Render(0, 300, 300, true).Save(ms, System.Drawing.Imaging.ImageFormat.Png); 
      image = ms.ToArray(); 
     } 
    } 

    PdfReader reader = new PdfReader(memIn); 
    int n = reader.NumberOfPages; 
    PdfStamper stamper = new PdfStamper(reader, memOut); 


    // transparency 
    PdfGState gs1 = new PdfGState(); 
    gs1.StrokeOpacity = 0.4f; 
    gs1.FillOpacity = 0.2f; 

    // properties 
    PdfContentByte over; 
    iTextSharp.text.Rectangle pagesize; 
    float x, y; 


    stamper.FormFlattening = true; 
    stamper.FreeTextFlattening = true; 

    iTextSharp.text.Rectangle wmSize = reader.GetPageSize(1); 
    int wmRotation = reader.GetPageRotation(1); 

    // image watermark 
    var img = iTextSharp.text.Image.GetInstance(image); 
    float w = img.ScaledWidth; 
    float h = img.ScaledHeight; 


    using (Document doc = new Document(wmSize)) 
    { 
     PdfWriter writer = PdfWriter.GetInstance(doc, memOut); 
     doc.Open(); 

     PdfImportedPage currentPage; 
     for (int i = 1; i <= reader.NumberOfPages; i++) 
     { 
      pagesize = reader.GetPageSizeWithRotation(i); 
      over = writer.DirectContent; 

      currentPage = writer.GetImportedPage(reader, i); 
      if (wmRotation == 90 || wmRotation == 270) 
       over.AddTemplate(currentPage, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(i).Height); 
      else 
       over.AddTemplate(currentPage, 1f, 0, 0, 1f, 0, 0); 

      x = (pagesize.Left + pagesize.Right)/2; 
      y = (pagesize.Top + pagesize.Bottom)/2; 
      over.SaveState(); 
      over.SetGState(gs1); 

      var pageRotation = reader.GetPageRotation(i); 
      if (pageRotation == 90 || pageRotation == 270) 
      { 
       if (pageRotation == 90) 
       { 
        img.RotationDegrees = 180f; 
        img.SetAbsolutePosition(0, 0); 
        over.AddImage(img); 
       } 
       else 
       { 
        img.RotationDegrees = -90f; 
        img.SetAbsolutePosition(-(y/2), (x/2)); 
        over.AddImage(img); 
       } 
      } 
      else 
       over.AddImage(img, w, 0, 0, h, x - (w/2), y - (h/2)); 

      over.RestoreState(); 

      // now move to following page 
      if (i < reader.NumberOfPages) 
      { 
       doc.NewPage(); 
      } 
     } 

     // flush writer but leave the stream open! 
     writer.Flush(); 
     writer.CloseStream = false; 
    } 

    memOut.Position = 0; 
    if (memOut.Length > 0) 
    { 
     pdfout = new byte[memOut.Length]; 
     pdfout = memOut.ToArray(); 
     done = true; 
    } 

    stamper.Close(); 
    reader.Close(); 
} 
+0

비트 맵으로 pdf를 렌더링하는 것은 당연히 품질 저하를 초래합니다 ... – mkl

관련 문제