Acrobat Reader methot erişimi yardım.

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

Acrobat Reader methot erişimi yardım.

Mesaj gönderen xozcanx »

Merhaba,

Kod: Tümünü seç

uses
  ComObj, ActiveX,AcroPDFLib_TLB;
type
  .
  .
  .
  private
    function IsOLEObjectInstalled(Name: string): Boolean;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  xAcrobat:TAcroPDF;
implementation

{$R *.dfm}
function TForm1.IsOLEObjectInstalled(Name: String): Boolean;
var
  ClassID: TCLSID;
  Rez: HRESULT;
begin
  Rez := CLSIDFromProgID(PWideChar(WideString(Name)), ClassID);
  Result := (Rez = S_OK);
end;
function EnumWindowProc(pHwnd: THandle; Edit: Integer): LongBool; stdcall;
    function GetClassNameTxt(gcnHwnd: THandle): string;
    var dWClassBuf: PChar;
    begin
      dWClassBuf  := StrAlloc(1024);
      GetClassName(gcnHwnd, dWClassBuf, 1024);
      Result 	    := dWClassBuf;
      StrDispose(dWClassBuf);
    end;

    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;
begin
  Result := LongBool(True);
  if (GetClassNameTxt(pHwnd) = 'AVL_AVView') and (GetWindowTxt(pHwnd) = 'AVPageView') then
  begin
    TStatusBar(Edit).Panels[3].Text :=  GetWindowTxt(FindWindowEx(pHwnd, 0, 'RICHEDIT50W', nil));
    Result := LongBool(False);
  end;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  ac        :TOpenDialog;
  SayfaNo   :OleVariant;
begin
  StatusBar1.Panels[5].Text:='';
  ac  :=TOpenDialog.Create(Form1);
  try
    if ac.Execute then
    Begin
      xAcrobat.LoadFile(ac.FileName);
      xAcrobat.setShowToolbar(True);
      StatusBar1.Panels[5].Text:=ac.FileName;
      if IsOLEObjectInstalled('AcroExch.PDDoc') then
      Begin
        SayfaNo := CreateOleObject('AcroExch.PDDoc');
        SayfaNo.Open(ac.FileName);
        StatusBar1.Panels[1].Text:=IntToStr( SayfaNo.GetNumPages);
      End;
    End;
  finally
    FreeAndNil(Ac);
  end;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
  EnumChildWindows(xAcrobat.Handle, @EnumWindowProc, LongInt(StatusBar1));
end;

procedure TForm1.BitBtn3Click(Sender: TObject);
begin
  xAcrobat.setCurrentPage(StrToIntDef(Edit2.Text,1));
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
  s:Integer;
begin
  s           := xAcrobat.ControlInterface._AddRef;
  xAcrobat.Src:= '';
  xAcrobat.Free;
  xAcrobat    := Nil;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  xAcrobat          := TAcroPDF.Create(Form1);
  xAcrobat          := TAcroPDF.Create(Form1);
  xAcrobat.Parent   := Form1;
  xAcrobat.Align    := alClient;
  xAcrobat.Visible  := True;
end;

end.  
Yukarıdaki şekilde bir çalışma ile açılan PDF dökümandanın toplam sayfa sayısnı ve bazı PDF dosyalarında aktif olan sayfanın numarasını alabiliyorum. Fakat bazı PDF dosyalarından aktif sayfa numarasını alamıyorum. Sayfa numarasını aldığım ve alamadığım 2 dökümanı editör yardımı ile açarak baktığımda uyumluluğun, versiyonlarının farklı olmasından kaynaklı bir sorun olduğu gözüküyor sanırım. "%PDF-1.6" da sayfa numarasını alamazken "%PDF-1.7" ile istediğim gibi alabiliyorum.
Yukarıda olduğu gibi

Kod: Tümünü seç

 SayfaNo := CreateOleObject('AcroExch.PDDoc'); 
