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