#c# #vb.net #forms #pdf #itextsharp
#c# #vb.net #формы #PDF #itext
Вопрос:
Рабочий процесс выглядит следующим образом:
- мы загружаем шаблонную форму, предварительно заполняем значения, которые будут статическими, экспортируем XML-шаблон
- XML анализируется с помощью приложения .NET forms, добавляются динамические значения
- полученный XML-файл необходимо импортировать обратно в шаблон PDF
При использовании метода MergeXfaData в iTextSharp все идет хорошо, однако по какой-то причине поля даты и времени не заполняются (текстовые поля и флажки работают нормально). Не могу понять, почему. Просматривая форумы, я обнаружил, что кто-то говорит, что XFA работает только для текстовых полей. Почему это так и как обойти?
Также в качестве следующего шага мне нужно будет приложить вложение к форме PDF. Вложения также в формате PDF, но iTextSharp не стал бы их прикреплять. Я искал на многих форумах, но ни один из упомянутых методов не работает для меня.
Спасибо за ваши ответы
Ответ №1:
@Yuri, я только что попробовал это с полем даты / времени, и это сработало отлично. Я создаю простой PDF-файл в режиме реального времени с двумя полями, 1 текстом и 1 датой / временем, и двумя кнопками «Отправить» и «Распечатать». Образец PDF-файла находится здесь:
Я заполнил форму и получил это для XML:
<?xml version="1.0" encoding="UTF-8"?>
<topmostSubform>
<Text1>Chris</Text1>
<DateTimeField1>2012-04-12</DateTimeField1>
</topmostSubform>
Когда я импортировал его в PDF и просмотрел PDF в Acrobat, поле даты / времени было заполнено. Я использую iTextSharp 5.0.5.0 со следующим кодом:
Option Explicit On
Option Strict On
Imports iTextSharp.text
Imports iTextSharp.text.pdf
Imports System.IO
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim PDF_Input_File As String = Path.Combine(My.Computer.FileSystem.SpecialDirectories.Desktop, "Input.pdf")
Dim PDF_Output_File As String = Path.Combine(My.Computer.FileSystem.SpecialDirectories.Desktop, "Export.pdf")
''//Create our reader
Dim reader As New PdfReader(PDF_Input_File)
''//Create our file stream to output to
Using FS As New System.IO.FileStream(PDF_Output_File, FileMode.Create, FileAccess.Write, FileShare.Read)
''//Create the stamper
Dim stamper As New PdfStamper(reader, FS)
''//Just loading the XML raw instead of reading from disk, less files to attach to the post
Dim Bytes = System.Text.Encoding.UTF8.GetBytes("<?xml version=""1.0"" encoding=""UTF-8""?><topmostSubform><Text1>Chris</Text1><DateTimeField1>2012-04-12</DateTimeField1></topmostSubform>")
Using MS As New MemoryStream(Bytes)
''//Fill out the form
stamper.AcroFields.Xfa.FillXfaForm(MS)
End Using
stamper.Close()
End Using
reader.Close()
Me.Close()
End Sub
End Class
Комментарии:
1. Не могли бы вы случайно посоветовать мне, как добавить цифровую подпись (в существующее поле с известным именем) и автоматически отправить форму?
2. Кроме того, есть ли способ определить, была ли форма успешно отправлена или нет?
3. Я никогда не работал с цифровыми подписями в PDF-файлах, но этот ресурс может вам помочь: itextpdf.sourceforge.net/howtosign.html
4. Наконец, пример кода, который я мог бы использовать и заставить его работать идеально с первой попытки. Я потратил слишком много времени, пытаясь заставить это работать, и ваш первый найденный мной пример кода прост, удобен для чтения и отлично работает. Спасибо!!
5. Спасибо @Amy Patterson! Я научился всегда показывать полный код вместо того, чтобы надеяться, что все остальные смогут собрать все воедино. Кроме того, год спустя, когда мне нужно будет сделать это снова, мне не нужно начинать с нуля, я могу просто скопировать, вставить и изменить.