2015-01-19 6 views
0

나는 토큰 인증서를 사용하여 문서에 서명 해요 :iTextSharp 수직 SignatureAppearance

 var cp = new Org.BouncyCastle.X509.X509CertificateParser(); 
     var chain = new[] { cp.ReadCertificate(cert.RawData) }; 

     var externalSignature = new X509Certificate2Signature(cert, "SHA-1"); 

     var pdfReader = new PdfReader(origem); 

     var signedPdf = new FileStream(destino, FileMode.Create); 

     var pdfStamper = PdfStamper.CreateSignature(pdfReader, signedPdf, '\0'); 

     var sig = pdfStamper.SignatureAppearance; 

     sig.SetVisibleSignature(new Rectangle(50, 0, 500, 50), pdfReader.NumberOfPages, "Signature"); 
     sig.SignatureRenderingMode = PdfSignatureAppearance.RenderingMode.DESCRIPTION; 
     sig.Layer2Text = "Assinado digitalmente por " + cert.SubjectName.Name; 
     sig.Layer2Font = new Font(Font.FontFamily.TIMES_ROMAN, 7); 

     MakeSignature.SignDetached(sig, externalSignature, chain, null, null, null, 0, CryptoStandard.CMS); 

서명 텍스트가 페이지의 맨 아래에 렌더링됩니다. 콘텐츠 마진 외부의 문서 오른쪽 부분에서 세로 모드로 어떻게 바꿀 수 있습니까?

감사

모든
+0

'sig.SetVisibleSignature'의'새로운 Rectangle (50, 0, 500, 50)'매개 변수를 변경하십시오. – mkl

+0

고마워,하지만 그것은 텍스트 방향을 변경하지 않는 것 같습니다. – Ricardo

+0

* 텍스트 방향이 바뀌지는 않습니다. * - 아니요. "세로 모드"에서 암시 했습니까? – mkl

답변

1

첫째, 일부 수직 방향 서명을 얻기 위해, 서명을 시각화 할 수있는 사각형은 좀 더 수직 방향해야합니다. 따라서, 귀하의

sig.SetVisibleSignature(new Rectangle(50, 0, 500, 50), pdfReader.NumberOfPages, "Signature"); 

대신에 당신은뿐만 아니라 시각화 사각형이 수직 방향을해야 당신이 의견에 명확히 이제

sig.SetVisibleSignature(new Rectangle(50, 0, 50, 500), pdfReader.NumberOfPages, "Signature"); 

같은 것을 사용해야하지만 텍스트는 수직으로 그려되어야한다 . iText는 기본적으로 가로 텍스트로 시각화를 만듭니다. 따라서 사용자 정의 된 모양을 사용해야합니다.

나는 iText/Java를 집에서 가지고 있기 때문에 PdfSignatureAppearance appearance을 사용자 정의하는이 예제는 자바로되어있다. iTextSharp/C#로 변환하는 것이 쉬워야합니다.

appearance.setVisibleSignature(rectangle, PAGENUMBER, SIGNATURENAME); 

// customize appearance layer 2 to display text vertically 
PdfTemplate layer2 = appearance.getLayer(2); 
layer2.transform(new AffineTransform(0, 1, -1, 0, rectangle.getWidth(), 0)); 
Font font = new Font(); 
font.setColor(BaseColor.WHITE); 
font.setSize(10); 
ColumnText ct2 = new ColumnText(layer2); 
ct2.setRunDirection(PdfWriter.RUN_DIRECTION_NO_BIDI); 
ct2.setSimpleColumn(new Phrase("Signed by me, myself and I", font), 0, 0, rectangle.getHeight(), rectangle.getWidth(), 15, Element.ALIGN_CENTER); 

ct2.go(); 

이 예

은 "내 옆에 자신을 체결하고 I"수직 페이지 영역 rectangle에 그립니다. 상기 방법은 절대 좌표 DirectContent를 사용하지만

+0

잘 했어! 미리 감사드립니다. 단지 소수만이 C#으로 변경됩니다. var ct2 = new ColumnText (layer2) {RunDirection = PdfWriter.RUN_DIRECTION_NO_BIDI}; – Ricardo

+0

모든 문서, 인물 또는 풍경에서 가장 오른쪽에 표시 할 수있는 방법이 있습니까? 어쩌면 의사 폭으로 계산했을까요? – Ricardo

+0

*가 가장 오른쪽에 나타납니다. * - 해당 페이지의 자르기 상자에서 가장 오른쪽 좌표를 가져올 수 있습니다. – mkl

0
public bool drawVerticalText(string _text, Color _color, int _angle, int _size, int _left, int _top) 
    { 
     try 
     { 
      BaseColor bc = new BaseColor(_color.R, _color.G, _color.B, _color.A); 
      PdfContentByte cb = writer.DirectContent; 
      BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.EMBEDDED); 
      //int width = baseFont.GetWidth(_text); 
      cb.BeginText(); 
      cb.SetColorFill(CMYKColor.RED); 
      cb.SetFontAndSize(bf, _size); 
      cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, _text, _left, document.Top - _top, _angle); 
      cb.EndText(); 
      document.Close(); 
      return true; 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
      return false; 
     } 
    } 

당신은 ...

을 색상, 회전 각도 (예를 들어, 45), 텍스트 크기의 알파 값을 변경하여 문서에 워터 마크를 만들 수 아래의 메소드는 회전 속성을 가진 셀 객체를 사용합니다. ... 당신이 어떤 각도를 가질 수있는 첫번째 방법 동안 해당 셀의 회전, 90의 배수 일 수 있습니다

public void drawVerticalText2() 
    { 
     PdfPTable table = new PdfPTable(4); 
     float[] widths = new float[] { 1.25f, 1.55f, 0.35f, 0.35f }; 
     table.SetWidths(widths); 

     PdfPCell horizontalCell = new PdfPCell(new Phrase("I'm horizontal")); 
     horizontalCell.Border = BORDERS.BOX; 
     horizontalCell.HorizontalAlignment = 1; 
     table.AddCell(horizontalCell); 

     PdfPCell horizontalMirroredCell = new PdfPCell(new Phrase("I'm horizontal mirrored")); 
     horizontalMirroredCell.Border = BORDERS.BOX; 
     horizontalMirroredCell.HorizontalAlignment = 1; 
     horizontalMirroredCell.Rotation = 180; 
     table.AddCell(horizontalMirroredCell); 

     PdfPCell verticalCell = new PdfPCell(new Phrase("I'm vertical")); 
     verticalCell.Border = BORDERS.BOX; 
     verticalCell.HorizontalAlignment = 1; 
     verticalCell.Rotation = 90; 
     table.AddCell(verticalCell); 

     PdfPCell verticalMirroredCell = new PdfPCell(new Phrase("I'm vertical mirrored")); 
     verticalMirroredCell.Border = BORDERS.BOX; 
     verticalMirroredCell.HorizontalAlignment = 1; 
     verticalMirroredCell.Rotation = -90; 
     table.AddCell(verticalMirroredCell); 

     table.SpacingBefore = 20f; 
     table.SpacingAfter = 30f; 

     document.Add(table); 
     document.Close(); 
    } 

즐길

enter image description here!