繁体   English   中英

用XDP填充PDF

[英]Populating PDF with XDP

我有一个用于使用简单XFDF文件填充的PDF填充文件。 使用VS.NET 2010,我阅读了XFDF文档,并使用ds.WriteXML(XFDFName)填充了所有必要的信息并填充了PDF。 XFDF通过Process.Start(XFDFName)编写并启动。 这一切都在WinForms应用程序中。 几年来,这种方法一直是冠军。 到现在...

我遇到的问题是由于在Adobe LiveCycle中创建了文件,因此无法将数据导出为XFDF格式。 我注意到导出选项是(1)XML或(2)XDP。 过去,我可以导出到XFDF。 我认为没什么大不了的,只是另一种格式。 但是,我一直在为这两种选择而苦苦挣扎。 经过深思熟虑后,我决定使用XDP格式。

我已经用所需的所有信息构建了数据集,使用Process.Start(XDPName)打开新创建的XDP时收到错误。 Reader打开,出现以下错误: “ Adob​​e Reader无法打开'GUID_HERE.xdp',因为它不是受支持的文件类型,或者由于文件已损坏(例如,它作为电子邮件附件发送,并且没有正确解码)。”

我尝试使用直接指向PDF的href,但这也不起作用。 因此,我选择在该部分中将序列化的PDF保留在XDP中。

这个XDP文件如下所示( 感谢Dean 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正确启动/填充文件,对吗?

任何信息都会极大地帮助我。 谢谢。

我在完成此操作时也遇到问题。

在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()作为字节)作为字符串Dim enc作为字符串enc = System.Convert.ToBase64String(bt)返回enc结束函数

我还要感谢Dean J的出色回答。 我以前使用过它,它比商业iText许可证或LiveCycle服务器节省了很多时间和金钱。 在引用的代码中,有一个转义的字符串:

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

注意双引号前的反斜杠。 那些不应包含在您的XML中,因为它将使其无效。 可能Dean J实际上具有C#或PHP中的所有代码,因此需要为他转义引号。

不知道这是否相关,但是在不同情况下在VBA中处理合并子例程时,无法打开XDP文件。 有时它会起作用,而其他时候则不会。

最终,我注意到当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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM