Anmelden

View Full Version : PDF drucken



Seiten : 1 2 3 [4] 5 6

watzl
02-05-05, 07:23
Ich wäre über mehr technische Details über die "pdf2cups" auf der AS/400 stark interessiert. Bitte mit mir Kontakt aufnehmen!

RobertPic
03-05-05, 03:11
Bitte mit mir Kontakt aufnehmen!
E-Mail ist nicht öffentlich zugänglich, daher poste ich gleich hier:

Voraussetzungen:


Java ab Version 1.4, Ausdruck mittels javax.print.*
Jipsi (http://sourceforge.net/projects/jipsi/) (Achtung! aktuelle Version nur in CVS, (1))
Java http-Zugriffsklassen (commons..) von Apache (in Download-Zip enthalten)
dns von CupsServer muss in AS/400 eingetragen sein (CFGTCP / 10) ... IP-Adresse geht nicht, da Cups die Rückantwortadresse wieder mit dns gibt
Cups mit installierten Filter für PDF (mir ist unter Linux noch keine Installtion ohne PDF-Filter untergekommen)
In dem Downloadfile sind auch verschiedene Bespieleprogramme enthalten. Aber all diese Beispielprogramme verlangen im Dialog/Texteingabe eine Druckerauswahl. Hier ein kleines Demo, für den Commandline-Einsatz:


// pdf2cups.java
//
import javax.print.*;
import javax.print.attribute.*;
import javax.print.attribute.standard.DocumentName;
import javax.print.attribute.standard.JobName;
import javax.print.attribute.standard.Copies;
import javax.print.attribute.standard.RequestingUserName;

import de.lohndirekt.print.IppPrintServiceLookup;
import de.lohndirekt.print.attribute.auth.RequestingUserP assword;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException;
import java.util.Locale;

public class pdf2cups {



public PrintService getPrinterByUrl(String printerUrl) throws Exception {

PrintService service = null;

try {
if (printerUrl.lastIndexOf("/")==-1) {
System.out.println("keine vollständige Cups-Url gefunden");
return null;
}
// Server und Printename trennen
String printerName = printerUrl.substring(printerUrl . lastIndexOf( "/" )+1);
String serverName = printerUrl.substring(0, printerUrl.lastIndexOf ("/"));
System.out.println("Printing on Server: " + serverName + " Queue "+ printerName);

PrintServiceLookup lookup =
new IppPrintServiceLookup(new java.net.URI(serverName),"","");
PrintService[] services = lookup.getPrintServices();

if (services.length > 0) {
service = null;
// gewünschten nach Namen auswählen
for(int i=0;i<services.length;i++) {
if(services[i].getName().equalsIgnoreCase(printerName)) {
service = services[i];
break;
}
}

}
} catch(Exception e) {
System.err.println("Service nicht gefunden " + e);
}
return service;
}
public boolean run(String pdfFile, String printerURL) throws Exception {

boolean printOK = false;
PrintService service = getPrinterByUrl(printerURL);
if(service!=null) {
// Attribute für Druckjob festlegen
PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
JobName docname = new JobName("AS/400 Spoolumsetzung", Locale.getDefault());
RequestingUserName usernameAttr = new RequestingUserName(
"AS400", Locale.GERMANY);
attributes.add(usernameAttr);
attributes.add(docname);
// Kopienanzahl, Schacht... hier hinein

DocPrintJob job = service.createPrintJob();
FileInputStream stream = new FileInputStream(pdfFile);
DocAttributeSet das = new HashDocAttributeSet();
Doc doc = new SimpleDoc(stream, DocFlavor.INPUT_STREAM.PDF, das);
try {
// Druckjob absetzen
job.print(doc, attributes);
System.out.println("printing successfull...");
printOK = true;
} catch (PrintException e) {
e.printStackTrace();
}
}
return printOK;
}

public static void main(String args[]) throws Exception {
if(args.length < 2)
{
System.out.println("Parameter: PDF-File cups-Adresse");
}
else
{
new pdf2cups().run(args[0],args[1]);
}
}
}


Der Aufruf (QSH)könnte dann so aussehen (2):
java -cp /etc/PDF400/jipsi.jar:/etc/PDF400/ext/commons-httpclient-2.0.1.jar:/etc/PDF400/ext/commons-logging.jar pdf2cups /etc/PDF400/HelloWorld.PDF http://dnx:631/printers/EDV_DELL

1. Parameter: Dateiname inkl. Pfad: /etc/PDF400/HelloWorld.PDF
2. Parameter volle Cups-Url (/printers/ kann auch wegbleiben), der letzte Teil wird als Druckername verwendet

also Server: http://dnx:631/printers
Drucker-Queue: EDV_DELL

Zur Performance ist zu sagen, dass der Start der JVM die meiste Zeit beansprucht. Ich verwende eine etwas andere Version (wg. Attributen) nur im Serverbetrieb aus anderen Javaklassen - da gibt es eigentlich keine Wartezeiten.

Wir verwenden den Cupsdruck zur Formularumformatierung. Der Drucker wird mit dem Formulartyp Firmenpapier gestartet. Alle anderen Formulare werden vom Java-Serverjob übernommen, als PDF mit Hilfslinien oder Hintergrundformular umformatiert und via Cups (am gleichen Drucker, Fach2, weißes Papier) ausgegeben. So können wir stressfrei die alten IBM-Drucker und Formulare nach und nach ausmustern, ohne irgendwelche bedingten Overrides in unsere Programme eingebaut zu haben.

Robert P.



(1) leider konnte ich die gepatchte Version nicht uploaden (mit 600KB zu groß)

(2) absichtlich alle benötigten jars angeführt, zumindest die commons... wird man irgendwo im /QIBM/ProdData/Java.. (ext oder Lib) unterbringen

watzl
03-05-05, 06:12
Erst mal Danke für die schnelle Reaktion!
Mit der ausführlichen Beschreibung wird mir schon einiges klarer. Für den Einsatz dieser Lösung ist aber zwingend ein LINUX CUPS Server notwendig. Ich habe gehofft das man auch mit einer reinen AS/400 Lösung das Problem lösen könnte! Ich habe zwar schon verschiedene Versuche mit PCL und PS gefahren, konnte aber nie einen 100%igen Erfolgt erhalten.
Nutzen Sie einen extra Linux Server oder betreiben Sie Linux mittels LPAR auf der AS/400?

Watzl

RobertPic
04-05-05, 15:33
.... Ich habe zwar schon verschiedene Versuche mit PCL und PS gefahren, konnte aber nie einen 100%igen Erfolgt erhalten.
Also Postscriptdateien (.ps Level 2) konnte ich auch direkt von der AS/400 drucken - der Drucker muss aber auch Postscript verstehen. Außerdem muss das File in ein *USERACII Spoolfile umgewandelt werden.



Nutzen Sie einen extra Linux Server oder betreiben Sie Linux mittels LPAR auf der AS/400?
Bei uns stehen genug Linux-Server herum, auf welchen auch alle Drucker im Cups definiert sind.

Von daher war die Cups-Lösung für uns naheliegend.

Es gibt sicher noch einige Lösungsansätze (z.B. pdf2ps auf Java-Basis enthalten in der kostenpflichtigen Java-Lib SmartJprint) aber meistens hat man dann ein Postscriptfile, welches die dazugehörigen Drucker benötigt.

Robert P.

xhonk
15-12-05, 13:37
Hallo KM,

es wäre nett, wenn ich das JavaScript auch bekommen könnte.

Hier meine E-Mail Adresse:
Joerg.Mueller@heidelberg.com



Vielen Dank im Voraus

xhonk

michelb
19-07-06, 08:23
Hallo KM,

kannst du mir auch das JAVA-Script mailen und wie man es aufruft.
michelberger@schwaebische-bank.de

geist2000
28-07-06, 14:51
Hallo KM,

ich wäre Dir auch sehr dankbar, wenn Du mir das Script senden könntest - hier die Adresse: geistt@online.de

Vielen Dank :-)