bir yapı ile "AVPageView" altında GetPageNum erişimi sağlanırsa aktif sayfanın numarasını alabiliriz sanırım. Buradaki bağlantı yapısını nasıl oluşturmak gerekiyor. Konu hakkında bilgi verebilir misiniz.

Resim

Şema kaynağı

Örnek Çalışma
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Acrobat Reader methot erişimi yardım.

Mesaj gönderen ertank »

Merhaba,

Öncelikle belirtmek isterim ki "sorun şudur" şeklinde direk bir cevap veremeyeceğim.

Sorunuzu sorar iken amacınızı yazı ile de yazmanızda fayda var. Kaynak kod okuyarak her zaman aynı amaç anlaşılmayabiliyor. Benim anladığım Delphi uygulamanız içinde PDF dosyalarını göstermek ve dosya ilk açıldığında dosyasının hangi sayfasına bakıldığını tespit etmek istiyorsunuz. Eğer farklı bir işlem yapmak istiyorsanız bunu açıkça belirtmenizi rica ediyorum.

TLB şeklinde oluşturulan ActiveX wrapper dosyaları ile ilgili en önemli konu versiyona özel olmalarıdır. Windows işletim sisteminin bazı bölümleri (Örn: Windows Explorer Shell entegrasyonu) ActiveX şeklindedir. Ancak farklı windows sürümleri arasında aynı ActiveX dosyasının aynı fonksiyonu farklı parametreler veya farklı çalışma şekli gösterebilir. Sizin kullandığınız AcroPDFLib_TLB için de durum aynı olacaktır.

Bağlantısını gönderdiğiniz döküman Acrobat 8.0 için yazılmış ve "Acrobat Reader" ifadesi döküman içinde hiç geçmiyor. Eğer siz Acrobat Reader içinden bilgi okumak istiyorsanız sorunun kaynağı bu da olabilir. Bu anlamda bilgisayarınızda yüklü olan uygulama ve sürüm bilgisi nedir bilinmiyor.

Kullandığım bilgisayara Adobe Acrobat veya Acrobat Reader uygulaması yüklemeyi istemediğim için (Sumartra PDF Viewer işimi her yönüyle görüp sistem kaynaklarını çok tüketmiyor) ve elimin altında teste hazır bir virtual işletim sistemi bulunmadığı için örnek uygulamanızı indirip detaylı incelemedim.

Mümkün ise denemek adına;
1- Kullandığınız mecut uygulamayı kaldırın
2- Aşağıdaki her yükleme sonrasında AcroPDFLib_TLB dosyasını yeniden oluşturun. Her sürüme ait AcroPDFLib_TLB dosyalarını uygun bir yerde saklayın.
2a- Önce kullandığınız uygulamanın daha eski sürüm yükleyin. Major sürüm değişikliği yapmanızda (9.x, 8.x, 7.x gibi) fayda vardır. Her bir major versiyon numarasının en son yayınlanmış sürümünü kullanmanız en mantıklı yöntem olabilir (Örn: 9.x versiyon en son 9.5 yayınlanmış ise 9.5 yükleyin. 9.0 veya 9.1 değil)
2b- Sorun çözülmez ise kullandığınız sürümden daha yeni bir sürüm yükleyin.
3- Eğer sorun çözülmez ise farklı sürüm yüklemelerini geriye dönük 2-3 major sürüm şeklinde deneyebilirsiniz.
4- Farklı sürümler arasında farklı içerikli AcroPDFLib_TLB dosyası oluşuyor mu kontrol edin. Eğer durum böyle ise istediğiniz işlemi gerçekleştirebilmek adına PDF dosyasının ve/veya yüklü olan Adobe/Adobe Reader uygulamasının belli bir sürüm olması gerekli olabilir. Örneğin Adobe 7.0 içinde GetPageNum() fonksiyonu olmayabilir.

Eğer amacınız sadece PDF dosyayı kendi uygulamanız içinde göstermek ise farklı çözümler önermek mümkün olabilir.
Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 362
Kayıt: 05 Oca 2012 12:55

Re: Acrobat Reader methot erişimi yardım.

