2011-05-04 6 views
0

Delph 7 및 Adobe Reader 버전 7의 ActiveX 컨트롤을 사용하여 ActiveX 구성 요소 (TAcroPDF)에 저장된 열린 PDF 문서에서 페이지 번호를 추출하는 데 성공했습니다. 최신 Adobe Reader로 업그레이드하는 데 관심이 있지만 Adobe Reader 8 (및 9)에서 변경되어 Adobe Reader 10/X를 업그레이드하지 못했습니다. Adobe 7에서는 Windows SDK 함수 인 EnumChildWindows를 사용하여 TAcroPDF 구성 요소가 포함 된 양식의 하위 창을 모으고 AVPageNumView라는 이름의 컨트롤을 찾은 다음 FindWindowEx라는 핸들을 사용하여 컨트롤을 찾습니다. 그런 다음 SendMessage를 호출하여 페이지 번호 정보가있는 해당 컨트롤의 텍스트를 가져옵니다. Adobe 8 및 9에서는 창/컨트롤 AVPageNumView가 더 이상 존재하지 않습니다. 따라서 어도비 7에 머물면서 페이지 번호, 어도비 9 또는 10/X를 얻는 방법을 찾고 있습니다. 목표는 다른 기술로 완전히 다시 작성하지 않아도 될 것이지만, 그 유일한 해결책이라면 나는 개방되어 있습니다.페이지 가져 오기 Adobe Reader의 ActiveX 컨트롤에서 PDF 문서 수

감사합니다, 마이클

답변

0

당신은 WNDCLASS 이름 (AVPageNumView)를 사용하고 있습니다. 분명히, 새 버전에서 클래스 이름이 변경되었습니다. WinDowse과 같은 것을 사용하여 새로운 버전의 Reader에서 창을 조사하여 새 클래스 이름을 확인할 수 있습니다. 먼저 코드를 업데이트하여 이전 wndclass를 확인하십시오. 발견되지 않으면 새로운 것을 찾으십시오.

0
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;