Заполнение PDF с XDP - PullRequest
       66

Заполнение PDF с XDP

2 голосов
/ 03 апреля 2012

У меня есть заполненный 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-файл выглядит следующим образом ( спасибо Дину J ):

<?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 ]

0 голосов
/ 18 июня 2013

Я также хочу поблагодарить Дина Джа за отличный ответ.Я использовал его раньше, и это сэкономило мне много времени и денег по сравнению с коммерческой лицензией iText или сервером LiveCycle.В указанном коде есть экранированная строка:

<pdf xmlns=\"http://ns.adobe.com/xdp/pdf/\">

Обратите внимание на обратную косую черту перед двойными кавычками.Они не должны быть в вашем XML, так как это сделает его недействительным.Скорее всего, у Дина J на ​​самом деле был весь этот код на C # или PHP, поэтому для него нужно было экранировать кавычки.

0 голосов
/ 17 июня 2015

Не уверен, что это было уместно, но у меня была непоследовательность в открытии файлов XDP при работе с подпрограммой слияния в VBA в различных случаях.Иногда это работает, иногда нетоткройте 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>
0 голосов
/ 26 апреля 2012

У меня также возникают проблемы с выполнением этого ...

Выполнение подобной вещи в 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) как String Dim Enc As String enc = System.Convert.ToBase64String (bt) Return enc End Function

...