Mesaj gönderen xozcanx »

Merhaba Hocam.
Zaman ayırıp bu kadar detaylı bir açıklama yaptığınız için teşekkürler.Allah razı olsun.
Öncelikle yapmak istediğimi bir örnek ile açıklamaya çalışayım.
Daha önceden klasörlere arşivlenmiş PDF dökümanları var. Farklı kategorideki PDF dökümanları tek bir dosyada birleştirilmiş. Benim yapmak istediğim, PDF dökümanını 1 defa kayıt etmek, hangi sayfasında hangi kategorideki evrağın olduğunu detaylandırmak. Master-Detail bir yapı.
AD_SOYAD.PDF
Sayfa 1 - Sağlık Raporu
Sayfa 2 - Özgeçmiş.
Sayfa 3 - Sabıka Kaydı
Personelin evrakları görüntülenmek istediğinde, kullanıcı sabıka kaydını seçtiğinde ben kullanıcıyı 3.sayfaya yönlendirmek istiyorum)

PDF dosyalarını görüntülemekte ve sayfa yönlendirmesinde sorun yaşamıyorum. Görüntülemek için TWebBrowser kullanıyorum hatta. Sorun yaşadığım nokta, uygulama içinde görüntülediğim PDF dökümanının hangi sayfasında olduğumu tespit etmek.

Yukarıdaki tam paylaşımını yaptığım kodlar aslında kısmi olarak çalışıyor ve tespit ediyor. Paylaştığım örnek çalışma dosyası içinde, bağlantı linkini göndenderdiğim dökümanın 2 farklı şekilde kaydedilmiş hali mevcut. 123.PDF dosyasını Not defteri ile açtığımızda başlangıcı "%PDF-1.7" şeklinde.
iac_developer_guide.PDF dosyasını açtığımda ise başlangıcı "%PDF-1.6" şeklinde.

Bilgisayarımda yüklü olan Acrobat Reader sürümünden bağımsız olarak aynı içeriğe sahip fakat kayıt yöntemi, uyumluğu fakrlı olan 123.PDF dosyasınının aktif sayfa numarasını alabilirken, iac_developer_guide.PDF dosyasının aktif sayfa numarasını alamıyorum.

Kulağı tersten tutmadan, OLE Object ile bu işi çözebilirmiyim :?: Şemadan bunun mümkün olabileceği anlıyorum eğer yanlış değerlendirmiyorsam :/
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Acrobat Reader methot erişimi yardım.

Mesaj gönderen ertank »

Bağlantısını verdiğiniz döküman Acrobat dökümanı ki bu ücretli tam sürüm uygulamadır. Adobe Reader için yüklenen ActiveX bileşeni sizin gönderdiğiniz dökümandaki tüm komutların kullanımına izin vermiyor. Sadece basit komutlara izin veriyor.
https://forums.ni.com/t5/LabVIEW/OLE-Au ... d-p/954493

Alternatif çözüm olarak Acrobat Reader uygulamasının portable sürümünü uygulamanız ile birlikte dağıtıp Acrobat Reader uygulamasını dışarıdan çalıştırarak ilgili sayfayı açmasını sağlayabilirsiniz.

Acrobat komut satırı parametreleri ile ilgili detaylı bilgiyi aşağıdaki bağlantıda bulabilirsiniz.
http://www.adobe.com/content/dam/acom/e ... meters.pdf

Örnek kod:

Kod: Tümünü seç

uses
  ShellApi;
  
var
  Parameter: string;
  PageNo: Integer;
  PDFFileToOpen: string;
begin
  PDFFileToOpen := 'ad_soyad.pdf';
  PageNo := 3;
  Parameter := '/A ' + AnsiQuotedStr('page=' + PageNo.ToString(), '"') + ' ' + AnsiQuotedStr(PDFFileToOpen, '"');
  ShellExecute(Application.Handle,
              'open',
              'c:\program files\acrobat\reader\reader.exe',
              PWideChar(Parameter),
              nil,
              SW_SHOWNORMAL);
