Einzelnen Beitrag anzeigen

Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#1

2 PDFium-Frames synchronisieren

  Alt 14. Nov 2017, 15:38
Delphi-Version: XE8
Hi zusammen
Von hier hab ich mir die synpdf.zip heruntergeladen. Sie enthält ein Beispielprogramm, das die PDFium.dll nutzt und das schon eigentlich alles macht, was ich realisieren will, nämlich PDFs anzeigen, auch mehrseitige.
Trotzdem sticht mich der Hafer, und so will ich das um eine Sidebar erweitern, die eine Übersicht über die in der PDF-Darei vorhandenen Seiten bietet. Halt etwa so, wie es in den gängigen PDF-Programmen der Fall ist.

Das klappt soweit - nur sollte ein Klick auf eine der Seiten in der Sidebar nun auch die entsprechende Seite im Hauptfenster anzeigen. Das klappt schon fast. Bis halt auf die Tatsache, dass dabei die Originalgrössen des PDFs berücksichtigt werden. Das führt dazu, das ein Klich auf Seite1 zwar auch diese zurückgibt, aber erst ein Klick auf Seite 4 in der Sidebar meldet eine andere Seite.

Ein klassisches ScreenToClient/ClientToScreen-Problem halt. Nur - um diese Methoden einsetzen zu können, bräuchte ich die Originalabmessungen der PDF-Seiten. Und wie ich die kriege, hab ich bislang nicht herausgefunden. Meine bisherigen Versuche:

Delphi-Quellcode:
procedure TSynpdfMain.BtnFileOpenClick(Sender: TObject);
  var PIndex : integer; PageHandle : THandle; PDFPage : TPDFPage;
begin
  if Opendialog1.Execute then
  begin
    Self.PDFiumFrame1.LoadFromFile(Opendialog1.FileName);
    Self.PDFiumFrame1.ZoomMode := zmPageWidth; //zmCustom; HPDFPage;
    Self.PDFiumFrame2.LoadFromFile(Opendialog1.FileName);
    Self.PDFiumFrame2.ZoomMode := zmPageWidth; // <--
    for PIndex := 0 to PDFiumFrame2.PageCount -1 do
    begin
      PDFPage := PDFiumFrame2.PageCount[PDFiumFrame2.PageIndex];
      PageHandle := PDFiumFrame2.PageCount[PIndex];
// Memo1.Lines.Add('PDFiumFrame2.Pages[PageIndex]).PageWidth))' +IntToStr(PDFiumFrame2.PageCount[PIndex]).h));
      Memo1.Lines.Add('PDFiumFrame2.Pages[PageIndex]).PageWidth))' +IntToStr(PDFPage.PageWidth));
      Memo1.Lines.Add('PDFiumFrame2.Pages[PageIndex]).PageHeight))' +IntToStr(PDFPage.PageHeight));
    end;

// Self.PDFiumFrame2
  end;
  Button3Click(Sender); //mnFitWidthClick(Sender); := Self.PDFiumFrame1.
end;
Die ersten 4 Zeilen laden das PDF in je einen Frame. Allerdings - in beiden Frames werden die PDFs übergross dargestellt, also nicht an die verfügbare Seitenbreite(Clientbereich) angepasst. Erst über den Button in der Werkzeugleiste kriege ich es hin, dass beide PDFs sich an den jeweiligen Clientbereich anpassen (siehe Anhang).

Innerhalb der Schleife wird ein Kompilierungsversuch schon bei der ersten Zeile abgebrochen. Die Fehlermeldung: Arraytyp erfforderlich. Die selbe Fehlermeldung steht gleich darunter für Zeile 2. Die Deklarationen im Publicteil des PDFiumFrames:
Delphi-Quellcode:
    property PageIndex: Integer read FPageIndex;
    property PageCount: Integer read FPageCount;
Die Funktion GetPage des Frames (Opensource):
Delphi-Quellcode:
function TPDFiumFrame.GetPage(PageIndex: Integer): TPDFPage;
var
  Index :Integer;
begin
  for Index := 0 to FPages.Count - 1 do
  begin
    Result := FPages[Index];
    if Result.Index = PageIndex then
      Exit;
  end;
  Result := TPDFPage.Create;
  FPages.Add(Result);
  Result.Index := PageIndex;
  Result.Handle := FPDF_LoadPage(FDocument, PageIndex);
end;
Die Funktion ist übrigens kein Getter eines Page-Propertys. Ich wollte dem Frame ein solches verpassen, aber da wird ein Kompilerungsversuch abgebrochen mit der etwas lapidaren Fehlermeldung: "Inkompatible Typen", ohne dass dabei die beiden Datentypen aufgeführt werden.

Was mache ich falsch?

Gruss
Delbor
Miniaturansicht angehängter Grafiken
synpdftestprojct.jpg  
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat