XPath无法与XFA一起正常使用 [英] XPath not working correctly with XFA

查看:98
本文介绍了XPath无法与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表达式(例如://subformfield[@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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