NOT: Adobe reader uygulaması bilgisayarımda yüklü olmadığı için komutu test etme imkanım olmadı.
Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 362
Kayıt: 05 Oca 2012 12:55

Re: Acrobat Reader methot erişimi yardım.

Mesaj gönderen xozcanx »

Hocam bağlantılarını yaptığınız dökümanları daha öncesinde de incelemiştim.
Kod örneğinizde ise belgeyi Acrobat Reader ile açıyor ve 3. sayfayı direkt görüntülüyor.
*Sorun yaşadığım nokta; istediğim sayfayı ekranda görüntülemek değil, görüntülediğim sayfanın kaçıncı sayfa olduğunu öğrenmeye çalışıyorum :/

Tüm makinelerde dökümanları PDF olarak yazdırıp kayıt yapacağımız uygulamamız var. En kötü ihtimal kullanıcıyı bir kaç sn bekleterek sıkıntılı dökümanları PDF yazıcımız ile ("%PDF-1.7" versiyon uyumluluğu ile) yazdırarak bu döküman üzerinde işlem yapacağım.Kulağı tersten tutmak dediğim nokta da bu kısım oluyor :(

Buradaki dökümanda(sayfa 153) ilgili sayfadan itibaren OLE Methods yardımı ile PDDoc.GetNumPages metoduna(Sayfa 156) erişimi anlatılıyor sanırım bu dökümanı yorumlamaya çalışıyorum.

Zaman ayırdığınız ve emeğiniz için tekrardan teşekkürler hocam.
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Acrobat Reader methot erişimi yardım.

Mesaj gönderen ertank »

xozcanx yazdı: 29 Ara 2017 09:22 Personelin evrakları görüntülenmek istediğinde, kullanıcı sabıka kaydını seçtiğinde ben kullanıcıyı 3.sayfaya yönlendirmek istiyorum)
Yukarıdaki yazınıza istinaden çözüm önerisi olarak sunmuştum.
xozcanx yazdı: 29 Ara 2017 03:35 Sorun yaşadığım nokta; istediğim sayfayı ekranda görüntülemek değil, görüntülediğim sayfanın kaçıncı sayfa olduğunu öğrenmeye çalışıyorum :/
Gösterilen sayfayı öğrendikten sonra bu bilgiyi ne şekilde kullanacaksınız? Neden bu bilgiyi öğrenmek istiyorsunuz?
xozcanx yazdı: 29 Ara 2017 03:35 Buradaki dökümanda(sayfa 153) ilgili sayfadan itibaren OLE Methods yardımı ile PDDoc.GetNumPages metoduna(Sayfa 156) erişimi anlatılıyor sanırım bu dökümanı yorumlamaya çalışıyorum.
Bağlantısını verdiğiniz döküman yine Adobe Acrobat dökümanı. Adobe Reader değil. Daha önce söylediğim ve örnek tartışma forum bağlantısını paylaştığım gibi. Adobe Reader ile gelen ActiveX bileşeni tüm fonksiyon ve özellikleri desteklemiyor.
Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 362
Kayıt: 05 Oca 2012 12:55

Re: Acrobat Reader methot erişimi yardım.

Mesaj gönderen xozcanx »

Sanırım Free versiyonlar ile buraya kadar işlem yapılabiliyor :roll:
Erişmek istediğim "AcroExch.AVPageView" Metotları Acrobat Reader kurulumlarında Windows registry yapılmadığı için kullanımı şimdilik mümkün gözükmüyor. Döküman üzerinde kontrol yaparak belirttiğim şartları sağlamayan dökümanları tekrardan kendi kullanımıma uyumlu şekilde oluşturup işleme devam edeceğim.
ertank yazdı: 29 Ara 2017 04:07
xozcanx yazdı: 29 Ara 2017 03:35 Sorun yaşadığım nokta; istediğim sayfayı ekranda görüntülemek değil, görüntülediğim sayfanın kaçıncı sayfa olduğunu öğrenmeye çalışıyorum :/
Gösterilen sayfayı öğrendikten sonra bu bilgiyi ne şekilde kullanacaksınız? Neden bu bilgiyi öğrenmek istiyorsunuz?
Hocam tek bir döküman içinde birden fazla evrak görüntüsü eklenmiş durumda.Seri tarama yapılmış. Bunları veritabanına kayıt etmem gerekiyor.
Ben evrağı kaydettikten sonra hangi sayfasında hangi döküman var bu bilgileri 2. bir tabloda tutmak istiyorum. Kullanıcı daha sonra XXX evrağını seçtiğinde ilgili evrağın olduğu sayfaya gidecek. Yani hangi sayfada olduğunu döküman içinde aramak zorunda kalmayacak.

