Zitat Zitat von watzl
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 (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:
PHP-Code:
 // 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.RequestingUserPassword;
 
 
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 printerUrlthrows 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(0printerUrl.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 pdfFileString printerURLthrows 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(streamDocFlavor.INPUT_STREAM.PDFdas);
                try {
                     
// Druckjob absetzen
                     
job.print(docattributes);
                     
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