从 Adobe Reader 的 ActiveX 控件获取 PDF 文档的页码
Posted
技术标签:
【中文标题】从 Adobe Reader 的 ActiveX 控件获取 PDF 文档的页码【英文标题】:Getting Page Number of PDF document from Adobe Reader's ActiveX control 【发布时间】:2011-05-04 19:54:46 【问题描述】:我成功地使用 Delph 7 和 Adobe Reader 版本 7 的 ActiveX 控件从 ActiveX 组件 (TAcroPDF) 中打开的 PDF 文档中提取页码。我有兴趣升级到最新的 Adobe 阅读器,但 Adobe Reader 8(和 9)发生了一些变化,导致我无法升级(我没有测试过 Adobe 10/X)。在 Adobe 7 中,我使用 Windows SDK 函数 EnumChildWindows 来收集包含 TAcroPDF 组件的表单的子窗口,并找到一个名为 AVPageNumView 的控件,然后使用 FindWindowEx 来获取它的句柄。然后我调用 SendMessage 来获取具有页码信息的控件的文本。在 Adobe 8 和 9 中,窗口/控件 AVPageNumView 似乎不再存在。因此,我被困在 Adobe 7 中,仍在寻找获取页码的方法,最好是 Adobe 9 或 10/X。目标是不必使用另一种技术进行完全重写,但如果这是唯一的解决方案,我对此持开放态度。
谢谢, 迈克尔
【问题讨论】:
【参考方案1】:您使用的是 wndclass 名称 (AVPageNumView
)。显然,新版本中的类名发生了变化。您可以使用 WinDowse 之类的东西来调查较新版本的 Reader 中的窗口,以找出新的类名。更新您的代码以首先检查旧的 wndclass;如果找不到,请尝试找到新的。
【讨论】:
【参考方案2】:function EnumWindowProc(pHwnd: THandle; Edit: Integer): LongBool; stdcall;
function GetWindowTxt(gwtHwnd: THandle): string;
var dWTextBuf: PChar;
TextLen: Integer;
begin
TextLen := SendMessage(gwtHwnd, WM_GetTextLength, 0, 0);;
dWTextBuf := StrAlloc(TextLen + 1);
SendMessage(gwtHwnd, WM_GetText, TextLen + 1, Integer(dWTextBuf));
Result := dWTextBuf;
StrDispose(dWTextBuf);
end;
function GetClassNameTxt(gcnHwnd: THandle): string;
var dWClassBuf: PChar;
begin
dWClassBuf := StrAlloc(1024);
GetClassName(gcnHwnd, dWClassBuf, 1024);
Result := dWClassBuf;
StrDispose(dWClassBuf);
end;
begin
Result := LongBool(True);
if (GetClassNameTxt(pHwnd) = 'AVL_AVView') and (GetWindowTxt(pHwnd) = 'AVPageView') then
begin
TEdit(Edit).Text := GetWindowTxt(FindWindowEx(pHwnd, 0, 'RICHEDIT50W', nil));
Result := LongBool(False);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
EnumChildWindows(AcroPDF1.Handle, @EnumWindowProc, LongInt(Edit1));
end;
【讨论】:
以上是关于从 Adobe Reader 的 ActiveX 控件获取 PDF 文档的页码的主要内容,如果未能解决你的问题,请参考以下文章
使用 VBA 和 Adobe PDF Reader 控件复制选定的文本
通过 c# 中的进程保存在 Adobe Reader 中打开的 pdf 文件
如何以编程方式知道 Adobe Reader 已完成文件加载?