XPath无法与XFA一起正常使用 [英] XPath not working correctly with XFA
问题描述
我有一个具有DropDownList的动态PDF表单.我正在使用iTextSharp尝试修改PDF内的值,然后再将其发送给客户端.这是我正在尝试的方法,根据此问题中的答案:
I have a dynamic PDF form that has a DropDownList. I'm using iTextSharp to try and modify the values inside the PDF before sending it out to the client. Here's what I'm trying, as per an answer in this question:
PdfReader reader = new PdfReader(myPdfPath);
XmlDocument xdoc = reader.AcroFields.Xfa.DomDocument;
XmlNode dropdown = xdoc.SelectSingleNode("/*/template/subform[@name='form1']/subform[@name='form2']/field[@name='DropDownList1']");
但是无论我使用什么XPath表达式(例如://subform
或field[@name='DropDownList1']
),SelectSingleNode
始终返回null
,而SelectNodes
返回空列表.
But no matter what XPath expression I use (ex: //subform
or field[@name='DropDownList1']
), SelectSingleNode
always returns null
, and SelectNodes
returns an empty list.
我在这里做错什么了吗?如果有更好的方法,我很想知道.
Am I doing something wrong here? If there is a better way of doing this, I'd love to know.
这里是一些xml(我想要字段节点):
Here's some the xml (I want the field node):
<?xml version="1.0" encoding="UTF-8"?>
<xdp:xdp xmlns:xdp="http://ns.adobe.com/xdp/" timeStamp="2013-01-18T13:22:31Z" uuid="3c6141a4-56b4-4f6e-8a2d-4519050f1c69">
<template xmlns="http://www.xfa.org/schema/xfa-template/3.0/">
<?formServer defaultPDFRenderFormat acrobat9.1dynamic?>
<subform name="form1" layout="tb" locale="en_US" restoreState="auto">
<pageSet>
<pageArea name="Page1" id="Page1">
<contentArea x="0.25in" y="0.25in" w="576pt" h="756pt"/>
<medium stock="default" short="612pt" long="792pt"/> <?templateDesigner expand 0?>
</pageArea>
<?templateDesigner expand 0?>
</pageSet>
<subform w="576pt" h="756pt" name="form2">
<field name="DropDownList1" y="22.225mm" x="6.35mm" w="62mm" h="9mm">
<ui>
<choiceList>
<border>
<edge stroke="lowered"/>
</border>
<margin/>
</choiceList>
</ui>
<font typeface="Myriad Pro"/>
<margin topInset="1mm" bottomInset="1mm" leftInset="1mm" rightInset="1mm"/>
<para vAlign="middle"/>
<caption reserve="25mm">
<para vAlign="middle"/>
<value>
<text>Drop-down List</text>
</value>
</caption>
<items save="1">
<text>Item 1</text>
<text>Item 2</text>
<text>Item 3</text>
</items>
</field>
</subform>
<proto/>
<desc>
<text name="version">10.0.2.20120224.1.869952.867557</text>
</desc>
<?templateDesigner expand 1?>
<?renderCache.subset "Myriad Pro" 0 0 ISO-8859-1 4 112 28 0001000E001200130023002400250027002D0033003500420044004500460049004A004C004D004F00500051005300540055005600580059 -12BCDFLRTacdehiklnoprstuwx?>
</subform>
<?templateDesigner DefaultPreviewDynamic 1?>
<?templateDesigner DefaultRunAt client?>
<?templateDesigner Grid show:1, snap:1, units:0, color:ff8080, origin:(0,0), interval:(125000,125000)?>
<?templateDesigner DefaultCaptionFontSettings face:Myriad Pro;size:10;weight:normal;style:normal?>
<?templateDesigner DefaultValueFontSettings face:Myriad Pro;size:10;weight:normal;style:normal?>
<?templateDesigner DefaultLanguage JavaScript?>
<?acrobat JavaScript strictScoping?>
<?templateDesigner WidowOrphanControl 0?>
<?templateDesigner SaveTaggedPDF 1?>
<?templateDesigner SavePDFWithEmbeddedFonts 1?>
<?templateDesigner FormTargetVersion 30?>
<?templateDesigner Rulers horizontal:1, vertical:1, guidelines:1, crosshairs:0?>
<?templateDesigner Zoom 92?>
</template>
<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">
<annots/>
</xfdf>
<datasets xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/"></datasets>
</xdp:xdp>
推荐答案
您的XPath不起作用的原因是,大多数XML位于名称空间http://www.xfa.org/schema/xfa-template/3.0/
中.
The reason your XPaths don't work is that most of the XML is in the namespace http://www.xfa.org/schema/xfa-template/3.0/
.
在这种情况下,适当的做法是创建XmlNamespaceManager
并声明名称空间,然后在XPath中使用它们.请参阅这篇文章进行解释.
In cases like these, the appropriate practice is to create an XmlNamespaceManager
and declare the namespaces, then use them in your XPath. Please see this post for an explanation.
PdfReader reader = new PdfReader(myPdfPath);
XmlDocument xdoc = reader.AcroFields.Xfa.DomDocument;
XmlNamespaceManager nsm = new XmlNamespaceManager(xdoc.NameTable);
nsm.AddNamespace("xfa", "http://www.xfa.org/schema/xfa-template/3.0/");
XmlNode dropdown =
xdoc.SelectSingleNode("/*/xfa:template/xfa:subform[@name='form1']/xfa:subform[@name='form2']/xfa:field[@name='DropDownList1']",
nsm);
我也没有看到名称为"form2"的subform
元素.那只是您未包含在XML示例中的那一部分吗?
I also don't see a subform
element with the name "form2". Was that a piece you just didn't include in your XML sample?
这篇关于XPath无法与XFA一起正常使用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!