Заполнение PDF с помощью XDP
У меня есть заполненный PDF, который использовался для заполнения простого файла XFDF. Используя VS.NET 2010, я читаю документ XFDF, заполняю всю необходимую информацию и заполняю PDF, используя ds.WriteXML(XFDFName). XFDF записывается и запускается через Process.Start(XFDFName). Это все в приложении WinForms. Этот метод работал как чемпион в течение нескольких лет. До сих пор...
Проблема, с которой я столкнулся, заключается в том, что я не смог экспортировать данные в формат XFDF из-за файла, созданного в Adobe LiveCycle. Я заметил, что варианты экспорта были либо (1) XML, либо (2) XDP. В прошлом я был в состоянии экспортировать в XFDF. Ничего страшного, подумал я, просто другой формат. Тем не менее, я боролся с обоими этими вариантами. После некоторых размышлений я решил использовать формат XDP.
У меня есть набор данных, собранный со всей необходимой мне информацией, я получаю сообщение об ошибке при открытии вновь созданного XDP с помощью Process.Start(XDPName). Откроется Reader, и меня приветствует следующая ошибка: "Adobe Reader не может открыть файл GUID_HERE.xdp", поскольку он либо не поддерживается типом файла, либо потому, что файл поврежден (например, он был отправлен как вложение электронной почты и не был правильно декодирован).
Я попытался использовать прямую ссылку на PDF, но это тоже не сработало. Поэтому я решил вставить сериализованный PDF в XDP в разделе.
Этот XDP-файл выглядит так ( спасибо Дину Дж):
<?xml version='1.0' encoding='UTF-8'?>
<?xfa generator='AdobeDesigner_V7.0' APIVersion='2.2.4333.0'?>
<xdp:xdp xmlns:xdp='http://ns.adobe.com/xdp/'>
<xfa:datasets xmlns:xfa='http://www.xfa.org/schema/xfa-data/1.0/'>
<xfa:data>
XML is here - matching the dynamic fields in the PDF.
</xfa:data>
</xfa:datasets>
<pdf xmlns=\"http://ns.adobe.com/xdp/pdf/\"><document>
<chunk>
Base64 encoded PDF
</chunk>
</document></pdf>
</xdp:xdp>
Я бы подумал, что генерируемый мной XDP является фиктивным - но для дальнейшего усложнения - если я открою Reader, нажмите Инструменты> Формы> Дополнительные параметры формы> Управление данными формы> Импортировать данные и выберите сгенерированный файл XDP, все поля заполняются так, как я ожидаю.
Так что, в принципе, где-то явно есть разъединение: у меня есть XDP-файл со всей необходимой мне информацией. У меня есть PDF-форма, которую мне нужно заполнить XDP-файлом. Информация в XDP соответствует всем именам элементов управления из PDF. Но когда я запускаю XDP-файл, Reader сообщает мне, что он поврежден / не поддерживается. Насколько я понимаю, когда вы запускаете XDP-файл, он должен правильно запускаться / заполняться с помощью Reader, правильно?
Любая информация поможет мне безмерно. Благодарю.
3 ответа
У меня также есть проблемы с выполнением этого....
Делать похожую вещь в VB.net
кажется, не работает при использовании чанка, но он работает, если я использую href и локальный файл...
Пример тестирования
Public Sub BuildContent(ByVal slno As String)
Dim strXML As String
Dim fs As System.IO.FileStream = Nothing
Dim bw As System.IO.BinaryWriter = Nothing
Dim Buffer() As Byte
'fs = New System.IO.FileStream("kpiAlert10.pdf", IO.FileMode.Create)
'bw = New System.IO.BinaryWriter(fs)
'Response.ContentType = "application/vnd.adobe.xdp+xml"
'
' Constant XPD Header
'
strXML = "<?xml version='1.0' encoding='UTF-8'?>"
strXML = strXML & "<?xfa generator='AdobeDesigner_V7.0' APIVersion='2.2.4333.0'?>"
strXML = strXML & "<xdp:xdp xmlns:xdp='http://ns.adobe.com/xdp/'>"
strXML = strXML & "<xfa:datasets xmlns:xfa='http://www.xfa.org/schema/xfa-data/1.0/'>"
strXML = strXML & "<xfa:data>"
'
' Place code here to get the current Logged in user ID
' and perform a query to the back end database and filter by ID
' then generate the following XML Data using the resultant Recordset ...etc.
'
strXML = strXML & "<transaction><kpi><name>Ego ille</name><data><sn>Si manu vacuas</sn><amt>Apros tres et quidem</amt><delta>Mirum est</delta></data></kpi></transaction>"
'
'
'
strXML = strXML & "</xfa:data>"
strXML = strXML & "</xfa:datasets>"
'
' Point the XPD to the PDF Form created under Adobe LiveCycle Desinger
'
Dim contents As String
contents = EncodeFile("kpiAlert.pdf")
'Buffer = Convert.FromBase64String(contents)
strXML = strXML & "<pdf xmlns='http://ns.adobe.com/xdp/pdf/'>"
strXML = strXML & "<document>"
strXML = strXML & "<chunk>" & contents & "=</chunk>"
strXML = strXML & "</document>"
strXML = strXML & "</pdf>"
'strXML = strXML & "<pdf href='C:/kpiAlert.pdf' xmlns='http://ns.adobe.com/xdp/pdf/' />"
'
' Close the XPD File
'
strXML = strXML & "</xdp:xdp>"
Using outfile As New StreamWriter("kpiAlert_" & slno & ".pdf")
outfile.Write(strXML.ToString())
End Using
End Sub
Function EncodeFile(ByVal srcFile As String) As String
Dim srcBT As Byte()
Dim dest As String
Dim sr As New IO.FileStream(srcFile, IO.FileMode.Open)
ReDim srcBT(sr.Length)
sr.Read(srcBT, 0, sr.Length)
sr.Close()
dest = EncodeByte(srcBT)
Return dest
End Function
enter code here
Функция EncodeByte(ByVal bt() As Byte) As String Dim enc As String enc = System.Convert.ToBase64String(bt) Return enc End Function
Я также хочу поблагодарить Дина Джа за отличный ответ. Я использовал его раньше, и это сэкономило мне много времени и денег за коммерческую лицензию iText или сервер LiveCycle. В указанном коде есть экранированная строка:
<pdf xmlns=\"http://ns.adobe.com/xdp/pdf/\">
Обратите внимание на обратную косую черту перед двойными кавычками. Они не должны быть в вашем XML, так как это сделает его недействительным. Скорее всего, у Дина J на самом деле был весь этот код на C# или PHP, поэтому для него нужно было экранировать кавычки.
Не уверен, что это было уместно, но у меня была непоследовательность в открытии файлов XDP при работе с подпрограммой слияния в VBA в различных случаях. Иногда это будет работать, а иногда нет.
В конце концов я заметил, что это происходит, когда Adobe Acrobat (собственно - не Reader) уже открыт или установлен по умолчанию для PDF, и по какой-то причине он пытался открыть XDP, а не Adobe Reader.
Следующий XML работает для меня:
<?xml version="1.0" encoding="UTF-8"?>
<?xfa generator='AdobeDesigner_V7.0' APIVersion='2.2.4333.0'?>
<xdp:xdp xmlns:xdp="http://ns.adobe.com/xdp/">
<xfa:datasets xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/">
<xfa:data>
<PlannedCycles>999</PlannedCycles>
<cyclenumber>1</cyclenumber>
<ConsultantName>Dr Jonathon Hogan-Doran</ConsultantName>
<Name>SMITH, Bob</Name>
<URN>9795240</URN>
<DOB>14/04/1901</DOB>
<ward>CDCO</ward>
<ht>100</ht>
<wt>99</wt>
<Diagnosis>Metastatic Adenocarcinoma</Diagnosis>
<chemoD1>17/06/2015</chemoD1>
</xfa:data>
</xfa:datasets>
<pdf xmlns="http://ns.adobe.com/xdp/pdf/" href="\\xxxxxxx.gov.au\Medical Oncology\Chemotherapy Scripts\S\SMITH, Bob- (75240) - dob 14.04.1901 - Capecitabine with Bevacizumab - Cycle 1.pdf"/>
</xdp:xdp>