2013-12-18 2 views
4

Я использую iTextSharp для работы с PDF-файлами. Я хочу добавить изображение подписи в поле Подпись без цифровой подписи документа (без участия сертификата).Добавить изображение подписи в PDF без цифровой подписи с помощью iTextSharp

Возможно ли это? Я могу работать с цифровой подписью, но я также хочу просто добавить изображение подписи в поле подписи без использования сертификатов.

UPDATE:

Написать теперь я следующий код.

// Set PDF Reader and PDF Stamper 
PdfReader reader = new PdfReader(sourceDocument); 

// File stream where PDF will write 
FileStream fout = new FileStream(destinationPath, FileMode.Create, FileAccess.ReadWrite); 
PdfStamper stamper = PdfStamper.CreateSignature(reader, fout, '\0', null, true); 

// Set PDF Appearance    
PdfSignatureAppearance appearance = stamper.SignatureAppearance; 
iTextSharp.text.Image signatureFieldImage = iTextSharp.text.Image.GetInstance(image, System.Drawing.Imaging.ImageFormat.Png); 
appearance.SignatureGraphic = signatureFieldImage; 
appearance.SignatureRenderingMode = PdfSignatureAppearance.RenderingMode.GRAPHIC; 
appearance.SetVisibleSignature(signatureFieldName); 

stamper.Close(); 
reader.Close(); 
fout.Close(); 

Но когда я пытаюсь запустить его, он дает следующую ошибку:

Signature defined. Must be closed in PdfSignatureAppearance

+0

После того, как вы добавили появление в поле подписи, поле подписи отображается по-прежнему (на вкладке подписи) как неиспользуемые. Это тебя устраивает? – mkl

+0

Да, все будет хорошо. Я просто хочу показать изображение подписи в одном из случаев. – rizzz86

+0

@mkl см. Обновленный пост. – rizzz86

ответ

6

Вы используете код для цифровой подписи PDF, что вы не хотите использовать цифровую подпись ;-)

Если документ уже подписан, добавление какого-либо дополнительного контента (например, изображения) нарушит подпись, но если документ еще не подписан, у вас есть разные варианты.

Вы должны использовать PdfStamperобычным способом, то есть: не с помощью метода CreateSignature(), но так, как это описано в chapter 6 моей книги о IText. Вам также необходимо решить, важно ли или нет, что изображение является частью поля подписи (в этом случае оно исчезнет при подписании PDF-файла) или (2) изображение должно быть добавлено как часть потока контента (в этом случае он все равно будет присутствовать, как только вы подписываете документ).

В случае (1), пожалуйста, обратите внимание на образец кода 2.6 и пример кода 2.7 из my book about digital signatures (см CreateEmptyField пример для C# версии кода). В примере кода 2.6 вы узнаете, как создать PdfFormField с настраиваемым PdfAppearance. В примере кода 2.7 вы узнаете, как добавить поле подписи в существующий документ, используя PdfStamper. В вашем случае вы удалите существующее поле подписи (используя метод removeField()) и замените его новым PdfFormField с другим внешним видом с точно такими же координатами.

В случае (2), вы просто создать Image объект и добавить его в PdfContentByte извлеченного из PdfStamper с использованием методы GetOverContent(). См. examples of chapter 6 для вдохновения.

В обоих случаях вам необходимо знать координаты и номер страницы в обоих случаях. Эта информация может быть получена следующим образом:

AcroFields form = stamper.AcroFields; 
AcroFields.FieldPosition f = form.GetFieldPositions("mySigName")[0]; 

Вы получите страницу, как это: f.page и Rectangle определяющего положение, как это: f.position.

Поскольку мы не знаем точно, какой тип конечного результата вам нужен, сложно вдаваться в подробности. Самая важная ошибка в вашем коде заключается в том, что вы используете метод CreateSignature() для получения объекта PdfStamper, тогда как вы не хотите подписывать документ.

+0

Спасибо @Bruno, это сработало для меня. Я использовал метод GetOverContent(), чтобы показать свое изображение в PDF. – rizzz86

+0

* В вашем случае вы удалите существующее поле подписи (используя метод removeField()) и замените его * - если кто-то это сделает, будьте осторожны; если ваше исходное поле подписи содержит специальные настройки, например. блокировать словари или начальные значения, просто заменяя поле, вы выбрасываете эту информацию. Вам также придется копировать соответствующие ссылки. – mkl

+0

Я не удаляю поле подписи, но скрываю его с помощью аннотации FLAGS_HIDDEN. Я хочу, чтобы имя поля подписи позже. – rizzz86

3

Это, как я добавить БЕЗЗНАКОВОЕ поле подписи

 public void buildPDFMemoSignature(string DocName, BuildableDoc docBuild) 
    { 
     using (var ms = new MemoryStream()) 
     { 
     var doc = new Document(PageSize.A4, 20f, 10f, 30f, 0f); 
     { 
      PdfWriter writer = PdfWriter.GetInstance(doc, ms); 
      doc.Open(); 
      try 
      { 
       // add stuff to your PDF 

      // Signature is added here *************** 

      PdfFormField field = PdfFormField.CreateSignature(writer); 
    field.SetWidget(new iTextSharp.text.Rectangle(190, 730, 440, 650), PdfAnnotation.HIGHLIGHT_NONE); 
        //Rectangle(float llx, float lly, float urx, float ury) 
        field.FieldName = "mySig"; 
        field.Flags = PdfAnnotation.FLAGS_PRINT; 
        field.SetPage(); 
        field.MKBorderColor = BaseColor.BLACK; 
        field.MKBackgroundColor = BaseColor.WHITE; 
        PdfAppearance tp = PdfAppearance.CreateAppearance(writer, 72, 48); 
        tp.Rectangle(0.5f, 0.5f, 71.5f, 47.5f); 
        tp.Stroke(); 
        field.SetAppearance(PdfAnnotation.APPEARANCE_NORMAL, tp); 
        writer.AddAnnotation(field); 
        } 
        catch (Exception ex) 
        { 
         //exceptions     
        } 
        finally 
        { 
         doc.Close(); 
        } 
} 
+0

Это не может быть рабочим примером ... Вы не используете ни один из параметров, переданных в методе ... – Zack

Смежные вопросы