PDA

View Full Version : Fachansteuerung auf AS400 mit Java-IBMPrintServices



Seiten : [1] 2

tpriebs
25-10-11, 12:44
Hallo die Runde,

ich habe ein ähnlich gelagertes Problem wieviele andere. Ich will auf ausgewählten Fächern mit einem Java-Programm auf der AS400 drucken.

Ich habe in der WSCST das zweite Druckerfach mit der entsprechenden Escape Sequenz eingerichtet.
Mein Problem ist es funktioniert bei mir nur bei der Variante direkt auf die Queue mit einem SCSWriter zuzugreifen.



PrintParameterList parms = new PrintParameterList();
parms.setParameter(PrintObject.ATTR_OUTPUT_QUEUE, queue.getPath());

String s=queue.getPath();
SpooledFileOutputStream out = new SpooledFileOutputStream(system_,parms, null, null);

SCS3812Writer scsWtr = new SCS3812Writer( out, 37, system_);


// Write the contents of the spool file.
scsWtr.setLeftMargin(1.0);
scsWtr.absoluteVerticalPosition(6);
scsWtr.setFont(scsWtr.FONT_COURIER_BOLD_5);
scsWtr.write(" Java Printing");
scsWtr.newLine();
scsWtr.newLine();
scsWtr.setCPI(10);
scsWtr.write("This document was created using the IBM Toolbox for Java.");
scsWtr.newLine();
scsWtr.write("The rest of this document shows some of the things that");
scsWtr.newLine();
scsWtr.write("can be done with the SCS3812Writer class.");
scsWtr.newLine();
scsWtr.newLine();
scsWtr.setUnderline(true); scsWtr.write("Setting fonts:"); scsWtr.setUnderline(false);
scsWtr.newLine();
scsWtr.setFont(scsWtr.FONT_COURIER_10); scsWtr.write("Courier font ");
scsWtr.setFont(scsWtr.FONT_COURIER_BOLD_10); scsWtr.write(" Courier bold font ");
scsWtr.setFont(scsWtr.FONT_COURIER_ITALIC_10); scsWtr.write(" Courier italic font ");
scsWtr.newLine();
scsWtr.setBold(true); scsWtr.write("Courier bold italic font ");
scsWtr.setBold(false);
scsWtr.setCPI(10);
scsWtr.newLine();
scsWtr.newLine();
scsWtr.setUnderline(true); scsWtr.write("Lines per inch:"); scsWtr.setUnderline(false);
scsWtr.newLine();
scsWtr.write("The following lines should print at 8 lines per inch.");
scsWtr.newLine();
scsWtr.newLine();
scsWtr.setLPI(8);
scsWtr.write("Line one"); scsWtr.newLine();
scsWtr.write("Line two"); scsWtr.newLine();
scsWtr.write("Line three"); scsWtr.newLine();
scsWtr.write("Line four"); scsWtr.newLine();
scsWtr.write("Line five"); scsWtr.newLine();
scsWtr.write("Line six"); scsWtr.newLine();
scsWtr.write("Line seven"); scsWtr.newLine();
scsWtr.write("Line eight"); scsWtr.newLine();
scsWtr.endPage();
scsWtr.setLPI(6);
scsWtr.setSourceDrawer(1);
scsWtr.setTextOrientation(0);
scsWtr.absoluteVerticalPosition(6);
scsWtr.write("This page should print in portrait orientation from drawer 1.");
scsWtr.endPage();
scsWtr.setSourceDrawer(2);
scsWtr.setTextOrientation(0);
scsWtr.absoluteVerticalPosition(6);
scsWtr.write("This page should print in landscape orientation from drawer 2.");
scsWtr.endPage();
scsWtr.close();

System.out.println("Sample spool file created.");
// clean up after we are done with the list
outPutQueueList.close();

System.exit(0);



Er druckt auch auf Fach 2 was auf Fach 2 ausgegeben werden soll. Mein Problem bei dieser Variante ist, dass ich keine komplizierteren Grafiken auf diesen Weg ausdrucken kann.

Deshalb bevorzuge ich die JavaPrintService aus der ibmjps.jar.

Der Aufruf sieht wie folgt aus:



