如何从 acropdf 组件中获取选定文本以直接使用 Delphi 进行编辑 7
how to get the selected text from acropdf component to an edit directly with Delphi 7
我正在学习用 delphi 编写词典程序。到目前为止,我已经解决了有关 Word 文档的问题,但我遇到了一些有关 PDF 文档的问题。
我使用 Delphi 7 导入并安装了 AcroPdf 组件,我想从 Delphi 中的 ACROPDF 组件查看的 pdf 文档中获取用户通过 dblclicking 选择的单词(或文本)。如果我能得到它,我会直接将它发送到字典数据库。
如果你帮助我,我会很高兴。谢谢...
雷姆齐·马卡克
下面显示了一种从 Pdf 文档中获取 selected 文本的方法,它是
在 Adobe Acrobat Professional(v.8,英文版)中打开。
Update 这个答案的原始版本忽略了检查调用 MenuItemExecute
的布尔结果 and 指定了错误的参数给它。这两点都在此答案的更新版本中得到修复。事实证明,对 MenuItemExecute
的调用失败的原因是在尝试将文本 selected 复制到剪贴板之前,必须对 Acrobat 文档调用 BringToFront
。
创建一个新的 Delphi VCL 项目。
在 D7 的 IDE 中转到 Projects | Import Type Library
,然后在 Import Type Library
弹出窗口中向下滚动,直到看到类似“Acrobat(版本 1.0)”的内容在文件列表中,和
"TAcroApp, TAcroAVDoc..." 在 Class names
框中。那就是您需要导入的那个。单击 Create unit
按钮/
在项目的主窗体文件中
一个。确保它使用步骤 2 中的 Acrobat_Tlb.Pas 单元。您可能需要将保存 Acrobat_Tlb.Pas 的路径添加到项目的 SearchPath 中。
b。在窗体上拖放一个 TButton,将其命名为 btnGetSel
。在表单上拖放一个 TEdit 并将其命名为 edSelection
如下所示编辑主窗体单元的源代码。
在 Acrobat.MenuItemExecute('File->Copy');
上设置调试器断点 不要 在 [=21] 中设置断点=] 过程,因为这可能会打败其中对 BringToFront
的调用。
关闭任何 运行ning Adobe Acrobat 实例。在任务管理器中检查没有它的隐藏实例 运行ning。这些步骤的原因是确保当您 运行 您的应用程序时,它 "talks" 到它启动的 Acrobat 实例,而不是另一个。
编译并运行您的应用。打开应用程序 和 Acrobat 后,切换到 Acrobat,select 一些文本,切换回您的应用程序并单击 btnGetSel
按钮。
代码:
uses ... Acrobat_Tlb, ClipBrd;
TDefaultForm = class(TForm)
[...]
private
FFileName: String;
procedure GetSelection;
public
Acrobat : CAcroApp;
PDDoc : CAcroPDDoc;
AVDoc : CAcroAVDoc;
end;
[...]
procedure TDefaultForm.FormCreate(Sender: TObject);
begin
// Adjust the following path to suit your system. My application is
// in a folder on drive D:
FFileName := ExtractfilePath(Application.ExeName) + 'Printed.Pdf';
Acrobat := CoAcroApp.Create;
Acrobat.Show;
AVDoc := CoAcroAVDoc.Create;
AVDoc.Open(FileName, FileName); // := Acrobat.GetAVDoc(0) as CAcroAVDoc; //
PDDoc := AVDoc.GetPDDoc as CAcroPDDoc;
end;
procedure TDefaultForm.btnGetSelClick(Sender: TObject);
begin
GetSelection;
end;
procedure TDefaultForm.GetSelection;
begin
// call this once some text is selected in Acrobat
edSelection.Text := '';
if AVDoc.BringToFront then // NB: This call to BringToFront is essential for the call to MenuItemExecute('Copy') to succeed
Caption := 'BringToFront ok'
else
Caption := 'BringToFront failed';
if Acrobat.MenuItemExecute('Copy') then
Caption := 'Copy ok'
else
Caption := 'BringToFront failed';
Sleep(100); // Normally I would avoid ever calling Sleep in a Delphi
// App's main thread. In this case, it is to allow Acrobat time to transfer the selected
// text to the clipboard before we attempt to read it.
try
edSelection.Text := Clipboard.AsText;
except
end;
end;
我正在学习用 delphi 编写词典程序。到目前为止,我已经解决了有关 Word 文档的问题,但我遇到了一些有关 PDF 文档的问题。 我使用 Delphi 7 导入并安装了 AcroPdf 组件,我想从 Delphi 中的 ACROPDF 组件查看的 pdf 文档中获取用户通过 dblclicking 选择的单词(或文本)。如果我能得到它,我会直接将它发送到字典数据库。 如果你帮助我,我会很高兴。谢谢... 雷姆齐·马卡克
下面显示了一种从 Pdf 文档中获取 selected 文本的方法,它是 在 Adobe Acrobat Professional(v.8,英文版)中打开。
Update 这个答案的原始版本忽略了检查调用 MenuItemExecute
的布尔结果 and 指定了错误的参数给它。这两点都在此答案的更新版本中得到修复。事实证明,对 MenuItemExecute
的调用失败的原因是在尝试将文本 selected 复制到剪贴板之前,必须对 Acrobat 文档调用 BringToFront
。
创建一个新的 Delphi VCL 项目。
在 D7 的 IDE 中转到
Projects | Import Type Library
,然后在Import Type Library
弹出窗口中向下滚动,直到看到类似“Acrobat(版本 1.0)”的内容在文件列表中,和 "TAcroApp, TAcroAVDoc..." 在Class names
框中。那就是您需要导入的那个。单击Create unit
按钮/在项目的主窗体文件中
一个。确保它使用步骤 2 中的 Acrobat_Tlb.Pas 单元。您可能需要将保存 Acrobat_Tlb.Pas 的路径添加到项目的 SearchPath 中。
b。在窗体上拖放一个 TButton,将其命名为
btnGetSel
。在表单上拖放一个 TEdit 并将其命名为edSelection
如下所示编辑主窗体单元的源代码。
在上设置调试器断点 不要 在 [=21] 中设置断点=] 过程,因为这可能会打败其中对Acrobat.MenuItemExecute('File->Copy');
BringToFront
的调用。关闭任何 运行ning Adobe Acrobat 实例。在任务管理器中检查没有它的隐藏实例 运行ning。这些步骤的原因是确保当您 运行 您的应用程序时,它 "talks" 到它启动的 Acrobat 实例,而不是另一个。
编译并运行您的应用。打开应用程序 和 Acrobat 后,切换到 Acrobat,select 一些文本,切换回您的应用程序并单击
btnGetSel
按钮。
代码:
uses ... Acrobat_Tlb, ClipBrd;
TDefaultForm = class(TForm)
[...]
private
FFileName: String;
procedure GetSelection;
public
Acrobat : CAcroApp;
PDDoc : CAcroPDDoc;
AVDoc : CAcroAVDoc;
end;
[...]
procedure TDefaultForm.FormCreate(Sender: TObject);
begin
// Adjust the following path to suit your system. My application is
// in a folder on drive D:
FFileName := ExtractfilePath(Application.ExeName) + 'Printed.Pdf';
Acrobat := CoAcroApp.Create;
Acrobat.Show;
AVDoc := CoAcroAVDoc.Create;
AVDoc.Open(FileName, FileName); // := Acrobat.GetAVDoc(0) as CAcroAVDoc; //
PDDoc := AVDoc.GetPDDoc as CAcroPDDoc;
end;
procedure TDefaultForm.btnGetSelClick(Sender: TObject);
begin
GetSelection;
end;
procedure TDefaultForm.GetSelection;
begin
// call this once some text is selected in Acrobat
edSelection.Text := '';
if AVDoc.BringToFront then // NB: This call to BringToFront is essential for the call to MenuItemExecute('Copy') to succeed
Caption := 'BringToFront ok'
else
Caption := 'BringToFront failed';
if Acrobat.MenuItemExecute('Copy') then
Caption := 'Copy ok'
else
Caption := 'BringToFront failed';
Sleep(100); // Normally I would avoid ever calling Sleep in a Delphi
// App's main thread. In this case, it is to allow Acrobat time to transfer the selected
// text to the clipboard before we attempt to read it.
try
edSelection.Text := Clipboard.AsText;
except
end;
end;