Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi PDF an beliebigen Drucker schicken (https://www.delphipraxis.net/135760-pdf-beliebigen-drucker-schicken.html)

Moony 17. Jun 2009 11:28


PDF an beliebigen Drucker schicken
 
Hallo zusammen,

ich weiß, dieses Thema wurde bestimmt schon x-mal durchgekaut, aber ich habe mich die letzten 2 Tage durch etliche Foren, Anbieter, Componentenverwaltungen, etc. durchgewühlt, aber keine passende Lösung gefunden.

Zu meinem Problem:
Ich habe eine bestehende PDF Datei und möchte diese ohne Dialoge oder sonstiges an einem ausgewählten Drucker drucken. Habe bereits bestimmt 10 VCL Komponenten probiert, die alle lieferten aber nicht das gewünschte Ergebnis. Es muss doch eine Möglichkeit geben ein bestehendes PDF File zu öffnen (ohne Anzeige, Vorschau oder so) und dann an einen von den im System registrierten Drucker auszudrucken???

Alle Komponenten bieten die Möglichkeit von Konvertierung & co, aber das brauche ich nicht. Ich will lediglich ein PDF Dokument an einen von mir gewählten Drucker (nicht Standarddrucker) schicken. Ich weiß nicht, ob es eine Möglichkeit gibt das PDF File zu öffnen und an das Canvas des Druckers zu schicken, wie man das sonst mit Bilddateien machen würde.

Ich hoffe ihr habt irgendeine passende Lösung für mich.....ich verzweifle hier nämlich schon. :wall:

Danke & Gruß, Moony

mkinzler 17. Jun 2009 11:30

Re: PDF an beliebigen Drucker schicken
 
Man könnte es mit Report-Engines lösen

Moony 17. Jun 2009 11:31

Re: PDF an beliebigen Drucker schicken
 
Kenne ich nicht. Wie funktioniert das?

mkinzler 17. Jun 2009 11:33

Re: PDF an beliebigen Drucker schicken
 
Rave, QuickReports, FreeReports/FastReports, ...

Welche Delphi-Version?

Bernhard Geyer 17. Jun 2009 11:34

Re: PDF an beliebigen Drucker schicken
 
Zitat:

Zitat von mkinzler
Man könnte es mit Report-Engines lösen

Für bestehende PDF's?

mquadrat 17. Jun 2009 11:55

Re: PDF an beliebigen Drucker schicken
 
Jeder Acrobat Reader bringt ne DLL mit, die man in Delphi benutzen kann. Damit kann man die Datei öffnen und drucken. Wenn ich nicht irre dann auch ohne Dialoge. Könnte aber sein, dass dann immer auf dem Windows-Standarddrucker gedruckt wird. Ist schon ne Weile her, dass ich das probiert habe.

Moony 17. Jun 2009 12:01

Re: PDF an beliebigen Drucker schicken
 
Wie heißt denn die DLL und gibt es eine Dokumentation zu dieser über Deklarationen und co?

Ich verwende Delphi 7 & 2009. Aber da hat Bernhard glaube ich Recht, ich möchte nur ein PDF einlesen und Drucken.

nahpets 17. Jun 2009 12:04

Re: PDF an beliebigen Drucker schicken
 
Hallo,

schau mal bitte, ob Dir das da weiter hilft: http://www.swissdelphicenter.ch/de/showcode.php?id=793

mquadrat 17. Jun 2009 12:07

Re: PDF an beliebigen Drucker schicken
 
Das Ding schhimpft sich bei mir im Dialog "Komponente importieren" "Adobe Acrobat 8.0 Type Library" und liegt im Verzeichnis des Readers (AcroRd32.dll).

Mein Code schaut so aus:

Delphi-Quellcode:
     
      pdf := TAcroPDF.Create(self);
      pdf.Parent := parentPanel;      // Parent setzen nicht vergessen
      pdf.Align := alClient;
      result := true;
      try
        pdf.src := zuDruckendeDatei;  // Hier die Datei rein
        pdf.printAll;
      except
        result := false;
        //freeAndNil(pdf); Wenn man das Objekt freigibt wird nicht gedruckt?!
      end;
Wie im Kommentar steht kein FreeAndNil machen. Dann hat er zumindest bei mir nicht gedruckt. Wenn der Parent auf visible = false steht, dann sieht man auch nix.

Moony 17. Jun 2009 12:30

Re: PDF an beliebigen Drucker schicken
 
@nahpets: Diese Möglichkeit funktioniert schon mal, aber das PDF wird zusätzlich geöffnet und das will ich nicht. Also muss der Druck noch stillschweigend abgewickelt werden.

@mquadrat: Ich habe die Acrobat Komponente importiert, aber ich habe nirgends die Möglichkeit ein AcroPDF zu erstellen. Muss ich noch was beachten oder sonstiges?

mjustin 17. Jun 2009 13:55

Re: PDF an beliebigen Drucker schicken
 
Acrobat Reader - per Kommandozeile
http://www.wer-weiss-was.de/theme19/article4215509.html

Zitat:

"AcroRd32.exe /t path printername drivername portname

Initiates Acrobat Reader, prints a file while suppressing the Acrobat print dialog box, then terminates Reader."
Edit: soviel ich weiss ist es eine 'halboffizielle' Funktion, sie funktioniert eventuell nicht immer wie erwartet - das Acrobat Fenster bleibt auf, oder der Warpkern bricht.

Cheers,

Moony 17. Jun 2009 14:07

Re: PDF an beliebigen Drucker schicken
 
Wie ist das denn mit der Activex Komponente von Adobe? Habe die eingebunden, aber da fruchtete das auch nciht wirklich. Er sagt mir die Klasse wäre ncht registriert.

mjustin 17. Jun 2009 14:18

Re: PDF an beliebigen Drucker schicken
 
Zitat:

Zitat von Moony
Wie ist das denn mit der Activex Komponente von Adobe? Habe die eingebunden, aber da fruchtete das auch nciht wirklich. Er sagt mir die Klasse wäre ncht registriert.

Die konnte bisher nicht auf einen bestimmten Drucker ausgeben, daher haben wir die Notlösung mit der Kommandozeile verwendet.

Moony 17. Jun 2009 14:26

Re: PDF an beliebigen Drucker schicken
 
Das heißt damit komme ich wohl auch nicht weiter...

Aber es muss doch eine Möglichkeit geben, dass ich PDF Dateien stillschweigend an einen Drucker schicken kann. Meinerwegen kann diese Komponente auch was kosten.

Safti 18. Jun 2009 07:25

Re: PDF an beliebigen Drucker schicken
 
Du könntest dir mal das PDF-Toolkit von Gnostice anschauen, die Komponenten können noch ein bisschen mehr als nur PDFs zu drucken.

Moony 18. Jun 2009 07:38

Re: PDF an beliebigen Drucker schicken
 
Ja, die Komponente habe ich auch schon gesehen, aber ich finde das ein wenig teuer auch noch nur fürs Drucken die ProPlus Lizenz nehmen zu müssen.

nahpets 18. Jun 2009 08:55

Re: PDF an beliebigen Drucker schicken
 
Hallo,

habe da mal eine etwas abgefahrene Idee, die noch aus DOS-Zeiten stammt.

Wie ist der von Dir zu benutzende Drucker konfiguriert?

Wenn Du mal unter Drucker in die Eigenschaften schaust und dort unter Anschlüsse?
Wie ist der zu verwendende Drucker dort aufgeführt?

Links steht die Spalte Anschluss, ist dort etwas markiert, z. B. LPT1: ...
Dann könnte folgendes funktionieren:

Code:
copy pdfdateiname.pdf lpt1:
Das läßt sich auch in ein ShellExecute packen.

Mit dieser Methode kann ich bei uns zumindest PDF-Dateien auf unserem PDF-Drucker ausgeben (die Sinnhaftigkeit wollen wir hier nicht hinterfragen).

Code:
copy pdfdateiname.pdf \\pdfdruckerserver\PDFCreator:
Eventuell kannst Du damit ja was anfangen und daraus eine einfache Lösung bauen.

Moony 18. Jun 2009 09:02

Re: PDF an beliebigen Drucker schicken
 
Ja, das stimmt, das kenne ich auch. Aber leider weißich 1. nicht von Software Seite aus welche Schnittstelle der Drucker besitzt. Das müsste ich dann anhand des Druckernamens aus dem System ermitteln und 2. wird das zu größter Wahrscheinlichkeit ein USB Drucker sein.

Gibt es denn nicht eine Komponente mit der ich ein PDF einlesen, wie eine Bilddatei und anschließend diesen Inhalt auf das Druckercanvas schicken kann. Es kann doch nicht sein, dass ich nur zum Drucken eines PDF ohne Adobe entweder die Datei mit ShellExecute zusätzlich geöffnet wird oder ich 500€ für eine Komponente zahlen muss, nur damit ich stillschweigend ein Dokument drucken kann.... :wall:

Lannes 18. Jun 2009 09:03

Re: PDF an beliebigen Drucker schicken
 
Hallo,

hilft Dir das weiter ?
Print Documents From Delphi - Print PDF, DOC, XLS, HTML, RTF, DOCX, TXT

Zitat:

Now, here's the function you can use to print any document type to a specified printer:

Moony 18. Jun 2009 09:15

Re: PDF an beliebigen Drucker schicken
 
Danke, das habe ich auch schon gemacht, aber leider wird durch das Kommando SW_HIDE das PDF Dokument trotzdem mit dem Reader geöffnet und gedruckt. Dass es gedruckt wird ist das einzige was ich brauche. Hier stört das Öffnen des Pdf's. Und wenn es dafür eine Lösung gibt, bin ich voll und ganz glücklich.

chrischn 31. Okt 2009 09:02

Re: PDF an beliebigen Drucker schicken
 
Eventuell hilft der Foxit Reader, mit ihm kann man per Batch ein PDF drucken, ohne dass ein Fenster aufgeht :

foxit Reader.exe /p meinpdf.pdf --> Drucken mit Standard Drucker
foxit Reader.exe /t meinpdf.pdf MeinDrucker --> Drucken mit bestimmten Drucker

Gruß

Chrischn

mkinzler 31. Okt 2009 09:09

Re: PDF an beliebigen Drucker schicken
 
Ein einfaches ShellExecute mit print sollte eigentlich auch funktionieren

mjustin 31. Okt 2009 10:58

Re: PDF an beliebigen Drucker schicken
 
Zitat:

Zitat von Moony
Ja, die Komponente habe ich auch schon gesehen, aber ich finde das ein wenig teuer auch noch nur fürs Drucken die ProPlus Lizenz nehmen zu müssen.

Dann wäre eventuell noch für ca. 250 € die WPViewPDF V2 geeignet:

http://www.wpcubed.com/products/pdfviewer/index.htm

Diese ist mein Favorit, falls Acrobat mal an seine Grenzen stößt oder seine "undokumentierte" Druckfunktion nicht mehr verwendet werden kann.

Reinhard Kern 31. Okt 2009 13:26

Re: PDF an beliebigen Drucker schicken
 
Zitat:

Zitat von Moony
Danke, das habe ich auch schon gemacht, aber leider wird durch das Kommando SW_HIDE das PDF Dokument trotzdem mit dem Reader geöffnet und gedruckt. Dass es gedruckt wird ist das einzige was ich brauche. Hier stört das Öffnen des Pdf's. Und wenn es dafür eine Lösung gibt, bin ich voll und ganz glücklich.

Hallo,

was genau verstehst du unter "Öffnen"? Es gibt mit absoluter Sicherheit kein Programm, das eine PDF-Datei drucken kann, ohne die Datei zu öffnen.

Mit Ghostscript lässt sich das sicher mit einem (verborgenen) Script erledigen.

Gruss Reinhard

hathor 31. Okt 2009 15:19

Re: PDF an beliebigen Drucker schicken
 
Den gewünschten Drucker vorübergehend zum Standarddrucker zu machen sollte doch möglich sein.

Und dann...

Delphi-Quellcode:
uses ShellAPI;

procedure PrintPDF(Filename: WideString);
begin
  ShellExecuteW(0, 'open', 'acrord32', PWideChar('/p /h ' + Filename), nil, SW_HIDE);
end;

procedure TForm1.PrintPDF1Click(Sender: TObject);
begin
PrintPDF('test.pdf');
end;
You can display and print a PDF file using command lines with Acrobat and Acrobat Reader.
AcroRd32.exe filename - Executes the Reader and displays a file.
Other options for the command line are:
AcroRd32.exe /p filename - Executes the Reader and prints a file.
AcroRd32.exe /t path printername drivername portname - Initiates
Acrobat Reader, prints a file while suppressing the Acrobat print dialog
box, then terminates Reader.
The four parameters of the /t option evaluate to path, printername,
drivername, and portname (all strings).
printername - The name of your printer.
drivername - Your printer driver's name. Whatever appears in the Driver Used
box when you view your printer's properties.
portname - The printer's port. portname cannot contain any "/" characters;
if it does, output is routed to the default port for that printer.
If using Acrobat, substitute Acrobat.exe in place of AcroRd32.exe in the command lines.
option meaning:
/n Launch a separate instance of the Acrobat application, even if one is currently open.
/s Open Acrobat, suppressing the splash screen.
/o Open Acrobat, suppressing the open file dialog.
/h Open Acrobat in hidden mode.

Keldorn 31. Okt 2009 18:13

Re: PDF an beliebigen Drucker schicken
 
Zitat:

Zitat von Reinhard Kern
was genau verstehst du unter "Öffnen"? Es gibt mit absoluter Sicherheit kein Programm, das eine PDF-Datei drucken kann, ohne die Datei zu öffnen.

Hallo,

vielleicht verhalten sich neuere Version vom Acrobat reader anders. Mit "Öffnen" meint er, das der Acrobat reader sich trotz "Hide" etc. öffnet. Ich hatte wollte mit dem Acrobat Reader7/8 auch PDFs auf einem bestimmten Drucker mit wählbarer Kopieanzahl ausgeben. Letztenendes bin ich bei Bei Google suchenpdfp hängengeblieben. Angesteuert wirds auch per Shellexecute, allerdings aht es den Vorteil, das sich Druck und Anzahl der Kopien einstellen lassen. Auch wird der Reader nach dem Beenden auch wieder beendet, er ploppt allerdings kurz beim Drucken auf, ganz im Hintergrund ging es nicht.

Gruß Frank

Tod787 20. Jan 2011 15:59

AW: PDF an beliebigen Drucker schicken
 
Hänge gerade auch am selben Problem. Möchte ein bereits vorhandenes pdf ausdrucken ohne dass ein Acobat oder sonstiges Fenster aufgeht.
Es kann auch gerne eine Komponente sein doch da ich zunächst nur drucken möchte sind Komponenten wie PDFtoolkit und WPViewPDF zu teuer.

p80286 20. Jan 2011 17:07

AW: PDF an beliebigen Drucker schicken
 
Man könnte auch versuchen, das mit Hilfe von OLE zu lösen.
Ich muß allerdings sagen, daß ich meine Versuche OLE einzusetzen wg. fehlender bzw. unbrauchbarer Doku eingestellt hatte.

Gruß
K-H

HartmutG 21. Jan 2011 12:36

AW: PDF an beliebigen Drucker schicken
 
Ich nutze dazu QuickPDF (ca. 250 $) http://www.quickpdflibrary.com/ . Damit kann man ein PDF-Dokument in eine Druckdatei schreiben und diese dann mit CopyFile auf jede beliebige Druckqueue kopieren.

Gruß

Hartmut

Tod787 21. Jan 2011 15:23

AW: PDF an beliebigen Drucker schicken
 
Danke hab mir jetzt weitergeholfen indem ich nach dem Druck das Acrobat Fenster selbst schliesse. Ist viel nicht die feine Art aber es tuts :)

