Entwickler-Ecke

Sonstiges (Delphi) - Drucken / PDF erstellem


Silvio - Di 13.03.12 20:11
Titel: Drucken / PDF erstellem
Hallo,
ich habe ein Programm geschrieben, in dem Memofelder und Images sind. Wie kann ich diese im ausdrucken, oder vielleicht sogar als PDF speichern, um es späer ausdrucken zu können.
Ich habe den "PrintDialog" gefunden, weiß jedoch nicht, was ich genau schreiben soll, damit ich das speichern bzw. drucken kann.
Vielen Dank schon mal für eure Hilfe

LG S


bummi - Di 13.03.12 20:23

Zum Druck könntest Du, zu Fuß:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
uses Printers;

.....
Printer.Begindoc;
Printer.Canvas.  // Draw/Ellipse//Textout // alles was Canvas halt kennt verwenden
Printer.Enddoc;

verwenden ...

Du könntest per OLE Word fernsteuern
oder Du verwendest einen Reportgenerator, persönlich würde ich FastReport empfehlen ...


Silvio - Mi 14.03.12 08:33

Hi,

vielen Dank für die schnelle Antwort. Leider habe ich keinen Schimmer was du meinst.
Ich habe mir Delphi selbst beigebracht und leider noch nicht alle Sachen und Tools verstanden.
Habe gestern Abend noch das Geschriebene ausprobiert, jedoch leider ohne Erfolg.
Wenn ich das Formular in ein PDF umwandle, geht das mit 2 oder 3 Handgriffen einfacher, bzw. geht das überhaupt??
Ich glaube, dass wäre mir sogar lieber, dann kann jeder Benutzer selbst entscheiden, ob es gedruckt werden soll.

Dank und LG S


bummi - Mi 14.03.12 08:43

Ich habe noch keine Vorstellung was genau Du vor hast.
Wenn Du nur Dein Formular drucken willst, wähle beim Druckerdialog einen PDF-Drucker aus und rufe

Delphi-Quelltext
1:
 Print;                    

auf. Manche Komponenten (z.B. TRichedit) werden hierbei allerdings nicht wie gewünscht dargestellt.


Silvio - Mi 14.03.12 08:53

Also ich wähle im form1 etwas bestimmtes aus und bekomme dann in form 2 untersiedliche Ausschreibungstexte in einem Memofeld angezeigt. Außerdem bekomme ich ebenfalls ein Bild von der ausgewählten Sache zu sehen. Dieses möchte ich dann drucken oder ein PDF von erstellen.
Kann nur leider im Moment nichts ausprobieren, da ich an der Abeit bin.

Danke für deine schnellen Antworten und Hilfestellungen


jaenicke - Mi 14.03.12 09:04

PDFs lassen sich in Delphi leicht mit der Synopse PDF Engine erstellen. ;-)
[url]synopse.info/fossil/wiki?name=Downloads[/url]


Silvio - Do 15.03.12 08:53

Guten Morgen,

das mit "print" hat gut funtioniert, aber leider nicht so wie ich es mir gedacht habe.
Werde am Wochenende noch einmal die anderen Vorschläge ausprobieren.

Vielen Dank


Silvio - Fr 16.03.12 18:07


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var
  r:TRect;
  s:String;
begin
  s := Memo1.Text;
  r:=memo1.ClientRect;
  Canvas.TextRect(r,s,[tfWordBreak]); // Textout Zeilenweise geht auch (x,y) berechnen
//  Canvas.Draw(100,100,Image1.Picture.Graphic); // alles außer Bitmaps
//  Canvas.Draw(100,100,Image1.Picture.Bitmap);   // Bitmaps
    Canvas.StretchDraw(Rect(100,100,200,200),Image1.Picture.Graphic);
end;


Hallo, habe das eben ausprobiert. Doch leider kommt ein Fehler bei der eckigen Klammer.
Ich habe keine Ahnung was ich falsch mache.

Moderiert von user profile iconMartok: Delphi-Tags hinzugefügt


bummi - Fr 16.03.12 19:14

Du machst nichts falsch, Du hast wahrscheinlich eine alte Delphiversion mit einer anderen Implementierung von TextRect.

