将 PDF 导出为 XML 并用 Delphi 填充标签
Export PDF as XML and fill the tags with Delphi
没有一些帮助我无法通过这个。
我正在尝试使用 Acrobat Reader 中的正确菜单将 PDF 文档导出到 XML/XDP。
我可以在 Acrobat Reader 中看到文档中的所有字段,并且可以用 Delphi 代码填充它们,除了 3 个标签。
当我尝试将字段的内容导出到 XML 时出现问题,并且 XML 不包含它应该包含的三个字段标签。它们根本不在 Acrobat Reader 生成的 XML 中,但正如我所说的,这些字段肯定可用,并且没有隐藏在 PDF 表单本身中。
例如:
Name : <Name></Name>
First name : <Firstname></Firstname>
Date : Missing in XML file
如何解释这三个字段未导出到 XML 而其余所有字段都导出的事实,我该如何调查造成差异的原因?
我希望我给了你足够的信息来帮助我。
我犹豫post这个作为答案,因为它不会直接回答你的问题
但它可能会为您指明正确的方向以进行一些自助。
除非您的 PDF 文件已损坏,否则您的 3 个问题字段的唯一合理解释,它只能与它们存储在 PDF 文件中的属性有关。正如您将从下面的 Acrobat Forms 界面摘录中看到的那样,每个字段都有大量可能的属性,我相信您应该能够识别出导致问题字段不同行为的差异.
AFORMAUTLib_TLB.Pas为导入单位
我从 Acrobat8 的表单插件生成(现在有点旧了,但我
不要认为这很重要)。它的摘录显示了 Acrobat IField 的界面和
可以为 Acrobat 表单中的字段设置 umpteen properties/attributes。
所以,在你的位置上,如果我绝对必须使用 Reader 生成的 XML,我会做的是编写一些代码
使用 AFORMAUTLib_TLB 中的对象转储表单字段的属性
看看我能不能找出你们三个之间的区别
问题领域和其他领域。使用 AFORMAUTLib_TLB 中的对象非常
直截了当 - 基本上,有一个 FormApp 对象可以让你打开
Acrobat 表单并提供对其 IFields 集合的访问,其中包含
表单上定义的每个字段的 IField 实例。这一切都彻底
记录在 Adobe 网站提供的 Acrobat SDK 中。
如果您花一两个小时玩弄 Forms 界面,我敢肯定您最终会被诱惑避免使用 Reader 的 XML 输出并简单地生成您的拥有来自表单中的 IField
个对象。当然,这是假设您确实需要 XML。
我想 - 但不确定(并且不想安装 Reader 来查找
out) 是 Acrobat Reader 是否有相同的插件来处理字段。
显然,如果没有,那么您就不适合这种方法了。
祝你好运!
PS:一旦你有一个感兴趣的领域的 IField
界面,你可以在 运行 时间调整它的属性和内容,所以如果你能找到不同之处(s) 导致问题的原因,它可能非常简单
应用 运行 次修复。
顺便说一句,导入单元中的接口对象可能很容易变成一个普通的
将 PDF 文档转换成表格并选择性地填写它,这就是您所需要的。不过,我不确定 Reader 中是否采取了任何措施来禁止此功能 - 如果您从事大量表格工作,那么完整版 Acrobat 的副本几乎是必不可少的。
更新: 我不确定 Acrobat 8 是否具有导出表单数据的功能(在表单下|管理表单数据|导出数据|保存类型:XML) 在功能上与您在 Reader 中使用的相同,但对其行为的简单观察是,如果在导出数据功能时,字段为空,则没有 XML 标记包含在导出的 XML 中。这与字段清空后表单是否已保存到磁盘无关。因此,如果您的表单出现这种情况,可能的解决方法是暂时将字段的值设置为非空值,将 PDF 导出到 XML,然后放弃更改。
// Type Lib: D:\Program Files\Adobe\Acrobat 8.0\Acrobat\plug_ins\AcroForm.api (1)
// IID\LCID: {7CD06992-50AA-11D1-B8F0-00A0C9259304}[=10=]
// *********************************************************************//
// Interface: IField
// Flags: (4416) Dual OleAutomation Dispatchable
// GUID: {673E8454-7646-11D1-B90B-00A0C9259304}
// *********************************************************************//
IField = interface(IDispatch)
['{673E8454-7646-11D1-B90B-00A0C9259304}']
function Get_Name: WideString; safecall;
function Get_Value: WideString; safecall;
procedure Set_Value(const pbstrVal: WideString); safecall;
function Get_IsHidden: WordBool; safecall;
procedure Set_IsHidden(pIsHidden: WordBool); safecall;
function Get_IsTerminal: WordBool; safecall;
function Get_Type_: WideString; safecall;
function Get_IsReadOnly: WordBool; safecall;
procedure Set_IsReadOnly(pIsRO: WordBool); safecall;
function Get_IsRequired: WordBool; safecall;
procedure Set_IsRequired(pIsReqd: WordBool); safecall;
function Get_PrintFlag: WordBool; safecall;
procedure Set_PrintFlag(pIsPrint: WordBool); safecall;
procedure SetBorderColor(const bstrColorSpace: WideString; GorRorC: Single; GorM: Single;
BorY: Single; K: Single); safecall;
procedure SetBackgroundColor(const bstrColorSpace: WideString; GorRorC: Single; GorM: Single;
BorY: Single; K: Single); safecall;
function Get_BorderWidth: Smallint; safecall;
procedure Set_BorderWidth(pVal: Smallint); safecall;
function Get_Alignment: WideString; safecall;
procedure Set_Alignment(const pVal: WideString); safecall;
function Get_CharLimit: Smallint; safecall;
procedure Set_CharLimit(pVal: Smallint); safecall;
function Get_DefaultValue: WideString; safecall;
procedure Set_DefaultValue(const pVal: WideString); safecall;
function Get_IsMultiline: WordBool; safecall;
procedure Set_IsMultiline(pVal: WordBool); safecall;
function Get_IsPassword: WordBool; safecall;
procedure Set_IsPassword(pVal: WordBool); safecall;
procedure SetExportValues(arrExportVal: OleVariant); safecall;
procedure SetJavaScriptAction(const bstrTrigger: WideString; const bstrTheScript: WideString); safecall;
procedure SetSubmitFormAction(const bstrTrigger: WideString; const bstrTheURL: WideString;
theFlags: Integer; arrFields: OleVariant); safecall;
procedure SetResetFormAction(const bstrTrigger: WideString; theFlags: Integer;
arrFields: OleVariant); safecall;
procedure SetButtonIcon(const bstrFace: WideString; const bstrFullPath: WideString;
pageNum: Smallint); safecall;
function Get_CalcOrderIndex: Smallint; safecall;
procedure Set_CalcOrderIndex(pVal: Smallint); safecall;
function Get_BorderStyle: WideString; safecall;
procedure Set_BorderStyle(const pVal: WideString); safecall;
procedure SetForegroundColor(const bstrColorSpace: WideString; GorRorC: Single; GorM: Single;
BorY: Single; K: Single); safecall;
procedure PopulateListOrComboBox(arrItems: OleVariant; arrExportVal: OleVariant); safecall;
function Get_Editable: WordBool; safecall;
procedure Set_Editable(pVal: WordBool); safecall;
function Get_Highlight: WideString; safecall;
procedure Set_Highlight(const pVal: WideString); safecall;
function Get_Style: WideString; safecall;
procedure Set_Style(const pVal: WideString); safecall;
function Get_TextFont: WideString; safecall;
procedure Set_TextFont(const pVal: WideString); safecall;
function Get_TextSize: Smallint; safecall;
procedure Set_TextSize(pVal: Smallint); safecall;
procedure SetButtonCaption(const bstrFace: WideString; const bstrCaption: WideString); safecall;
function Get_ButtonLayout: Smallint; safecall;
procedure Set_ButtonLayout(pVal: Smallint); safecall;
function Get_NoViewFlag: WordBool; safecall;
procedure Set_NoViewFlag(pVal: WordBool); safecall;
property Name: WideString read Get_Name;
property Value: WideString read Get_Value write Set_Value;
property IsHidden: WordBool read Get_IsHidden write Set_IsHidden;
property IsTerminal: WordBool read Get_IsTerminal;
property Type_: WideString read Get_Type_;
property IsReadOnly: WordBool read Get_IsReadOnly write Set_IsReadOnly;
property IsRequired: WordBool read Get_IsRequired write Set_IsRequired;
property PrintFlag: WordBool read Get_PrintFlag write Set_PrintFlag;
property BorderWidth: Smallint read Get_BorderWidth write Set_BorderWidth;
property Alignment: WideString read Get_Alignment write Set_Alignment;
property CharLimit: Smallint read Get_CharLimit write Set_CharLimit;
property DefaultValue: WideString read Get_DefaultValue write Set_DefaultValue;
property IsMultiline: WordBool read Get_IsMultiline write Set_IsMultiline;
property IsPassword: WordBool read Get_IsPassword write Set_IsPassword;
property CalcOrderIndex: Smallint read Get_CalcOrderIndex write Set_CalcOrderIndex;
property BorderStyle: WideString read Get_BorderStyle write Set_BorderStyle;
property Editable: WordBool read Get_Editable write Set_Editable;
property Highlight: WideString read Get_Highlight write Set_Highlight;
property Style: WideString read Get_Style write Set_Style;
property TextFont: WideString read Get_TextFont write Set_TextFont;
property TextSize: Smallint read Get_TextSize write Set_TextSize;
property ButtonLayout: Smallint read Get_ButtonLayout write Set_ButtonLayout;
property NoViewFlag: WordBool read Get_NoViewFlag write Set_NoViewFlag;
end;
没有一些帮助我无法通过这个。
我正在尝试使用 Acrobat Reader 中的正确菜单将 PDF 文档导出到 XML/XDP。
我可以在 Acrobat Reader 中看到文档中的所有字段,并且可以用 Delphi 代码填充它们,除了 3 个标签。
当我尝试将字段的内容导出到 XML 时出现问题,并且 XML 不包含它应该包含的三个字段标签。它们根本不在 Acrobat Reader 生成的 XML 中,但正如我所说的,这些字段肯定可用,并且没有隐藏在 PDF 表单本身中。
例如:
Name :
<Name></Name>
First name :
<Firstname></Firstname>
Date : Missing in XML file
如何解释这三个字段未导出到 XML 而其余所有字段都导出的事实,我该如何调查造成差异的原因?
我希望我给了你足够的信息来帮助我。
我犹豫post这个作为答案,因为它不会直接回答你的问题 但它可能会为您指明正确的方向以进行一些自助。
除非您的 PDF 文件已损坏,否则您的 3 个问题字段的唯一合理解释,它只能与它们存储在 PDF 文件中的属性有关。正如您将从下面的 Acrobat Forms 界面摘录中看到的那样,每个字段都有大量可能的属性,我相信您应该能够识别出导致问题字段不同行为的差异.
AFORMAUTLib_TLB.Pas为导入单位 我从 Acrobat8 的表单插件生成(现在有点旧了,但我 不要认为这很重要)。它的摘录显示了 Acrobat IField 的界面和 可以为 Acrobat 表单中的字段设置 umpteen properties/attributes。
所以,在你的位置上,如果我绝对必须使用 Reader 生成的 XML,我会做的是编写一些代码 使用 AFORMAUTLib_TLB 中的对象转储表单字段的属性 看看我能不能找出你们三个之间的区别 问题领域和其他领域。使用 AFORMAUTLib_TLB 中的对象非常 直截了当 - 基本上,有一个 FormApp 对象可以让你打开 Acrobat 表单并提供对其 IFields 集合的访问,其中包含 表单上定义的每个字段的 IField 实例。这一切都彻底 记录在 Adobe 网站提供的 Acrobat SDK 中。
如果您花一两个小时玩弄 Forms 界面,我敢肯定您最终会被诱惑避免使用 Reader 的 XML 输出并简单地生成您的拥有来自表单中的 IField
个对象。当然,这是假设您确实需要 XML。
我想 - 但不确定(并且不想安装 Reader 来查找 out) 是 Acrobat Reader 是否有相同的插件来处理字段。 显然,如果没有,那么您就不适合这种方法了。
祝你好运!
PS:一旦你有一个感兴趣的领域的 IField
界面,你可以在 运行 时间调整它的属性和内容,所以如果你能找到不同之处(s) 导致问题的原因,它可能非常简单
应用 运行 次修复。
顺便说一句,导入单元中的接口对象可能很容易变成一个普通的 将 PDF 文档转换成表格并选择性地填写它,这就是您所需要的。不过,我不确定 Reader 中是否采取了任何措施来禁止此功能 - 如果您从事大量表格工作,那么完整版 Acrobat 的副本几乎是必不可少的。
更新: 我不确定 Acrobat 8 是否具有导出表单数据的功能(在表单下|管理表单数据|导出数据|保存类型:XML) 在功能上与您在 Reader 中使用的相同,但对其行为的简单观察是,如果在导出数据功能时,字段为空,则没有 XML 标记包含在导出的 XML 中。这与字段清空后表单是否已保存到磁盘无关。因此,如果您的表单出现这种情况,可能的解决方法是暂时将字段的值设置为非空值,将 PDF 导出到 XML,然后放弃更改。
// Type Lib: D:\Program Files\Adobe\Acrobat 8.0\Acrobat\plug_ins\AcroForm.api (1)
// IID\LCID: {7CD06992-50AA-11D1-B8F0-00A0C9259304}[=10=]
// *********************************************************************//
// Interface: IField
// Flags: (4416) Dual OleAutomation Dispatchable
// GUID: {673E8454-7646-11D1-B90B-00A0C9259304}
// *********************************************************************//
IField = interface(IDispatch)
['{673E8454-7646-11D1-B90B-00A0C9259304}']
function Get_Name: WideString; safecall;
function Get_Value: WideString; safecall;
procedure Set_Value(const pbstrVal: WideString); safecall;
function Get_IsHidden: WordBool; safecall;
procedure Set_IsHidden(pIsHidden: WordBool); safecall;
function Get_IsTerminal: WordBool; safecall;
function Get_Type_: WideString; safecall;
function Get_IsReadOnly: WordBool; safecall;
procedure Set_IsReadOnly(pIsRO: WordBool); safecall;
function Get_IsRequired: WordBool; safecall;
procedure Set_IsRequired(pIsReqd: WordBool); safecall;
function Get_PrintFlag: WordBool; safecall;
procedure Set_PrintFlag(pIsPrint: WordBool); safecall;
procedure SetBorderColor(const bstrColorSpace: WideString; GorRorC: Single; GorM: Single;
BorY: Single; K: Single); safecall;
procedure SetBackgroundColor(const bstrColorSpace: WideString; GorRorC: Single; GorM: Single;
BorY: Single; K: Single); safecall;
function Get_BorderWidth: Smallint; safecall;
procedure Set_BorderWidth(pVal: Smallint); safecall;
function Get_Alignment: WideString; safecall;
procedure Set_Alignment(const pVal: WideString); safecall;
function Get_CharLimit: Smallint; safecall;
procedure Set_CharLimit(pVal: Smallint); safecall;
function Get_DefaultValue: WideString; safecall;
procedure Set_DefaultValue(const pVal: WideString); safecall;
function Get_IsMultiline: WordBool; safecall;
procedure Set_IsMultiline(pVal: WordBool); safecall;
function Get_IsPassword: WordBool; safecall;
procedure Set_IsPassword(pVal: WordBool); safecall;
procedure SetExportValues(arrExportVal: OleVariant); safecall;
procedure SetJavaScriptAction(const bstrTrigger: WideString; const bstrTheScript: WideString); safecall;
procedure SetSubmitFormAction(const bstrTrigger: WideString; const bstrTheURL: WideString;
theFlags: Integer; arrFields: OleVariant); safecall;
procedure SetResetFormAction(const bstrTrigger: WideString; theFlags: Integer;
arrFields: OleVariant); safecall;
procedure SetButtonIcon(const bstrFace: WideString; const bstrFullPath: WideString;
pageNum: Smallint); safecall;
function Get_CalcOrderIndex: Smallint; safecall;
procedure Set_CalcOrderIndex(pVal: Smallint); safecall;
function Get_BorderStyle: WideString; safecall;
procedure Set_BorderStyle(const pVal: WideString); safecall;
procedure SetForegroundColor(const bstrColorSpace: WideString; GorRorC: Single; GorM: Single;
BorY: Single; K: Single); safecall;
procedure PopulateListOrComboBox(arrItems: OleVariant; arrExportVal: OleVariant); safecall;
function Get_Editable: WordBool; safecall;
procedure Set_Editable(pVal: WordBool); safecall;
function Get_Highlight: WideString; safecall;
procedure Set_Highlight(const pVal: WideString); safecall;
function Get_Style: WideString; safecall;
procedure Set_Style(const pVal: WideString); safecall;
function Get_TextFont: WideString; safecall;
procedure Set_TextFont(const pVal: WideString); safecall;
function Get_TextSize: Smallint; safecall;
procedure Set_TextSize(pVal: Smallint); safecall;
procedure SetButtonCaption(const bstrFace: WideString; const bstrCaption: WideString); safecall;
function Get_ButtonLayout: Smallint; safecall;
procedure Set_ButtonLayout(pVal: Smallint); safecall;
function Get_NoViewFlag: WordBool; safecall;
procedure Set_NoViewFlag(pVal: WordBool); safecall;
property Name: WideString read Get_Name;
property Value: WideString read Get_Value write Set_Value;
property IsHidden: WordBool read Get_IsHidden write Set_IsHidden;
property IsTerminal: WordBool read Get_IsTerminal;
property Type_: WideString read Get_Type_;
property IsReadOnly: WordBool read Get_IsReadOnly write Set_IsReadOnly;
property IsRequired: WordBool read Get_IsRequired write Set_IsRequired;
property PrintFlag: WordBool read Get_PrintFlag write Set_PrintFlag;
property BorderWidth: Smallint read Get_BorderWidth write Set_BorderWidth;
property Alignment: WideString read Get_Alignment write Set_Alignment;
property CharLimit: Smallint read Get_CharLimit write Set_CharLimit;
property DefaultValue: WideString read Get_DefaultValue write Set_DefaultValue;
property IsMultiline: WordBool read Get_IsMultiline write Set_IsMultiline;
property IsPassword: WordBool read Get_IsPassword write Set_IsPassword;
property CalcOrderIndex: Smallint read Get_CalcOrderIndex write Set_CalcOrderIndex;
property BorderStyle: WideString read Get_BorderStyle write Set_BorderStyle;
property Editable: WordBool read Get_Editable write Set_Editable;
property Highlight: WideString read Get_Highlight write Set_Highlight;
property Style: WideString read Get_Style write Set_Style;
property TextFont: WideString read Get_TextFont write Set_TextFont;
property TextSize: Smallint read Get_TextSize write Set_TextSize;
property ButtonLayout: Smallint read Get_ButtonLayout write Set_ButtonLayout;
property NoViewFlag: WordBool read Get_NoViewFlag write Set_NoViewFlag;
end;