2017-12-18 50 views
0

iTextSharp를 사용하여 워터 마크를 적용한 후 PDF 문서를 클라이언트로 전달합니다. 일부 컴퓨터 (모두 v.11의 PDF 뷰어 사용)에서 다음 오류가 표시됩니다.iTextSharp로 생성 된 PDF가 워터 마크 생성 오류

이 페이지에 오류가 있습니다. Acrobat에서 페이지를 올바르게 표시하지 못할 수 있습니다. 문제를 해결하려면 PDF 문서를 만든 사람에게 문의하십시오. 다음과 같이

워터 마킹 코드는 다음과 같습니다 환경 요소뿐만 아니라 내가 예상이 거기에있다, 그래서 내가 시도한 모든 컴퓨터에서이 작업을 다시 할 수

protected static byte[] GetStampedDocument(byte[] content, string mark, string heading) 
    { 
     PdfReader reader = new PdfReader(content); 
     using (MemoryStream stream = new MemoryStream()) 
     { 
      PdfStamper pdfStamper = new PdfStamper(reader, stream); 

      for (int i = 1; i <= reader.NumberOfPages; i++) 
      { 
       iTextSharp.text.Rectangle pageSize = reader.GetPageSizeWithRotation(i); 

       PdfContentByte pdfPageContents = pdfStamper.GetOverContent(i); 
       pdfPageContents.BeginText(); 

       PdfGState gstate = new PdfGState(); 
       gstate.FillOpacity = 0.2f; 
       gstate.StrokeOpacity = 0.3f; 

       pdfPageContents.SaveState(); 
       pdfPageContents.SetGState(gstate); 

       BaseFont baseFont = BaseFont.CreateFont(BaseFont.HELVETICA_BOLD, Encoding.ASCII.EncodingName, false); 
       pdfPageContents.SetFontAndSize(baseFont, 46); 
       pdfPageContents.SetRGBColorFill(32, 32, 32); 

       pdfPageContents.ShowTextAligned(PdfContentByte.ALIGN_CENTER, mark, pageSize.Width/2, pageSize.Height/2, 66); 

       if (heading != null && heading.Length > 0) 
       { 
        pdfPageContents.SetFontAndSize(baseFont, 12); 
        pdfPageContents.SetRGBColorFill(32, 32, 32); 
        pdfPageContents.ShowTextAligned(PdfContentByte.ALIGN_LEFT, heading, 5, pageSize.Height - 15, 0); 
       } 

       pdfPageContents.EndText(); 
       pdfPageContents.RestoreState(); 
      } 

      pdfStamper.FormFlattening = true; 
      pdfStamper.FreeTextFlattening = true; 
      pdfStamper.Close(); 
      return stream.ToArray(); 
     } 
    } 

.

아이디어가 있으십니까?

답변

2

당신은 텍스트 개체 내부의 그래픽 상태를 저장 :

pdfPageContents.BeginText(); 
[...] 
pdfPageContents.SaveState(); 
[...] 
pdfPageContents.EndText(); 
pdfPageContents.RestoreState(); 

이 허용되지 않습니다, 참조 그림 9 - 그래픽 객체 - ISO 32000-2에서 특수 그래픽 상태 연산자 (그래픽 상태 저장 또는 복원)는 텍스트 객체 내에서 사용할 수 없습니다.

이 잘못된 구문을 방지하려면 pdfPageContents.SaveState()pdfPageContents.BeginText() 전에 이동하십시오. 이것은 또한 상태를 저장/복원하고 텍스트 개체를 더 자연스럽게 시작하고 끝내는 중첩을 만듭니다.