Yardımlarınız ve gösterdiğiniz sabır için teşekkürler hocam.
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Acrobat Reader methot erişimi yardım.

Mesaj gönderen ertank »

Anladığım kadarıyla kullanıcıya PDF dökümanı içindeki her bir sayfanın ne tür bilgi içerdiğini bir yere yazdıracaksınız. Aksi takdirde hangi sayfada ne olduğunu bilmenizin yolu yok.

Anlayamadığım ise zaten kullanıcı PDF dökümanı içinde geziniyor iken hangi sayfada ne olduğunu neden bir bileşen içine girmiyor?

Şöyle bir yöntem izleyemez misiniz?
1- Kullanıcıya mevcut çok sayfalı dökümanı ekranda Adobe Reader ile gösterin. Her sayfasını istediği gibi gezsin. Adobe Reader ekranda sayfa numarasını gösterebiliyor.
2- Aynı ekranda yan tarafta sizin uygulamanız olup bir memo vb bileşene kullanıcı her bir sayfanın içerdiği bilgiyi yazsın.
3- Siz hiç PDF dosyası içinde hangi konumda olduğunu anlamaya çalışmayın. Gerekli bilgiyi toplamış olun.

Şahsen böyle bir iş yapıyor olsam PDF dökümanlarını aşağıdaki ücretsiz DLL yardımı ile her sayfasını ayrı PDF dökümanı halinde parçalar, kullanıcı karşısına tek sayfalık PDF dosyasını gösterir, PDF ile ilgili başlık, içerik vb bilgileri kullanıcıdan yazmasını isteyip database içinde saklardım. Bu PDF dosyalarını kaydettiğim database normal veri kaydedilen database dışında farklı bir database olurdu ki kendi performans sorunlarını kendisi yaşasın.
https://sourceforge.net/projects/litepdf/

Dosya sistemi üzerinde durup database içine bağlantısı kaydedilen bütün dökümanların muhakkak bir kaybolma riski vardır.
Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 362
Kayıt: 05 Oca 2012 12:55

Re: Acrobat Reader methot erişimi yardım.

Mesaj gönderen xozcanx »

Methaba hocam.
Toplamda en fazla 5 farklı kategoride evrak var. bir evrağın 2 yada 3 sayfa olabilme ihtimali var.
Her sayfa için bir buton yerleştirdim. xxx.pdf dökümanını seçtiğinde 5 butondan hangisini seçerse, öncelikle kayıt edilip edilmediğini kontrol edeyiroum. Kayıt yapılmamış ise evraklar tablosuna kaydını yapıyorum daha sonra seçili butona göre evrakdetay tablosuna evrak türünü ve sayfa numarasını kayıt ediyorum, kullanıcının hangi sayfa olduğunu yazmasını istemiyorum.
kayıt esnasında kontrolün bende olmasını, kontrol aşamasında ise kullanıcıda olsun istiyorum.

Her sayfayı ayrı parçalara ayırabilirim ve bunları listbox yardımı ile listeleyip yine hangi içeriğe sahip olduğunu kullanıcıdan isteyebilirim. Buradaki sıkıntı ise aralarındaki bir evrağın 2 yada 3 sayfafan oluşması. Onunda parçalı olması bana 2. bir iş yükü çıkaracağını düşünüyorum.
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
Cevapla