AcroPdf Aktif Sayfa Numarası [Çözüldü]

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 362
Kayıt: 05 Oca 2012 12:55

AcroPdf Aktif Sayfa Numarası [Çözüldü]

Mesaj gönderen xozcanx »

Merhaba.
PDF dosyalarını görüntüleyebilmek için Acrobat activex lerini kullanıyorum.
forum ve nette araştırma yaptım ama sonuç alamadım.
Sorun başlıktada yazdığım gibi o an görüntülediğim sayfanın numarasını öğrenmek istiyorum. Controllerden de gözattım ama malesef sonuç alamadım.
Aşağıdaki resimde olduğu gibi 2. sayfa olduğunu başlık, label, edit vs. göstermek istiyorum.


Resim

Teşekkürler.
En son xozcanx tarafından 28 Kas 2014 03:49 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: AcroPdf Aktif Sayfa Numarası ?

Mesaj gönderen xxxjedixxx »

Merhaba,
Daha önce, bir klasördeki yüzlerce pdf dosyasının toplamda kaç sayfa olduğunu öğrenme ihtiyacım olmuştu. O zaman çok uğraşmıştım. Sonunda çözümü buldum ama çözüm lisanslı olan adobe reader çözümü ile oluyor. Çünkü standart reader, "AcroExch.PDDoc" class'ını sisteme kurmuyor. Senin ihtiyacın olan sayfa nosu da bu sınıf içinde vardır.

Aşağıdaki gibi sayfa adedinin alınabileceği kod lisanslı Acrobat kurulu sistemde çalışırken, standart reader kurulu sistemde çalışmıyor. Vermemiş adamlar.

Kod: Tümünü seç

var PdfDoc: OleVariant;
begin
  PdfDoc := CreateOleObject('AcroExch.PDDoc');
  PdfDoc.Open('C:\deneme.pdf');
  ShowMessage(Inttostr(PdfDoc.GetNumPages));
  PdfDoc.Close;
  PdfDoc := Null;
end;
Yardımcı olur mu bilmem ama aşağıdaki dokümanı incelemende fayda var.
http://wwwimages.adobe.com/content/dam/ ... _guide.pdf

Ayrıca;
Eğer ki açık olan bir Acrobat Reader penceresi üzerindeki sayfa noyu gösteren kutunun metnini alayım dersen şöyle bir şey yapılabilir. Reader sürümüne bağlı bir sorun olmazsa iş görür diye düşünüyorum.
Acrobat Reader'ın pencere sınıfı "AcrobatSDIWindow"
Sayfa numarasının yazılı olduğu container'ın sınıfı da "AVL_AVView"
Bu container içinde iki adet "Edit" sınıfı mevcut. İlki görünümün ölçeğini gösteren (%110 gibi) edit ve diğeri de bizim aradığımız sayfa nosunu gösteren edit.

Bu durumda aşağıdaki kod ile bu edit içinde yazan metni ben alabiliyorum. Umarım işine yarar.

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var hwnd: THandle;
    Txt: PChar;
    TxtLen: Integer;
begin
  hwnd := GetWindow(FindWindowEx(FindWindowEx(FindWindow('AcrobatSDIWindow', nil), 0, 'AVL_AVView', nil), 0, 'Edit', ''), GW_HWNDNEXT);
  if not IsWindow(hwnd) then Exit;
  TxtLen := SendMessage(Hwnd, WM_GetTextLength, 0, 0);;
  Txt := StrAlloc(TxtLen + 1);
  SendMessage(Hwnd, WM_GetText, TxtLen + 1, Integer(Txt));
  Edit1.Text := Txt;
end;
Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 362
Kayıt: 05 Oca 2012 12:55

Re: AcroPdf Aktif Sayfa Numarası ?

Mesaj gönderen xozcanx »

Merhaba;
Gönderdiğiniz makaleyi inceliyordum Teşekkür etmek için yazacaktım tekrar bir dönüş yaptığınız gördüm.
Şimdi ek paylaşımınızıda test ederek sonucu sizlerlerle de paylaşırım ilginizden dolayı teşekkürler.
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 362
Kayıt: 05 Oca 2012 12:55

Re: AcroPdf Aktif Sayfa Numarası ?

Mesaj gönderen xozcanx »