Delphi-Quelltext
1:
2:
3:
//  Canvas.TextRect(r,s,[tfWordBreak]); 
// kann wie folgt aufgerufen werden
DrawTextEx(Canvas.Handle, Pchar(s), Length(s), r, 16nil);


der Aufruf in den altern Versionen

Delphi-Quelltext
1:
Canvas.TextRect(r,0,0,s);                    

bringt keinen Zeilenumbruch


Delete - Sa 17.03.12 00:21

user profile iconSilvio hat folgendes geschrieben Zum zitierten Posting springen:
Hallo,
ich habe ein Programm geschrieben, in dem Memofelder und Images sind. Wie kann ich diese im ausdrucken, oder vielleicht sogar als PDF speichern, um es späer ausdrucken zu können.


Viele Wege führen nach Rom. Du könntest dir z.B. einen PDF-Drucker installieren (ich bevorzuge den PDF-Creator [http://www.pdfforge.org/]), und druckst dann einfach auf den Canvas des Druckers. Ich hab mal ein kleines Tool gemacht, mit dem man eingescannte Buchseiten in eine Listbox einlesen, entsprechend anordnen (sortieren) und als PDF-Datei ausdrucken konnte. Meine Druckerprozedur sah so aus:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
procedure TFormMain.Button_KonvertClick(Sender: TObject);
VAR
   Bild  : TImage;
   i,z   : Integer;
   Datei : String;

begin
     IF ListBox_Bilder.Count = 0 THEN EXIT;

     Bild  := TImage.Create(FormMain);

     z := ListBox_Bilder.Count -1;

     Printer.Title := Edit_Projektname.Text;
     Printer.BeginDoc;

     FOR i := 0 TO z DO
     BEGIN
          Datei := ListBox_Bilder.Items[i];
          IF FileExists(Datei) THEN
          BEGIN
               Bild.Picture.Bitmap.LoadFromFile(Datei);
               Printer.Canvas.Draw(PixLinks,PixOben,Bild.Picture.Graphic);
               IF i < z THEN Printer.NewPage;

               StatBar.Panels[1].Text := IntToStr(i);
               Application.ProcessMessages;
          END;
     END;

     Printer.EndDoc;

     FreeAndNil(Bild);
     StatusBarAktuell;
end;


Fertiges Programm incl. Quellcode und Handbuch herunterladen [http://www.pcheil.de/Bin/PC-Heil%20BildToPDF%20v1.0.zip]


Silvio - So 18.03.12 15:09

Hallo,

also bei mir funtioniert das drucken zwar, aber es kommt weder ein Bild noch der Text aus dem Memofeld.

Ich weiß nicht wo mein Fehler liegt.
Bitte helft mir!!

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm2.Drucken1Click(Sender: TObject);
var
  r:TRect;
  s:String;
begin
Printer.Begindoc;
Printer.Canvas.Font.Size := 12;
Printer.Canvas.Font.Name := 'Verdana';
  s := Memo1.Text;
  r:=memo1.ClientRect;
  DrawTextEx(Canvas.Handle, Pchar(s), Length(s), r, 16nil);
  //Canvas.TextRect(r,0,0,s);
  Canvas.Draw(100,100,Image1.Picture.Bitmap);   // Bitmaps
Printer.Enddoc;
end;

Danke

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


bummi - So 18.03.12 15:13

Auf Deinem Form müsste jetzt das zu sehen sein was Du malst, es sei denn es ist verdeckt von anderen Controls.
Es fehlt ein Printer. vor Deinem Canvas, so sprichst Du das Canvas Deiner Form an

Delphi-Quelltext
1:
2:
DrawTextEx(PRINTER.Canvas.Handle, Pchar(s), Length(s), r, 16nil);
//etc..


Silvio - So 18.03.12 15:30

Ja danke,

er druckt jetzt wenigstens schon mal den Anfang, jedoch nur immer 20 Buchstaben hintereinander und dann wieder eine neue Zeile.

Den Printer habe ich doch drin, was meinst du mit Canvas Diner Form?

Moderiert von user profile iconNarses: Beiträge zusammengefasst

Ah, ok. Habe das mit dem Printer verstanden.
Wie kann ich denn dem Bild sagen, an welcher Blattstelle es sein soll, also wenn ich es rechsoben haben möchte beispielsweise??


jaenicke - So 18.03.12 15:44

Naja, wohin gezeichnet werden soll steht in r drin. Da übergibst du ja nicht umsonst ein Rechteck. Siehe Doku:
http://msdn.microsoft.com/en-us/library/dd162499.aspx


Silvio - So 18.03.12 15:51

Woran erkenne ich das Rechteck?
Habe die Position jetzt ändern können

Wie kann ich die Größe des Bildes bestimmen?
Unter höhe und breite tut sich gar leider gar nichts


jaenicke - So 18.03.12 15:53

user profile iconSilvio hat folgendes geschrieben Zum zitierten Posting springen:
Wie kann ich die Größe des Bildes bestimmen?
Unter höhe und breite tut sich gar leider gar nichts
Suchst du vielleicht Canvas.StretchDraw oder StretchBlt? ;-)


Silvio - So 18.03.12 16:02

Printer.Canvas.StretchDraw (r,Image1.Picture.Bitmap);

ok danke, bild wird größer, aber bestimmen kann ich es immer noch nicht.
StretchBlt gibt es nicht


jaenicke - So 18.03.12 16:48

user profile iconSilvio hat folgendes geschrieben Zum zitierten Posting springen:
StretchBlt gibt es nicht
Nicht in Canvas, das ist eine einzelne Funktion. Wenn die nicht gefunden wird, fehlt dir die Unit Windows in der uses Klausel.


Silvio - Mo 19.03.12 20:37

DrawTextEx(PRINTER.Canvas.Handle, Pchar(s), Length(s), r, 16, nil);

hallo,

für was steht die 16?
ich habe jetzt einige sachen ausprobiert, er druckt das bild auch groß, aber immer nur an den linken rand, und ich möchte es gerne am rechten rand haben. der text aus dem memofeld soll rechts ausgegeben werden, aber der druckt immer nur drei zeilen und in jeder zeile max 10 buchstaben, an was liegt das??

hier noch mal mein quelltext:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm2.Drucken1Click(Sender: TObject);
var
  r:TRect;
  s:String;
begin
Printer.Begindoc;
Printer.Canvas.Font.Size := 12;
Printer.Canvas.Font.Name := 'Verdana';
  s := Memo1.Text;
  r:=memo1.ClientRect;
  DrawTextEx(PRINTER.Canvas.Handle, Pchar(s), Length(s), r, 16nil);
  Printer.Canvas.TextRect(r,50,50,s);
  Printer.Canvas.Draw(4000,500,Image1.Picture.Bitmap);   // Bitmaps
  //Printer.Canvas.StretchDraw (r,Image1.Picture.Bitmap);
Printer.Enddoc;



LG und danke

Moderiert von user profile iconMartok: Delphi-Tags hinzugefügt


bummi - Di 20.03.12 00:23

16 >> DT_WORDBREAK = $10;

versuch mal zu verstehen was TRect ist und wofür r hier verwendet wird ...

Jaenicke hatte Dir schon einen Link bzgl. DrawTextEx geschickt.
Hast Du schon einmal F1 gedrückt wenn der Cursor auf dem entsprechenden Wort steht.


Silvio - Di 20.03.12 20:21

das trect ein kasten ist, habe ich schon verstanden...
... jedoch wie ich den kasten an eine von mir ausgewählte stelle setzen kann, nicht!
und wenn F1 mir weiterhelfen würde, würde ich hier in diesem forum keine fragen stellen!

Danke


jaenicke - Di 20.03.12 21:01

user profile iconSilvio hat folgendes geschrieben Zum zitierten Posting springen:
... jedoch wie ich den kasten an eine von mir ausgewählte stelle setzen kann, nicht!
Entweder kannst du die Koordinaten manuell verändern (Rect.Top, Rect.Left, ... setzen) oder OffsetRect benutzen:
http://msdn.microsoft.com/en-us/library/dd162746.aspx


Silvio - Di 20.03.12 22:37

Hallo, dann lassen wir mal die ganze drucken geschichte, funtioniert mit Bild überhaupt nicht.

wie sieht es denn jetzt damit aus, memos und images in ein pdf umzuwandeln.
dann kann ich mir den ganzen quatsch mit dem drucken sparen, oder muss ich hier auch die seite erstellen??

ich bitte um erstgemeinte hilfe mit erklärung für anfänger

Danke