if(seriesPrintService.getName().equals("C2126MFP")){

DocFlavor psFlavor = DocFlavor.SERVICE_FORMATTED.PRINTABLE;

DocAttributeSet attributeSet = new HashDocAttributeSet();
attributeSet.add(MediaTray.TOP);

SimpleDoc pdf = new SimpleDoc(pages, psFlavor, attributeSet);

PrintRequestAttributeSet pra = new HashPrintRequestAttributeSet();
pra.add(new SourceDrawer(2));
//
// Object categories=services[i].getSupportedAttributeCategories();
// Object sources =
// services[i].getSupportedAttributeValues(SourceDrawer.class, null,null);
//
// Object orientation =
// services[i].getSupportedAttributeValues(OrientationRequested. class, null,null);
//
// Object printerFiles =
// services[i].getSupportedAttributeValues(PrinterFileAttribute. class, null,null);
//
// Object spooledFile =
// services[i].getSupportedAttributeValues(SaveSpooledFile.class , null,null);


DocPrintJob psJob = services[i].createPrintJob();

// PrintService printService=services[i];

psJob.print(pdf, pra);

}



Mein Problem ist das obwohl ich sourceDrawer 2 ausgewählt habe immer nur auf Fach 1 gedruckt wird. Durch Aufruf der Methode
Object sources = services[i].getSupportedAttributeValues(SourceDrawer.class, null,null);

habe ich herausgefunden das nur der Wert 1 unterstützt wird.

Hat jemand eine Idee wodran das liegen könnte und wie ich mit Hilfe der JavaPrintServices die Fächer ansteuern kann?

Viele Grüße,
Tobias

Fuerchau
25-10-11, 12:50
Nun ja, wenn der JavaService nicht mehr als ein Fach unterstützt wirst du daran auch nichts ändern können.

Allerdings verstehe ich nicht, warum du auf Fach2 keine Grafiken drucken kannst ?

tpriebs
25-10-11, 12:57
Danke erstmal für die schnelle Antwort.
Ich kann auch auf Fach 1 mit der Methode keine Grafiken ausdrucken. Das liegt nicht am Drucker sondern an der der Klasse SCS3812Writer die kann halt nur Text schreiben. Ich will aber AWT und ähnliches ausdrucken und habe bisher keine Methode gefunde die dies kann in dem sie den SpooledFileOutputStream benutzt.

Sprich die diese Variante kann einfachen Text ausdrucken aber keine Grafiken bzw.
ich weiß nicht wie dies möglich ist.

Fuerchau
25-10-11, 14:21
Wenn du alles in Java machst, kannst du doch am Besten direkt eine PDF-Ausgabe erstellen, da gibts Lib's für.

tpriebs
25-10-11, 14:35
Mir ist bisher noch keine begegnet. Gibt es da irgendeine Empfehlung? Die Lib muss auf jeden Fall auf der AS400 ausführbar sein und es muss eine Möglichkeit geben die Lib in irgend einer Form so einzubinden, dass ich Fächer ansteuern kann.

tpriebs
25-10-11, 19:12
Interessant ist auch noch, dass wenn ich im WSCST das Druckerfach 1 auch auf die Escape Sequenz von Fach 2 setze trotzdem auf Fach 1 gedruckt wird. Also sprich bei der Variante mit den IBMPrintServices.
So als ob ihn das WSCST File überhaupt nicht interessieren würde.

Bei der ersten Variante wird der Drucker als Queue angesprochen und bei der zweiten als Device.

Fuerchau
25-10-11, 19:42
Wenn ich mir deinen Code so ansehe, verwechselst du da 2 Funktionen:

setSourceDrawer <= Papiereingabefach

setDestinationDrawer <= Papierausgabefach

tpriebs
25-10-11, 19:55
In beiden Fällen setzte ich doch den SourceDrawer sprich das Eingabefach.
Es geht auf jeden Fall um das Fach aus dem das Papier gezogen werden soll. Sprich der SourceDrawer.

Fuerchau
26-10-11, 07:32
Vielleicht hilft dir das ja weiter:
IBM Systems Magazine - Using the Java Print Services APIs on the iSeries System (http://www.ibmsystemsmag.com/ibmi/administrator/printing/Using-the-Java-Print-Services-APIs-on-the-iSeries-/)

tpriebs
26-10-11, 07:57
Danke für den Tipp, aber der Artikel war für mich der erste gute Orientierungspunkt für die IBM Java Print Services. Sprich er war hilfreich, aber führt mich im Moment nicht weiter.