AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Adobe Acrobat via OLE oder Alternativen
Thema durchsuchen
Ansicht
Themen-Optionen

Adobe Acrobat via OLE oder Alternativen

Ein Thema von Jumpy · begonnen am 4. Jul 2014 · letzter Beitrag vom 4. Jul 2014
Antwort Antwort
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#1

Adobe Acrobat via OLE oder Alternativen

  Alt 4. Jul 2014, 09:06
Hallo,

ein altes Programm öffnet und druckt PDF-Dokumente via OLE-Automation von AdobeAcrobat 8.

Aus bestimmten Gründen reicht(e) der Reader damals nicht aus. Es gab da u.a. Probleme mit der Druckreihenfolge bei mehreren Dokumenten hintereinander auf Windows Vista und höher (bei Verwendung des Readers via ShellExecute zum ausdrucken).
Hier herrscht die Meinung vor, das ShellExecute ja quasi eine Fire and Forget Operation ist, wo dann evtl. der Reader ein großes Dokument öffnet, während schon ein zweites ShellExecute abgeschossen wird mit einem kleineren Dokument, das parallel schneller geöffnet und zum Drucker gesendet wird und schon ist die Druckreihenfolge durcheinander. Könnte das sein?

Das Problem ist, dass nun PDF-Dokumente verarbeitet werden müssen, mit denen Acrobat 8 nicht mehr zu recht kommt, so dass nun mehrere Optionen im Raum stehen:

- aktuellen Akrobat kaufen -> Frage: Reicht da für OLE Standard oder braucht man Professionel, weiß da wer was? In der SDK steht nur das OLE mit dem Reader nicht geht, aber heißt das wirklich das im Umkehrschluss Acrobat Standard und Professional beide gehen?

- PDF mit einer TWebbrowser-Komponente öffnen. Kann man da dann den Druck anstoßen? Wie das mit der Druckreihenfolge aussieht müsste dann noch getestet werden.

- Irgendeine PDF-Komponete für Delphi? Kann da jemand was empfehlen, was mit aktuellen PDFs zu recht kommt und günstiger ist als Adobe Acrobat.

- Gäbe es weitere Optionen?
Ralph
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#2

AW: Adobe Acrobat via OLE oder Alternativen

  Alt 4. Jul 2014, 09:29
Print a PDF file with dialog: AcroRd32.exe /P PdfFile
Print a PDF file silently: AcroRd32.exe /N /T PdfFile PrinterName [ PrinterDriver [ PrinterPort ] ]

Hinzugefügt:
Open a PDF file in a new instance of Adobe Reader: AcroRd32.exe /N PdfFile

Delphi-Quellcode:
procedure TForm1.ButtonClick(Sender: TObject); //PRINT
var fn : String;
begin
fn:=ExtractFilePath(ParamStr(0)) +'test-1.pdf';
ShellExecute(0, 'open','acrord32', PChar('/p /h ' + fn), nil, SW_HIDE);
end;

Geändert von hathor ( 4. Jul 2014 um 11:12 Uhr)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#3

AW: Adobe Acrobat via OLE oder Alternativen

  Alt 4. Jul 2014, 09:50
@hathor:

Das ist die Methode die bei vielfachen PDF's hintereinander nicht sauber funktioniert und die Druckreihenfolge verwurstelt, es sei denn einer der genannten Parameter verhindert das irgendwie?
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
662 Beiträge
 
#4

AW: Adobe Acrobat via OLE oder Alternativen

  Alt 4. Jul 2014, 10:41
Ich würde einfach anstatt ShellExecute() CreateProcess() verwenden. Dann kannst du warten, bis ein Dokument ausgedruckt ist und danach das nächste drucken.

Funktioniert dann zwar nicht "parallel", aber da der Drucker der limitierende Faktor sein dürfte, macht das nicht so viel aus.

Den gesamten Druckprozess kann man ja in einen Thread oder Prozess auslagern, damit man mit der Oberfläche weiterarbeiten kann.


Gruß,
Olli
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Adobe Acrobat via OLE oder Alternativen

  Alt 4. Jul 2014, 10:44
Wie wäre es denn mit einer Batchdatei?
Wenn ich mich richtig erinnere sollte die alles so machen wie Du es gerne hättest.

U.U können Dir die Dateien im Anhang weiter helfen.
(c) by EuPatentamt

