使用JDOM处理XML数据之PDF篇(一)
处理XML数据的三种方式我们已经都介绍过了,
(直接读取http://www.csdn.net/Develop/read_article.asp?id=20720
和使用XSLT http://www.csdn.net/Develop/read_article.asp?id=20733)现在来看一下第三种方式即转化成二进制格式(一般为PDF)的操作。这个操作要借助http://xml.apache.org/ 提供的包fop来完成。其实这个是我整理的,不是自己写的:)它的代码如下:
package XML;
import java.io.*;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.apache.fop.apps.Driver;
import org.apache.fop.apps.Version;
import javax.xml.transform.*;
import javax.xml.transform.stream.*;
/**
* Class to convert an XML document to PDF via
* XSLT and XSL formatting objects.
*/
public class PDFWriter {
protected Transformer transformer = null;
public PDFWriter () {};
public PDFWriter(StreamSource source) throws TransformerConfigurationException {
// try {
TransformerFactory factory = TransformerFactory.newInstance();
transformer = factory.newTransformer(source);
/* } catch (TransformerConfigurationException tce) {
throw new IllegalStateException("Stylesheet compilation problem: " + tce.getMessage());
} catch (TransformerFactoryConfigurationException tfce) {
throw new IllegalStateException("JAXP configuration problem: " + tce.getMessage());
}
*/
}
public PDFWriter(String xslFilePath)
throws TransformerConfigurationException, FileNotFoundException {
this( new StreamSource(new FileInputStream(xslFilePath)) );
}
/** Invoke the ASF FOP engine to create the PDF */
protected byte[] invokeFOP(InputSource foSource) throws Exception {
ByteArrayOutputStream out = new ByteArrayOutputStream();
Driver driver = new Driver(foSource, out);
driver.run();
return out.toByteArray();
}
/** Create a PDF from an XML file, using the stylesheet passed to the constructor. */
public byte[] generatePDF(String xmlFilePath) throws Exception {
StreamSource xmlSource = new StreamSource( new FileInputStream(xmlFilePath) );
return generatePDF(xmlSource);
}
/** Does the interesting stuff */
public byte[] generatePDF(StreamSource xmlSource) throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
StreamResult foResult = new StreamResult(baos);
transformer.transform(xmlSource, foResult);
ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
return invokeFOP( new InputSource(bais) );
}
/** To be used with files */
public static void createPDFFromXML(String xslFilePath, String xmlFilePath, String outputPDFPath) throws Exception {
FileOutputStream fos = new FileOutputStream(outputPDFPath);
createPDFFromXML(xslFilePath, new FileInputStream(xmlFilePath), fos);
fos.close();
}
/** To be called when there is no spoon (XML or PDF file) */
public static void createPDFFromXML(String xslFilePath, InputStream xmlIn, OutputStream pdfOut) throws Exception {
PDFWriter writer = new PDFWriter(xslFilePath);
byte[] PDFbytes = writer.generatePDF( new StreamSource(xmlIn) );
pdfOut.write(PDFbytes, 0, PDFbytes.length);
}
public static void main(String[] args) {
String fileBasePath = "." + File.separator;
String xmlFilePath = fileBasePath + "watchlist.xml";
String xslFilePath = fileBasePath + "watchlist2pdf.xsl";
String outputPDFPath = fileBasePath + "watchlist.pdf";
try {
PDFWriter.createPDFFromXML(xslFilePath, xmlFilePath, outputPDFPath);
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
这个javabean输入一个XSL-FO的文件的位置,一个XML文件的位置,输出一个PDF文件。