Vermiş olduğunuz örnekte sizinde bahsettiğiniz gibi dışarıdan açılan PDF dosyasının kaçıncı sayfası aktif görülebilmekte süründen kaynaklanan bir sorun da teşkil etmiyor.
Ama diğer türlü sıkıntı devam ediyor. Emeğiniz için tekrar Teşekkürler.
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: AcroPdf Aktif Sayfa Numarası ?

Mesaj gönderen xxxjedixxx »

Tekrar merhaba,

Bu kod, önceki verdiğim örnekle aynı mantıkta çalışıyor. Fakat bu örnek, formdaki TAcroPdf nesnesinin içerisinde sayfa no metnini arıyor. Bendeki Adobe sürümü XI ve bu kod çalışıyor.
Umarım İşine yarar.

Kod: Tümünü seç

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;
Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 362
Kayıt: 05 Oca 2012 12:55

Re: AcroPdf Aktif Sayfa Numarası ?

Mesaj gönderen xozcanx »

Merhaba,
2 farklı makinada test ettim 2 farklı sonuç aldım, 1. Sonuç "h8" 2.Sonuç "Ü<" oldu.
Dediğiniz gibi sürüm farklılığı olabilr diyerekten X sürümü vardı XI'e yükseltme yapıp tekrar deneyeceğim.
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 362
Kayıt: 05 Oca 2012 12:55

Re: AcroPdf Aktif Sayfa Numarası ?

Mesaj gönderen xozcanx »

Hocam Elinize sağlık Acrobat Reader XI yükseltmesi yaptıktan sonra sizin kodları başarılı bir şekilde çalıştırdım.İstediğim sonucu alabilmekteyim.
eğer sürüm 9 vs. ise bir önceki mesajda belirttiğim hataları vermekte ihtiyacı olanlarında bilgisi olsun kodlar XI sürümünde çalışmaktadır.
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: AcroPdf Aktif Sayfa Numarası ?

Mesaj gönderen xxxjedixxx »

Tekrar merhaba,

Kodu tekrar elden geçirdim. Adobe Reader 9, X ve XI sürümleri için çalışabilir hale getirdim.

Kod: Tümünü seç

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;

var TmpHwnd: THandle;
    TmpTxt: string;
begin
  Result := LongBool(True);
  if GetClassNameTxt(pHwnd) <> 'AVL_AVView' then Exit;

  TmpTxt := GetWindowTxt(pHwnd);
  if TmpTxt = 'AVPageView' then // Version  X, XI için
  begin
    TmpHwnd := FindWindowEx(pHwnd, 0, 'RICHEDIT50W', nil);
    if not IsWindow(TmpHwnd) then Exit;
    TEdit(Edit).Text :=  GetWindowTxt(TmpHwnd);
    Result := LongBool(False);
  end else
  if TmpTxt = 'AVToolBarView' then // Version 9 için
  begin
    TmpHwnd := GetWindow(FindWindowEx(pHwnd, 0, 'Edit', nil), GW_HWNDNEXT);
    if not IsWindow(TmpHwnd) then Exit;
    TEdit(Edit).Text :=  GetWindowTxt(TmpHwnd);
    Result := LongBool(False);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  EnumChildWindows(AcroPDF1.Handle, @EnumWindowProc, LongInt(Edit1));
end;
Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 362
Kayıt: 05 Oca 2012 12:55

Re: AcroPdf Aktif Sayfa Numarası ?

Mesaj gönderen xozcanx »

Merhaba;
Son gönderdiniz kodlar test edildi hiçbir sorun yok. Teşekkürler vermiş oldugunuz bilgi ve destek için.
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 362
Kayıt: 05 Oca 2012 12:55

Re: AcroPdf Aktif Sayfa Numarası ?

Mesaj gönderen xozcanx »

Merhaba;

Yukarıdaki işlemi acaba WebBrowser için gerçekleştirebilirmiyiz.

Yani şöyle PDF dosyaları üzerinde işlemlerimi Acrobat'a ait Activexleri kullanarak AcroPDF bileşeni ile yapıyordum burada şöyle bir sorun oldu her makineye kendi kullandığım Activexleri taşımam gerekiyor yada kendi kullandığım Acrobar Reader sürümünüde kullanıcının makenesine kurmam gerekiyor. Bu yüzden Webbrowser kullanmaya karar verdim ama yukarıdaki kodları WebBrowser için yorumlayamadım.

Kod: Tümünü seç

WebBrowser1.Navigate('D:\1.PDF#toolbar=1');
Teşekkürler.
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
Cevapla