如何将所选文本从 ACROPDF 组件直接使用 Delphi 7 进行编辑



我研究与德尔菲一起准备字典程序。到目前为止,我已经解决了有关Word文档的问题,但是有关PDF文档的问题。我使用 Delphi 7 导入并安装了 AcroPdf 组件,我想获取用户从 pdf 文档中通过 dblclick 选择的单词(或文本),该文档由 Delphi 中的 ACROPDF 组件查看。如果我能得到它,我会直接将字典数据库发送给它。如果你帮我,我会很高兴的。谢谢。。。雷姆齐·马卡克

下面显示了从 PDF 文档中获取所选文本的一种方法,即在 Adobe Acrobat Professional 中打开(v.8,英文版)。

更新 此答案的原始版本忽略了检查调用MenuItemExecute的布尔结果,并为其指定了错误的参数。 这两点都在此答案的更新版本中得到了修复。 事实证明,调用MenuItemExecute失败的原因是,在尝试将所选文本复制到剪贴板之前,必须调用 Acrobat 文档上的BringToFront

  1. 创建一个新的德尔福 VCL 项目。

  2. 在 D7 的 IDE 中转到 Projects | Import Type Library ,然后在Import Type Library弹出窗口中向下滚动,直到在文件列表中看到类似"Acrobat (版本 1.0)"的内容,以及"啪啪啪啪�在"Class names"框中。 这是您需要导入的那个。 单击Create unit按钮/

  3. 在项目的主表单文件中

    一个。 确保它使用步骤 2 中的 Acrobat_Tlb.Pas 单元。 您可能需要将路径添加到将 Acrobat_Tlb.Pas 保存到项目的 SearchPath 的任何位置。

    二. 在表单上放一个 TButton,将其命名为 btnGetSel 。 在窗体上放置一个 TEdit 并将其命名为 edSelection

  4. 编辑主表单单元的源代码,如下所示。

  5. 在 上设置调试器断点 Acrobat.MenuItemExecute('File->Copy'); 不要GetSelection过程中设置断点,因为这很可能会破坏对其中BringToFront的调用。

  6. 关闭任何正在运行的 Adobe Acrobat 实例。 在任务管理器中检查它是否没有隐藏的实例正在运行。 执行这些步骤的原因是确保在运行应用程序时,它会与它启动的 Acrobat 实例(而不是另一个实例)"对话"。

  7. 编译并运行应用。 打开应用程序和 Acrobat 后,切换到 Acrobat 并选择一些文本,切换回您的应用程序,然后单击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;

相关内容

  • 没有找到相关文章

最新更新