QuickPDF merk ich mir aber mal weil der Preis im Vergleich zu den anderen Komponenten ganz ok ist.

blawen 22. Mai 2011 20:21

AW: PDF an beliebigen Drucker schicken
 
Nur, um noch meinen "Senf" dazuzugeben und weil ich im Moment das gleiche Problem hatte ;-)

Delphi-Quellcode:
iFehlerCode := ShellExecute(Handle,'print', Dokument,'', Pfad, SW_HIDE);

Tod787 31. Mai 2011 15:03

AW: PDF an beliebigen Drucker schicken
 
Leider wird hier aber kein bestimmter Drucker mitgegeben.

mquadrat 31. Mai 2011 16:48

AW: PDF an beliebigen Drucker schicken
 
Und um die Liste komplett zu machen http://www.commandlinepdf.com/

Funktioniert wirklich gut, hat aber zwei Nachteile
  1. Die Lizenz ist hardwaregebunden
  2. Das Ding ist überteuert (149 $)

jus 3. Jun 2011 11:47

AW: PDF an beliebigen Drucker schicken
 
Ein andere Möglichkeit wäre die PDF Datei über Ghostscript in eine BMP Datei mit einer höheren Auflösung umwandeln zu lassen. Ist aber nur eine Idee, habe es selber noch nie probiert.

Lg,
jus


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:18 Uhr.

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