Forum: PC-Programmierung PHP und PDF mit verschiedenen Papierfächern


von Nachteule (Gast)


Lesenswert?

Hallo allerseits,

hier gibt es so viele erfahrene Programmierer, da ist eventuell einer 
dabei, der mir einen Rat geben kann, wie man in einer PHP-Anwendung am 
besten PDF-Dokumente erzeugt und dann die Seiten auf verschiedenen 
Druckerschächten ausdrucken kann. Es geht also z.B. um Dokumente, bei 
denen einige Seiten auf speziellem Briefpapier gedruckt werden müssen 
und andere auf normalem Druckerpapier.

Ich habe schon lange nichts mehr mit Druckerprogrammierung gemacht, aber 
ich glaube mich zu erinnern, dass ich damals in C++ über das 
Drucker-Handle auf die Eigenschaften eines installierten Druckers 
zugreifen konnte, wo dann neben vielen anderen Eigenschaften auch die 
Druckerschächte aufgezählt und für den Druck ausgewählt werden konnten. 
Das wirkt auch mich im Nachhinein so, als wäre die Ansteuerung des 
Druckerschachtes eher eine Aufgabe der druckenden Anwendung, die bei 
jeder zu Druckenden Seite den richtigen Schacht festlegt, und nicht die 
des auszudruckenden Dokuments.

Ich frage mich, wie sich dieses Problem überhaupt bei der Benutzung 
einer rein Server-Basierten Anwendung bzw. mit der Abgabe der Kontrolle 
durch das Übergeben des PDFs an den Browser lösen lässt?

Die Dokumente sollen nicht nur ausgedruckt werden, sondern auch auf dem 
Server gespeichert und der Dateipfad dann in der DB gespeichert werden, 
damit die Dokumente jederzeit 1:1 erneut angezeigt und ausgedruckt 
werden können.

Viele Grüße
Nachteule

von Robert S. (robert_s68)


Lesenswert?

Mit
1
$ lpoptions -l
2
PageSize/Media Size: Letter Legal Executive Statement FanFoldGermanLegal 3x5 4x6 5x7 5x8 *A4 A5 A6 B5 B6 Env3.5x5 Env4x6 Oficio 195x270mm 184x260mm 7.75x10.75 Postcard DoublePostcardRotated Env10 EnvMonarch EnvISOB5 EnvC5 EnvC6 EnvDL EnvChou3 EnvChou4 Custom.WIDTHxHEIGHT
3
Duplex/Two-Sided: *None DuplexNoTumble DuplexTumble
4
InputSlot/Paper Feed: *Auto Tray1 Tray2 Tray3 Tray4 ManualFeed
5
...

findet man unter InputSlot/Paper Feed die Namen der Papierschächte 
heraus, mit
1
$ lp media=A4 -o InputSlot=Tray2 /pfad/zur/datei.pdf

schickt man die pdf Datei zum Schacht 2. Stellt auch von PHP heraus kein 
Problem dar.

Zum Erzeugen von PDFs gibts (zu) viele Optionen, was PHP-spezifisches 
kenne ich nicht. Ich verwende z.B. recht gerne wkhtmltopdf und 
weasyprint, das nimmt HTML+CSS und spuckt PDF aus.

: Bearbeitet durch User
von test (Gast)


Lesenswert?

Nachteule schrieb:
> , als wäre die Ansteuerung des Druckerschachtes eher eine Aufgabe der
> druckenden Anwendung, die bei jeder zu Druckenden Seite den richtigen
> Schacht festlegt,

Nein, die Anwendung ruft den Einstellungsdialog des Druckertreiber auf 
(wenn der Nutzer die Druckeinstellungsschaltfläche in der Anwendung 
drückt). Die Anwendung hat eigentlich keine Ahnung was der Drucker alles 
kann (Die Anwendung kann aber diese Konfiguration (Die der Nutzer in 
diesen Einstellungsdialog vornimmt) sichern und wiederherstellen).
Hier kannst du dich reinlesen 
https://docs.microsoft.com/en-us/windows/desktop/printdocs/printing-and-print-spooler-functions


