Re: Print Renderer
"Szeak (Register Man)" <[email protected]>
| Newsgroups | gmane.text.xml.fop.user |
|---|---|
| Message-ID | <[email protected]> |
Hi,
What i use for this is the PipedInputStream and PipedOutputStream.
By Szeak
2017-12-14 09:18 keltezéssel, Normen Ruhrus írta:
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);
}
}