mquadrat
25-09-06, 11:23
Hallo KM,

hab dasselbe Problem auch.
Kannst Du mir auch das Javascript bitte zukommen lassen ?
kulke@beak.de

Meine Kenntnisse von JavaScript sind leider etwas begrenzt, könntest du mir daher noch 1-2 Anweisungen geben wie man es verwendet?

Danke im Voraus!

mquadrat

kuempi von stein
25-09-06, 12:01
...Meine Kenntnisse von JavaScript sind leider etwas begrenzt, könntest du mir daher noch 1-2 Anweisungen geben wie man es verwendet?
...

Hello,

ich stecke zwar in dieser Geschichte nicht mit drin, aber JavaScript wird m.E. im Normalfall in HTML eingebunden.
Siehe dazu:
http://de.wikipedia.org/wiki/JavaScript
bzw.
http://de.selfhtml.org/javascript/intro.htm#javascriptbereiche

Ich vermute mal, dass das script eben sowas ähnliches wie


<input type="button" value="Info" onClick="window.print('{PDFPFAD}','info')">


beinhaltet, nur eben nicht interaktiv sondern die Daten gleich zum Drucker schickt.....

Evtl. hilft Dir ja mein Gestammel...

k.

mquadrat
26-09-06, 06:18
Na mir geht es vor allen Dingen darum, dass ich mit EINEM Kommandozeilen befehl eine PDF ausdrucken kann, und das druckende Programm sich danach wieder schließt. Mit dem Adobe Reader war das ja nicht möglich. Wie muss ich das dann mit diesem JS-Skript realisieren?