Nur so als Idee... Den Drucker mehrmals installieren. Dann in jeden 
Drucker den gewünschten Schacht als Default festlegen. Dann die Seite je 
nach Wunsch zum richtigen Drucker schicken.

Oder, den Drucker konfigurieren (halt mit dem Druckerdialog), dann die 
Konfiguration sichern. Dann die nächste Konfiguration sichern usw.
Dann vor dem Druck die passende Konfiguration wiederherstellen.

von Der kein Bock mehr A. (Gast)


Lesenswert?

Hi, interessantes Thema, hab evtl. ein ähnliches Problem.
Geht sogar um mehrere Drucker die aus verschiedenen Schächten bedient 
werden müssen.

Verstehe ich den Ansatz von User test so :

Ein Physikalischer Drucker mit 3 Slots installiere ich als drei einzelne 
logische Drucker:

LP1_Slot1
LP1_Slot2
LP1_Slot3

Dann kann ich jeweils die Einzeldokumente dort hin schicken.

Finde ich ne gute Idee.

Übrigens als Anregung für Nachteule, für eine gute PDF-Ausgabe, schau 
Dir mal Apache-FOP an mit XSLT

Gruß

von Nachteule (Gast)


Lesenswert?

Hallo zusammen,

vielen Dank für eure ausführlichen Antworten. Ich befürchte, dass wir 
zumindest teilweise über verschiedene Sachen reden. Es handelt sich in 
meinem Fall NICHT um eine Firmenumgebung, in der direkt am Server die 
Drucker angeschlossen sind. In meinem Fall gibt es lediglich eine 
WebAnwendung bei einem WebHoster, die vom Verein aus aus über Firefox 
genutzt wird. Die darüber erstellten PDF-Dokumente sollen über unseren 
Vereins-PC bzw. den daran angeschlossenen Drucker mit mehreren 
Papierfächern ausgedruckt werden. Deshalb auch mein anfänglicher Hinweis 
mit der Abgabe der Kontrolle an den Browser. Das hätte ich vielleicht 
ausführlicher schreiben sollen und dafür bitte ich um Entschuldigung. 
Ich fange aber auch erst gerade an mich so halbwegs daran zu erinnern, 
dass in diesem Zusammenhang unterschiedliche Umgebungen existieren und 
in welcher ich mich befinde. :)

Den Ansatz mit den verschiedenen Druckern halte ich ebenfalls für 
Sinnvoll, da man so unabhängig von den tatsächlich dahinter befindlichen 
Druckern und Einstellungs-Dialogen arbeiten kann. Aber irgendetwas muss 
ja auch bei verschiedenen virtuellen Druckern seitenbasiert eine 
automatische Unterscheidung vornehmen. Meine Frage zielte also darauf 
ab, wie man diesen Workflow abstrakt betrachtet am besten umsetzt:

