Printing PDF files in PDQ Normaal gesproken zal de opdracht lpr(of pdq) PCL.pdf een fout melding geven in de trand van 'onbekent file type' . Het file type wordt bepaald met file -b . De reden is dat de driver voor je printer het file type pdf niet herkend . Deze herkenning wordt gedaan met de routine 'language_driver ' . Zet deze routine voor 'language_driver text' dit daar soms een pdf bestand ook herkend wordt als zijnde een text bestand . Feitelijk is dit vaak ook juist . language_driver pdf {} is voldoende omdat GhostScript deze wel zal bewerken . Naja het wil nog wel wat problemen geven om het goed te krijgen daar heel Puppy er vanuit gaat dat het papierformat 'Letter' is en geen 'A4' . (Gelukkig is letter kleiner dan a4 .) Ook wil een PDF bestand nog wel eens een volstrekt afwijken formaat geven . Om de formaten te forceren naar A4 moet GS de sleutel -dPDFFitPage meekrijgen . (b.v. /usr/shared/ps-pdf/Acrobat.pdf is zo'n bestand met een pagesize 11" x 17" .) Je kunt ook opgeven welke pagina's je wilt printen m.b.v. -dFirstPage= -dLastPage= . Nu maakt PQD m.b.v. GS een bestand aan xxx.filtered dat de code voor je printer bevat . Bestanden welke geroteerd(landscape) zijn blijken moeilijk te zijn weertegeven in het goede formaat . Als je ze met GhostView exporteerd en draait zijn de letter niet meer leesbaar . ------------------------------------------------------------------------------------------ Printing RAW data Vanuit een netwerk is het soms handig om direct de printer aantesturen met de gegevens welke worden ontvangen , in de hoop dat de printer die ook begrijpt . Voor een PCL printer betekend dit een 'language_driver text' welke als volgt luid : language_driver pcl { convert_exec = { ln -s $INPUT $OUTPUT; touch $OUTPUT.ok; # Tell filter_exec not to invoke gs } } Om fouten in pagesize te voorkomen , sommige printers kunnen niet schakelen tussen letter en a4 is het nuttig om in de 'else' tak van filter_exec dit toetevoegen : if test -z "`grep -m 1 'l26A' $INPUT`"; then sed /l2A/s//l26A/ $INPUT > $OUTPUT echo "WARNING : PCL letter is converted to a4 ." else ln -s $INPUT $OUTPUT; fi Hiermee wordt , als de pagesize staat op letter , de pagesize gezet op a4 . De vraag is of 'l12A' wel echt uniek is , gezien eventuele bineare informatie ? . ------------------------------------------------------------------------------------------ Printing Text bestanden in PDQ Normaal gesproken zal de opdracht lpr(of pdq) text.txt een fout melding geven in de trand van 'onbekent file type' . Het file type wordt bepaald met file -b . De reden is dat de driver voor je printer het file type text niet herkend . Deze herkenning wordt gedaan met de routine 'language_driver ' . Zet de routine 'language_driver text' als laaste voor filter_exec{} en vul de te ondernemen aktie in . language_driver text { convert_exec = { /usr/sbin/nenscript -B -T$paper -p$OUTPUT $INPUT } } Nenscript geeft een ps bestand in \letter mode als je GS default pagesize op a4 zet wordt dit vanzelf omgezet naar a4 . Je zou een aantal optie kunnen toevoegen zoals o.a. twee pagina's op een bladpapier (-2rB). (zie : http://www.bigbiz.com/cgi-bin/manpage?1+nenscript) ------------------------------------------------------------------------------------------------- Printing PS bestanden in PDQ De moeilijkheid is dat Puppy alles in letter formaat heeft staan , logisch het is engelstalig . Je kunt de pagina grote definieren zoals in PDQ wordt gedaan , dit geeft -sPaperSize=$paper aan GS . Maar dit wil niet zeggen dat alle alle ps bestanden ook worden geschaald naar a4 . Dit blijkt afhangkelijk te zijn van hoe de pagesize is gedefinieerd in het ps bestand . Als setpagesize gebruikt is in een ps bestand dan overruled dit de PaperSize . De definietie's -dDEVICEWIDTHPOINTS=X en -dDEVICEHEIGHTPOINTS=Y overschrijven de setpagesize definitie . (-gXxY moet het ook doen maar geeft gelijktijdig een -dFIXEDMEDIA) (X,Y zijn de pagina afmetingen in inches gedeeld door 72 . a4(210,297cm)=8.3",11.7"=>595,842 . ) Een andere en betere methode is om in gs_init.ps het kommentaar teken voor de regel : %/DEFAULTPAPERSIZE (a4) def Dit bestand staat in /usr/shared/ghostscript/8.51/lib De parameter -dFIXEDMEDIA zorgt er voor dat pagina's die tegroot zijn gehakt worden . Het geeft mij de indruk dat deze parameter nog meer definities aangaande pagesize overschrijft . -------------------------------------------------------------------------------------------------- Printen met Abiword (zie : /usr/bin/lprhell) Abiword herkent als extensie .rtf .doc .txt en .awb . Maar niet altyd klopt de gegeven extensie ook bij het bestand . Daarom zou eerst uit wat het bestand echt is . M.b.v. file -b krijg je een beschrijfing van wat voor soort bestand het is . b.v file -b klad -> Microsoft Office Document . Het probleem nu is dat alles .xls .ppt en .doc allemaal het zelfde heten . Daar Abiword naar de extensie kijkt . Moet je nu zelf de extensie overschrijven : abiword --print=klad.ps --import-extension=.doc klad Is de extensie wel correct dan mag je het rustig ook nog overschrijven : abiword --print=klad.ps --import-extension=.doc sky002.doc De uitvoer is PostScript bestand . Als het fout gaat zegt Abiwords iets terug : AbiWord: Error importing file. [userj11.htm] Could not print Aborted Probleem in PQD is dat je de extentie van het oorsprongkelijke bestand kwijt bent . Die dingen heten nu spontaan : jobnummer.raw(invoer) jobnummer.configure , jobnummer.filtered(printer) . -------------------------------------------------------------------------------------- Opmerkingen aangaande mijn printers . Voor de brother HL5040 heb ik om problemen te voorkomen aan GS de volgende parameters : DEVICESIZE="-dDEVICEWIDTHPOINTS=595 -dDEVICEHEIGHTPOINTS=842 -dFIXEDMEDIA " Want de parameter -sPaperSize=a4 blijkt niet altijd te worden overgenomen als het bestand zelf een pagesize heeft gedefinieerd . Het hangt van de pagesize definitie af of het opgeven van -dDEVICEWIDTHPOINTS wel afdoende is . De parameter -dFIXEDMEDIA zegt dat het een pagina forceerd aftebeelden in het opgegeven pagesize en eventueel wordt het afgehakt . Er wordt dus niet verkleind of vergroot . Dat is wel jammer als de pagina groter is als a4. Dit blijkt nodig te zijn om tevoorkomen dat de printer vast loopt . Dit gezien het afbeelden van een PDF bestand op de PSC1200 welke in landscape blijkt te staan doch niet geroteerd wordt . In /usr/shared/ghostscript/8.51/lib staat een bestand gs_init.ps hierin kun je de default pagesize ook op a4 zetten , het lijkt er op dat alle \letter nu geschaald worden naar \a4 . . Ook is het onduidelijk als pagina's in landscape staan waarom ze dan in portrait worden geprint . ----------------------------------------------------------------------------------------------- Printmanager PDQ . Het staat voor PrintNoQue wat zoveel blijkt te zeggen dat het geen spooler gebruikt . Eigenlijk dus geschikt is voor een kleingebruiker . Indien het meerdere jobs krijgt worden deze in een rijgeplaats en afgewerkt . Indere job krijgt een nummer dit nummer wordt gebruikt voor alle tussen resultaten . De job staan in /root/.printjobs . Een printer beschrijving bestaat uit vier delen : a) de benodige toeters en bellen zoals kleurdefinitie , papierkwaliteit e.d. b) welke soort bestanden het kan lezen eventueel moet voorbereiden tot een postscript formaat . c) de feitelijke omzetting van postscript naar het echter printer besturings formaat . d) hoe het gemaakte printer besturings formaat te versturen en naar wie (interface). De gegeven toeter en bellen a) worden gebruikt in b) en c) en/of d) Deze eerste drie heten de devicedriver (in /etc/pdq/drivers/ghostscript) . Het onder a) bestaat uit een serie 'option' en 'arguments' . Onder b) staan de 'language_driver' voor de verschillende printtalen zoals ps of pdf of text . Onder c) staat het 'filter_exec' wat voorzien wordt van de nodige printer instellingen een ps bestand converteerd naar een printerbestand . Dit wordt gedaan m.b.v. GhostScript(gs) . Bewerking b) : Pqd begint met het aangeboden bestand te copieren naar .raw . Dit bestand wordt door een van de 'language_driver' (eventueel) bewerkt naar .configure . Als geen passende 'language_driver' gevonden is dan houd PDQ er meeop onder vermelding van 'snap niet wat je wilt' . Om te vinden welke printertaal gebruikt is doet PQD een beroep op file -b .raw . Dit geeft dan een string terug met iets als pdf , postscript , Microsoft office , text of data . Dat laaste ingeval er geen passende uitdrukking bekent is . De naam die je achter 'language_driver' moet zetten moet minimaal een deel uit de gevonden text zijn . B.v. language_driver PDF {} #doe niets of language_driver text { convert_exec = {/usr/sbin/nenscript -$TEXT_2 -T$paper -p$OUTPUT $INPUT} } Hierin zijn $INPUT de inputfile n.l. .raw $OUTPUT wordt .confidure . De andere $TEXT_2 en $paper komen uit het toeters en bellen gedeelte a) . Bewerking c): Nu wordt $INPUT aangeboden aan gs welke een $OUTPUT maakt welke .filtered heet . V.B : filter_exec { if ! test -e $INPUT.ok; then gs -q -dBATCH -dSAFER -dNOPAUSE -dDuplex=false -dTumble=false \ -sDEVICE=ijs -sIjsServer=hpijs -sIjsParams="$OPTION_1 $OPTION_2" \ -sDeviceManufacturer=HEWLETT-PACKARD -sDeviceModel="psc 1200"\ -dIjsUseOutputFD -sOutputFile=$OUTPUT \ -dDEVICEWIDTHPOINTS=595 -dDEVICEHEIGHTPOINTS=842 -sPaperSize=$paper \ -dFIXEDMEDIA -dPDFFitPage $OPTION_3 $INPUT if ! test -e $OUTPUT; then echo "ABORTED: Ghostscript had no output." >> $STATUS exit 1 fi else ln -s $INPUT $OUTPUT; fi } Hierin is voor deze printer OPTION_1 printqualiteit OPTION_2 papierqualiteit OPTION_3 kleur . In het bestand printrc (in /etc/pdq) wordt gedefinieerd met welke interface de printerdriver praat . In de interface beschrijving wordt hoofdzakelijk gezegt (io-port): send_exec { cat $INPUT > $PORT } Waar $PORT iets bevat als /dev/lp0 of /dev/usb/lp0 of zoiets . Een andere interface kan zijn om via Samba naar een shared printer te schrijven : send_exec { sambaclient $WHICHPRINTER -c "print "<$INPUT } Hierin heeft $WHICHPRINTER een analoge betekenis als $PORT b.v. //mypup/hpcolor . Enige Opmerkingen : PDQ gebruikt honds veel schijf ruimte al is het maar tijdelijk . Stel je heb een pdf bestand van 1.8Mb deze wordt gekopiert naar <>.raw . Van <>.raw wordt een <>.filtered gemaakt van (schrikt niet ) 216Mb ! MAAR PDQ gooit deze bestanden niet weg ! Je moet het explicit zelf doen . Als je via Samba printers shared is het goed te weten wat de printer wil hebben . Windows(98) gebruikt een raw-code , uit voorgaande v.b. , dus de 200Mb aan printer-code . Als je shared naar Linux zou je gebruikt kunnen maken van de printbestand en die oversturen waarbij de ontvanger dan maar voor de benodigde conversie moet zorgen , nadeel is dat de server tijd gaat kosten . Ook als je raw code stuurt naar PDQ heb je tijdelijk 2 keer zoveel schijfruimte nodig . Dit daar Samba het op een temp zet en PDQ het kopieerd , na kopieren gooit Samba wel de temp leeg . Tenminste als je hebt gezegd : print command = lpr %P %s;rm %s in samba.config . Ik vraag me of of CUPS dit beter heeft geregeld ?