Problem beim Ausdrucken von Pdf-Dateien mit QT

Chris199

Grünschnabel
Hallo,

ich habe folgendes Problem.
Ich würde gerne eine Pdf-Datei die bei mir auf dem Rechner liegt über eine Qt-Apllikation ausdrucken (muss vorher auch nicht angezeigt werden).

Texte und Bilder auszudrucken habe ich schon hinbekommen. Auch habe ich schon ein PDF mit Gimp in das .jpg-Format umgewandelt, dort lässt aber die Qualität sehr zu wünschen übrig.

Wie schaffe ich es nun eine PDF-Datei zu drucken?
(Ob über Standardt-Drucker oder Dialog ist erstmal egal)

Vielen Dank.

mfg
Chris
 
Hi.

Ein PDF zu drucken schaffst du nur über eine PDF Anwendung - also ein Programm welches das Format einer PDF Datei versteht. Du könntest z.B. Poppler (http://poppler.freedesktop.org/) verwenden.

Gruß

PS: Du könntest natürlich ein externes Programm wie z.B. Adobe Reader verwenden um die Datei zu drucken...
 
Zuletzt bearbeitet:
Auf das Modul bin ich auch schon gestoßen weiß aber leider nicht wie ich es unter Windows in mein Qt einbinden kann.

Gibts von Qt aus keine möglichkeit?

Und wenn nicht wie integriere ich Poppler und wie sieht dann die Syntax zum Pdf drucken aus?

mfg
Chris
 
Entschuldigung für den Doppelpost. Editieren ging leider nicht.

Ich hab mir jetzt überlegt es über einen Shell-Befehl aus der Qt-Anwendung heraus zu starten.

Benutze dazu QProcess. Habe es versucht mit start() und execute(). Leider passiert entweder gar nichts oder das Programm friert ein. Habe auch Sachen wie 'ping' und 'echo' versucht.

Wie genau führe ich einen Shell-Befehl über Qt aus? Muss ich irgendwas besonderes beachten?

mfg
Chris
 
Auf das Modul bin ich auch schon gestoßen weiß aber leider nicht wie ich es unter Windows in mein Qt einbinden kann.

Gibts von Qt aus keine möglichkeit?
Nicht das ich wüßte.
Und wenn nicht wie integriere ich Poppler und wie sieht dann die Syntax zum Pdf drucken aus?
Siehe http://doc.trolltech.com/qq/qq27-poppler.html

Wie du Poppler kompilierst usw. kannst du in dem Poppler Download lesen.
Ich hab mir jetzt überlegt es über einen Shell-Befehl aus der Qt-Anwendung heraus zu starten.

Benutze dazu QProcess. Habe es versucht mit start() und execute(). Leider passiert entweder gar nichts oder das Programm friert ein. Habe auch Sachen wie 'ping' und 'echo' versucht.
Warum nimmst du nicht einfach die system() Funktion?

\edit: "acrord32.exe /p <document.pdf>" druckt die angegebene Datei.

Gruß
 
Zuletzt bearbeitet:
Guten Morgen,

hab es dann mit system() versucht.

Leider öffnet sich mit

system("acrord32.exe /p c.\\Users\\***\\Documents\**.pdf");

nur kurz ein cmd-Fenster in dem steht das ich es entweder falsch geschrieben habe oder der Befehl nicht existiert.

Auch mit acrobat.exe habe ich es versucht, selbe Meldung. Gebe ich

acrobat.exe /p <pfad> allerdings bei "Ausführen" ein wird direkt Adobe Reader mit offenen Druckeinstellungen geöffnet.

Hab auch mal Testweise system("notepad /p <pfad>"); getestet und der Rechner beginnt zudrucken. (Natürlich nichts vernünftiges weil Notepad Pdf nicht interpretieren kann)

Wo liegt mein Fehler? Welche .exe/ welches Programm muss ich benutzen damit es klappt?


Danke für die Hilfe!

mfg
Chris

EDIT: Habe es hinbekommen. Mann muss den kompletten Pfad zur acrobat.exe angeben und dabei auf eventuelle Leerzeichen im Pfad achten.
Mit dem Parameter /p kann mann die Datei drucken und mit /p /h öffnet sich Adobe Acrobat nur minimiert.

Jetzt habe ich noch ein Problem. Leider bleibt Acrobat und ein leeres Cmd-Fenster danach offen. Acrobat ist nicht ganz so schlimm da es minimiert ist aber das "blöde" Cmd-Fenster stört schon.

Mehrer druckaufträge starte ich übrigens einfach durch einer erneute Zeile mit system(). Liege ich da richtig das das Programm erst den einen Befehl macht und wen ner damit fertig ist im Programmablauf weiterläuft?

mfg
Chris
 
Zuletzt bearbeitet:
Guten Morgen,

hab es dann mit system() versucht.

Leider öffnet sich mit

system("acrord32.exe /p c.\\Users\\***\\Documents\**.pdf");
Damit das funktioniert müßte acrord32.exe im Pfad sein (also das Verzeichnis in der PATH Umgebungsvariable).

Ansonsten müßtest den Pfad erstmal ermitteln. Ganz simpel könntest du davon ausgehen, dass standardmäßig der Adobe Reader unter %ProgramFiles%\adobe\reader 9.0\Reader installiert ist.

Die Umgebungsvariable ProgramFiles kannst du mit getenv ermitteln. Du könntest dann natürlich noch auf unterschiedliche Versionen prüfen.

Oder du könntest den Installationsordner über die Registry herausbekommen.

Gruß
 
Das mit dem Pfad habe ich ja jetzt hin bekommen drucken ( auch von mehreren Pdf's) funktioniert.

Mein Problem und weiter Fragen habe ich ja in den Edit geschrieben.

Halt wie das mit dem Programmablauf ist und ob es eine Möglichkeit gibt Cmd und eventuelle auch das Acrobat Fenster zu schließen.

mfg
Chris
 
Jetzt habe ich noch ein Problem. Leider bleibt Acrobat und ein leeres Cmd-Fenster danach offen. Acrobat ist nicht ganz so schlimm da es minimiert ist aber das "blöde" Cmd-Fenster stört schon.
Siehe http://www.biopdf.com/acrowrap/close_adobe_reader.php

Starte das Kommando mit "start" und der Option /b:
C:
system("\"start \"\" /b \"c:\\programe\\...\\acrord32\" /p \"doc.pdf\"\"");
Mehrer druckaufträge starte ich übrigens einfach durch einer erneute Zeile mit system(). Liege ich da richtig das das Programm erst den einen Befehl macht und wen ner damit fertig ist im Programmablauf weiterläuft?
Siehe http://www.cplusplus.com/reference/clibrary/cstdlib/system/

Und siehe "help start".

Gruß
 
So mit dem ausdrucken usw. klappt nun alles.

Habe nun aber ein weiteres Problem:

Ich möchte das der Benutzter den Pfad zur z.B acrobat.exe selber angeben kann.

Habe ein LineEdit gemacht wo der Pfad eingetragen werden kann.
Diesen Pfad bekomm ich ja mit:

Code:
pfad = ui->pathEdit->text() als QString;
oder
Code:
pfad = ui->pathEdit->text().toStdString(); als stdString

Jetzt möchte ich das in meinen System Befehl einbauen und habe es dazu nach const char* konvertiert. Allerdings meckert der compiler.

Code:
string pfad;
pfad = ui->pathEdit->text().toStdString();

const char *tmp = pfad.c_str();

const char *auftrag = "\"start \"\" /b" + tmp + "/p /h \"C:\\Users\\**\\Documents\\**.pdf\"\"";
    system(auftrag);

error: invalid operands of types `const char[13]' and `const char*' to binary `operator+'

Wo liegt mein Fehler und wie behebe ich das Problem?

mfg
Chris
 
Zurück