Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Canvas und seine Rätsel... (https://www.delphipraxis.net/212239-canvas-und-seine-raetsel.html)

Delbor 9. Jan 2023 21:32

Delphi-Version: 11 Alexandria

Canvas und seine Rätsel...
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi zusammen

Eigentlich sollte folgendes Codescnipsel ja kein Problem sein:
Anhang 55727
Das sollte so, auch nach dem Embarcadero Wikki, in Ordnung sein.
Deklariert ist es:
Delphi-Quellcode:
procedure TAlexPdfFormular.PdfViewCreate2;
  var i, j, X,Y : Integer;
Trorzdem wird die öffnende Indexklammer angemeckert...
Was mache ich falsch

Gruss
Delbor

Uwe Raabe 9. Jan 2023 22:26

AW: Canvas und seine Rätsel...
 
Die Frage ist doch: Wie ist Bitmap deklariert?

himitsu 9. Jan 2023 23:16

AW: Canvas und seine Rätsel...
 
und woher soll PDFView wissen auf welche Seite gemalt werden soll?

Delbor 10. Jan 2023 00:22

AW: Canvas und seine Rätsel...
 
Hi zusammen

Vielleicht mal erst die Prozedur, mit der ich die benötigten FPDFView erstelle :
Delphi-Quellcode:
procedure TAlexPdfFormular.PdfViewCreate2;
  var i, j, X,Y, B : Integer;
begin
    ....
    while i < j do
    begin
      FPDFView := TPDFView.Create(Self); //  <== Seite erstellen
      FPdfView.Parent := ScrBViewPdf;
      FPdfView.Name := 'PdfView'+intToStr(i);
      FPdfView.Pdf := Pdf1;
      FPdfView.Active := true;
      FPdfView.PageNumber := i+1;
      if FPdfView.BitmapCount >0 then
        ShowMessage('BitmapCount := ' + IntToStr(FPdfView.BitmapCount));  ;
//        FPdfView.Bitmap.
//      if FPdfView.BitmapCount >0 then
//      begin
//        ShowMessage('BitmapCount := ' + IntToStr(FPdfView.BitmapCount));
//        for B := 0 to FPdfView.BitmapCount-1 do
//        begin
////          FPdfView.Bitmap.Canvas.Draw(X,Y,Bitmap);
//          FPdfView.AddPicture(Bitmap,[Bitmap.x,Bitmap.y]);  //<=== ...ein weiterer, bislang erfolgloser versuch
//        end;


      end;
Hier folgen noch einige Zeilen, die aber nicht weiter wichtig sind.

FPdfView.BitmapCount gibt an, wieviele Bitmaps auf der Pdf-Seite enthalten sind - zumindest hab ich das bislang so begriffen. Hier habe ich einem Pdf-Dokument einen Stempel verpasst, der von einer Demo angezeigt wird, nicht aber von meinem Programm. In dieser Demo hab ich bislang aber kein TPicture- oder TBitmap-Objekt entdecken können. Das versteh ich so, dass diese Bitmap (?) aus der Datei geladen wird, in der auch die Positionsinfos enthlten sind - der Stempel wird (zugegeben: gefühlt) immer an der gleichen Stelle angezeigt.

Eine Bitmap ist lokal deklariert. Die speichert aber die gerade aktuelle Seite und existiert auch nur, während die Prozedur aufgerufen wird:
Delphi-Quellcode:
procedure TViewerFormMain.SpeedButtonSaveBitmapClick(Sender: TObject);
var Bitmap: TBitmap;
begin
  if SavePictureDialog.Execute then
  begin
    Bitmap := PdfView.RenderPage(0, 0, PdfView.Width, PdfView.Height, ro0, PdfView.Options);
    try
      Bitmap.SaveToFile(SavePictureDialog.FileName);
    finally
      Bitmap.Free;
    end;
  end;
end;
TPicture gibts da nicht.
Zitat:

und woher soll PDFView wissen auf welche Seite gemalt werden soll?
PDFView ist eine Seite.

Gruss
Delbor

hoika 10. Jan 2023 05:32

AW: Canvas und seine Rätsel...
 
Hallo,
der ausgeklammerte Code hatte noch kein [B].
Warum benutzt Du die Schleifenvariable B überhaupt mit Bitmap.

hoika 10. Jan 2023 05:36

AW: Canvas und seine Rätsel...
 
Hallo,
der Stempel (Wasserzeichen?) wird kein Bitmap sein, sondern was anderes ...

Welche Komponente ist das?

jaenicke 10. Jan 2023 06:49

AW: Canvas und seine Rätsel...
 
Aus deinem Code geht nicht hervor, welche Werte X und Y haben. Und zur Frage zur verwendeten Variable Bitmap hast du nur den Code gezeigt, mit dem du eine Seite als Bild speicherst. In der betreffenden Methode kommt diese hingegen in der Variablendeklaration nicht vor.

Draw erwartet jedenfalls eine einzelne Bitmap, die dann über das PDF gezeichnet wird. Ich verstehe dabei aber die Iteration über BitmapCount nicht, wenn du dann darin gar nicht auf
Delphi-Quellcode:
FPdfView.Bitmap[B]
zugreifst. Und wenn du darauf zugreifen würdest (das also mit
Delphi-Quellcode:
Bitmaps[B]
meintest), würdest du diese ja nicht auf das PDF zeichnen wollen, oder?

Zitat:

Zitat von hoika (Beitrag 1517266)
Welche Komponente ist das?

PDFium Component Suite von Winsoft

Delbor 10. Jan 2023 06:56

AW: Canvas und seine Rätsel...
 
Hi hoika
Zitat:

der Stempel (Wasserzeichen?) wird kein Bitmap sein, sondern was anderes ...
Nein, die Hilfedatei des Programms, mit dem der Stempel erzeugt wurde, spricht ausdrücklich von einer Bitmap, und das ist nicht das einzige Programm. Es besteht aber auch die Möglichkeit, in der PDF das entsprechende Stempel-Bild über TPicture anzusprechen - damit wäre BMP dann nicht mehr das einzig mögliche Format.

Es gibt aber auch eine Demo zur Erzeugung einer PDF - die setzt ein TImage zur Anzeige von Grafiken ein. Die Frage ist nur: wieso kann die Demo zur Anzeige eines PDFs einen Stempel, der diesem als Bitmap verpasst wurde, mit diesem ohne TBitmap oder TPicture-Objekt anzeigen, mein Programm aber nicht? Kann es sein, dass dieses Objekt aus der PDFium.DLL exportiert wird?

Ein weiteres Problem: woher weiss ich, wo in der PDF ich eine 'Stempel-Bitmap'(..) ausgeben muss, damit sie immer an derselben Stelle angezeigt wird? Diese Info ist mit Sicherheit in der Pdf-Datei enthalten - zumindest würde es mich sehr erstaunen, wenn es anders wäre.

Gerade sehe ich den Beitrag von jaenicke - den muss ich separat beantworten. Bis später also!

Gruss
Delbor

jaenicke 10. Jan 2023 07:03

AW: Canvas und seine Rätsel...
 
Kannst du vielleicht eine Beispiel-PDF und ein Beispiel-Projekt anhängen, damit wir das nachvollziehen können, was da passiert und was passieren soll? Die Trial sollte dafür ja reichen.

Delbor 10. Jan 2023 09:20

AW: Canvas und seine Rätsel...
 
Hi zusammen
[QUOTE=jaenicke;1517270]Aus deinem Code geht nicht hervor, welche Werte X und Y haben. Und zur Frage zur verwendeten Variable Bitmap hast du nur den Code gezeigt, mit dem du eine Seite als Bild speicherst. In der betreffenden Methode kommt diese hingegen in der Variablendeklaration nicht vor.
[/DELPHI]

Nein, das ist nicht der Code zum Speichern der PDF in eine Bitmap - der Rendert die komplette Seite in eine Bitmap und speichert diesen auf Platte ab. Das ist der Code zum anzeigen einer Pdf, wobei für jede im Dokument enthaltene Seite ein TPdfView-Objekt erzeugt wird. Dabei ist i der Zähler und j die Anzahl der Seiten.

Zitat:

Zitat von jaenicke (Beitrag 1517270)
Draw erwartet jedenfalls eine einzelne Bitmap, die dann über das PDF gezeichnet wird. Ich verstehe dabei aber die Iteration über BitmapCount nicht, wenn du dann darin gar nicht auf
Delphi-Quellcode:
FPdfView.Bitmap[B]
zugreifst. Und wenn du darauf zugreifen würdest (das also mit
Delphi-Quellcode:
Bitmaps[B]
meintest), würdest du diese ja nicht auf das PDF zeichnen wollen, oder?

TPdf (für das Komplette PDF-Dokument) und TPdfView haben ein Property BitmabCount. Darüber lässt sich (offenbar) feststellen, ob und wieviele Bitmaps im Dokument enthalten sind. Durch die Iteration kann (sollte) ich auf die einzelnen Bitmaps zugreifen - und wenn da nur eine ist, ist die Iteration entsprechend schnell beendet.


Zitat:

Zitat von hoika (Beitrag 1517266)
Welche Komponente ist das?

Zitat:

Zitat von jaenicke (Beitrag 1517270)
PDFium

PDFium ist die DLL von Google, das Pdf-Dokument, bzw. die einzelnen Seiten, werden von TPdf und TPdfView gekapselt.


Delphi-Quellcode:
// if FPdfView.BitmapCount >0 then
// begin
// ShowMessage('BitmapCount := ' + IntToStr(FPdfView.BitmapCount));
Das verät mir, dass überhaupt mindestens eine Bitmap da ist

Delphi-Quellcode:
// for B := 0 to FPdfView.BitmapCount-1 do
// begin
//// FPdfView.Bitmap.Canvas.Draw(X,Y,Bitmap);
// FPdfView.AddPicture(Bitmap,[Bitmap.x,Bitmap.y]); //<=== ...ein weiterer, bislang erfolgloser versuch
// end;
In der ersten Zeile zwischen beginn/end hätte ich nach 'Bitmap' den Index B angeben müssen. Aber welche Werte sind für X und Y richtig? Wo der Stempel (und damit die Bitmap) gesetzt wurde, steht im Dokument. Aber wie ich da ran komme - ich weiss es nicht.
Zweite Zeile: TPdfView kennt 2 Methoden AddPicture. Aber diese nützen mir nur etwas, wenn ich die Position(en) der Bitmap(s) kenne...

Eine Test-Pdf habe ich inzwischen erstellt und ihr einen Stempel verpasst. Doch wie ist das mit einem Beispielprogramm? Ich fürchte, das würde genau wie mein derzeitiges Programm den Stempel nicht anzeigen.
Zitat:

Die Trial sollte dafür ja reichen.
Die besteht gerade mal aus der DLL und der exe. Code ist da nicht dabei. Aber mal sehen - ich habe meinen Code aus einem Frame in ein Formular überführt. Dieses kann ich ja hier mal posten.

Gruss
Delbor


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:35 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz