Hello everyone,
for some older printers we use the FOP direct printing via the PageableRenderer. Usually we use PostScript printing and there we do not stream directly to the printer but make the transformation via an ByteArrayOutputStream to a byte array. This is possible because the created printouts are quite small so there is no issue with large data and additionally it gets us better traceability for problems cause we can better differntiate between FOP issues and Windows Printer issues. The question is if there is a way to direct print to a ByteArrayOutputstream also, or if there is some similar way of doing this. Below i have put in our Print Postscript Function that wroks the way we want to handle direct printing, too. We use FOP2.0 on Tomcat 8.0 on Windows Server 2012 R2 with Java 8. Thanks a lot for any help; it is greatly appreciated! Normen public void printPS(String xml, String xslt, String printer) throws Exception { try { C_Tools.log("Entering printPS().",LogLevel.DEBUG); // configure fopFactory as desired FopFactory fopFactory = getInstance().getFopFactory(); C_Tools.log("FOP Factory set.",LogLevel.DEBUG); ByteArrayOutputStream out = new ByteArrayOutputStream(); C_Tools.log("Buffer set.",LogLevel.DEBUG); FOUserAgent userAgent = fopFactory.newFOUserAgent(); userAgent.getEventBroadcaster().addEventListener(new FOPEventListener(versionFOP)); C_Tools.log("User Agent and EventListener set.",LogLevel.DEBUG); // Construct FOP with desired output format Fop fop = fopFactory.newFop(MimeConstants.MIME_POSTSCRIPT, userAgent, out); C_Tools.log("FOP Object created.",LogLevel.DEBUG); TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newTransformer(new StreamSource(new StringReader(xslt))); C_Tools.log("XSLT (" + xslt.length() + " bytes) set up.",LogLevel.DEBUG); try { transformer.setErrorListener(getErrorListener()); C_Tools.log("Transformer Error Listener set.",LogLevel.DEBUG); } catch (Exception ex) { C_Tools.log("C_Render_FOP_2_0.printPS().setErrorListener():" + ex.getMessage(),LogLevel.ERROR); StackTraceElement[] stack = ex.getStackTrace(); for (int y=0 ; y < stack.length; y++) { C_Tools.log("C_Render_FOP_2_0.printPS().setErrorListener()." + renderer.toString() + "["+(y+1)+"/"+stack.length+"]:" + stack[y].toString(), LogLevel.ERROR); } } // Setup input stream Source src = new StreamSource(new StringReader(xml)); C_Tools.log("XML (" + xml.length() + " bytes) set up.",LogLevel.DEBUG); // Resulting SAX events (the generated FO) must be piped through to FOP Result result = new SAXResult(fop.getDefaultHandler()); C_Tools.log("SAX Result Object created.",LogLevel.DEBUG); // Start XSLT transformation and FOP processing transformer.transform(src, result); C_Tools.log("Transformation completed.",LogLevel.DEBUG); out.flush(); //Set up DocPrintJob instance DocPrintJob printJob = C_Renderer.createDocPrintJob(printer); Doc doc = new SimpleDoc(out.toByteArray(), DocFlavor.BYTE_ARRAY.AUTOSENSE, null); C_Tools.log("Print Job and Document set.",LogLevel.DEBUG); printJob.print(doc, null); C_Tools.log("Document printed.",LogLevel.DEBUG); out.close(); } catch(Throwable e) { C_Tools.log("C_Render_FOP_2_0.printPS(" + e.getClass().getName() + "):" + e.getMessage(), LogLevel.ERROR); StackTraceElement[] stack = e.getStackTrace(); for (int y=0 ; y<stack.length; y++) { C_Tools.log("C_Render_FOP_2_0.printPS()." + renderer.toString() + "["+(y+1)+"/"+stack.length+"]:" + stack[y].toString(), LogLevel.ERROR); } throw new Exception(e); } }