Man könnte die seitenbezogenen Druckerschacht-Informationen ja z.B. im 
PDF in irgendwelchen Meta-Informationen speichern (z.B. JSON ?), oder 
aber in der Datenbank. Unabhängig davon wo man es speichert, kann man 
theoretisch entweder für jedes Dokument Seite für Seite den Schacht 
definieren, oder aber Dokumenten-Arten definieren, wo diese 
Informationen global hinterlegt und geändert werden können (sofern 
Aussagen darüber auch bei variabler Seiten-Anzahl möglich sind). In 
keinem Fall scheine ich jedoch um ein Hilfs-Programm auf dem Vereins-PC 
herum zu kommen, dass beim Ausdruck die Aufteilung der Seiten auf die 
Papierfächer bzw. virtuellen Drucker steuert. An der Stelle stellt sich 
auch die Frage, wie komfortabel die Lösung sein muss, wenn nicht ich am 
Vereins-PC sitze, sondern jemand der weniger IT-Affin ist? Für mich 
würde vermutlich ein selbst gebasteltes Phyton-Script reichen - andere 
hier kennen vielleicht nur den Windows Druck-Dialog, von daher wäre z.B. 
ein eigener virtueller Drucker denkbar, der dann die weitere Verteilung 
übernimmt. Aber das ist ja auch eine Frage des Aufwandes, da es "nur" 
für unseren Verein ist. Der Vorteil ist aber, dass ich das selbst in 
meiner Freizeit umsetze und mir kein Chef mit einer Deadline im Nacken 
sitzt. Ich wäre auch durchaus in der Lage, einen Linux-Server zu 
installieren und hier aufzubauen, wenn das alles deutlich vereinfacht. 
Die Lösung mit dem Webhoster hatte ich aber bewußt gewählt, weil ich 
auch nicht immer im Verein bin und der WebHoster sich 24/7 um den 
laufenden Betrieb kümmert.  Zudem bricht für uns auch keine Welt 
zusammen, wenn wir mal einen Tag lang nicht mit dem Programm arbeiten 
können. Genau wegen dieser mir vielleicht noch nicht bekannten 
Möglichkeiten, die ich dann weiter verfolgen würde, hatte ich meine 
Anfrage gestellt.

Besten Dank und viele Grüße
Nachteule

von Dirk K. (merciless)


Lesenswert?

Also wenn das eine klassische Client-Server-Umgebung ist
und das PHP auf dem Server die Drucker nicht kennt, hast
du keine Chance verschiedene Drucker automatisch auszuwählen.
Die Drucker-Ansteuerung obliegt dann einzig und allein dem
Browser bzw. dem PDF-Reader, wenn die PDFs heruntergeladen
und angeschaut werden.

Das Erzeugen der PDFs ist kein Hexenwerk. Wenn du da Hilfe
brauchst kann ich heute Abend mal nachschauen, was ich da
mal verwendet hatte.

merciless

: Bearbeitet durch User
von Nachteule (Gast)


Lesenswert?

Dirk K. schrieb:
> Das Erzeugen der PDFs ist kein Hexenwerk. Wenn du da Hilfe
> brauchst kann ich heute Abend mal nachschauen, was ich da
> mal verwendet hatte.

Vielen Dank, aber das habe ich zwischenzeitlich hinbekommen (mit 
DomPDF).

Viele Grüße
Nachteule

von georg (Gast)


Lesenswert?

Nachteule schrieb:
> In
> keinem Fall scheine ich jedoch um ein Hilfs-Programm auf dem Vereins-PC
> herum zu kommen, dass beim Ausdruck die Aufteilung der Seiten auf die
> Papierfächer bzw. virtuellen Drucker steuert

Das ist wohl so. Natürlich kann man beim Drucken den Schacht angeben, 
das habe ich schon unter MSDOS gelöst, um Rechnungen mit 3 Durchschlägen 
auf verschiedenes Papier zu drucken, aber man kann auch mehrere Drucker 
einrichten, wenn man sich die direkte Druckerprogrammierung nicht 
zutraut. Diese Drucker muss man dann aber auch seitenweise ansprechen.

Ich würde verschiedene "Modelle" vorsehen, z.B. Seite 1 aus Schacht 1 
und die Seiten 2 und 3 aus Schacht 2, und für jedes Modell ein 
serverseitiges Script oder Programm erstellen. Der Browser muss zur 
PDF-Datei das zu verwendende Script an den Server übermitteln. D.h. 
dieses Script oder Programm druckt dann die PDF-Datei aus.

Die Alternative wäre, die Auftrennung in Einzelseiten schon auf dem 
Client vorzunehmen, aber das ist annähnernd die gleiche 
Programmierarbeit, man muss das auf jedem Client installieren, und wenn 
dann noch IOS oder Androidgeräte verwendet werden artet das in Arbeit 
aus. Das Konzept der serverseitigen Programmierung ist da überlegen.

Georg

von Weingut P. (weinbauer)


Lesenswert?

Packt man eben Briefkopf und Footer jeweils mit ins PDF wo es gebraucht 
wird und drückt das ganze aus einem Schacht

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.