Gruß
K-H
Angehängte Dateien
Dateityp: zip AcroDDE.zip (1,1 KB, 6x aufgerufen)
Dateityp: zip AcroPrintFile.zip (2,7 KB, 7x aufgerufen)
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Adobe Acrobat via OLE oder Alternativen

  Alt 4. Jul 2014, 10:53
Ich würde einfach anstatt ShellExecute() CreateProcess() verwenden. Dann kannst du warten, bis ein Dokument ausgedruckt ist und danach das nächste drucken.

Funktioniert dann zwar nicht "parallel", aber da der Drucker der limitierende Faktor sein dürfte, macht das nicht so viel aus.

Den gesamten Druckprozess kann man ja in einen Thread oder Prozess auslagern, damit man mit der Oberfläche weiterarbeiten kann.


Gruß,
Olli
Oder WaitForSingleObject()
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.132 Beiträge
 
Delphi 12 Athens
 
#7

AW: Adobe Acrobat via OLE oder Alternativen

  Alt 4. Jul 2014, 10:57
Hier herrscht die Meinung vor, das ShellExecute ja quasi eine Fire and Forget Operation ist, wo dann evtl. der Reader ein großes Dokument öffnet, während schon ein zweites ShellExecute abgeschossen wird mit einem kleineren Dokument, das parallel schneller geöffnet und zum Drucker gesendet wird und schon ist die Druckreihenfolge durcheinander. Könnte das sein?
Jupp,

aber teilweise kann man auch warten.
ShellExecAndWait, bzw. CreateProcess

Das kommt aber auf das gestartete Programm drauf an. Wenn man z.B. einen Launcher wartet, der wiederum einen weiteren Prozess startet, bzw. die Daten nur übergibt, und sich dann beendet, dann kommt das natürlich auch wieder "vorzeitig" zurück ... wobei der Launcher natürlich wirklich fertig ist.
Natürlich kann man dann auch nicht sowas wie ShellExecuteXXX(0, 'print', 'my.pdf', ...) machen, sondern muß sich schon direkt an das "richtige" Programm wenden.


Lokal könnte man auch versuchen die Druckerwarteschlange zu überwachen und sendet den nächsten Druckauftrag erst dann ab, wenn der Letzte durch ist.
Oder man überwachte die Acrobat-Instanzen und startet den nächsten Druck, wenn keine Instanz mehr aktiv ist, die aktuell etwas drucken soll.
Oder ...
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 4. Jul 2014 um 11:04 Uhr)
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#8

AW: Adobe Acrobat via OLE oder Alternativen

  Alt 4. Jul 2014, 11:06
@hathor:

Das ist die Methode die bei vielfachen PDF's hintereinander nicht sauber funktioniert und die Druckreihenfolge verwurstelt, es sei denn einer der genannten Parameter verhindert das irgendwie?

Es wird doch nur EINE Instanz geöffnet.
Mehrere Instanzen bekommt man mit dem Befehl:

Open a PDF file in a new instance of Adobe Reader: AcroRd32.exe /N PdfFile
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#9

AW: Adobe Acrobat via OLE oder Alternativen

  Alt 4. Jul 2014, 11:24
@hathor:

Das ist die Methode die bei vielfachen PDF's hintereinander nicht sauber funktioniert und die Druckreihenfolge verwurstelt, es sei denn einer der genannten Parameter verhindert das irgendwie?

Es wird doch nur EINE Instanz geöffnet.
Mehrere Instanzen bekommt man mit dem Befehl:

Open a PDF file in a new instance of Adobe Reader: AcroRd32.exe /N PdfFile
OK. Was passiert denn dann wenn ich 10x schnell hintereinander ShellExecute aufrufe? Geht das immer an die selbe (ggf. vom ersten Aufruf noch offene) Reader-Instanz? Und was passiert dann da, wenn die noch nicht mit dem Drucken fertig ist.
Ich kann den Vorgang halt nicht genau erklären, aber die Druckreihenfolge kann durcheinander kommen.

---------

Die anderen Aufruf-Vorschläge mit CreateProcess und ShellExecWait werde ich mal probieren, ob das da mit dem Timing besser hinkommt.
Reader-Prozess überwachen und erst den nächsten Druck starten wenn keine mehr da ist, könnte problematisch werden, wenn irgendwo in einer anderen Instanz noch ein Dokument offen ist, weil der User das so wollte, wäre also eher die Notlösung. Ebenso Spooler-Überwachung.

Danke für die Anregungen. Werde das mal an die Kollegen weiterleiten und mich dann in den Urlaub verabschieden.
Ralph
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:03 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