使用JDOM處理XML資料之PDF篇(一) (轉)

amyz發表於2007-11-26
使用JDOM處理XML資料之PDF篇(一) (轉)[@more@]

使用J處理資料之PDF篇(一)microsoft-com::office" />

 處理XML資料的三種方式我們已經都介紹過了,

 (直接讀取/Develop/read_article.?id=20720">

和使用T )現在來看一下第三種方式即轉化成二進位制格式(一般為PDF)的操作。這個操作要藉助.org/"> 提供的包fop來完成。其實這個是我整理的,不是自己寫的:)它的程式碼如下:

package XML;

import .io.*;

import org.xml.sax.Input;

import org.xml.sax.XMLReader;

import org.apache.fop.apps.;

import org.apache.fop.apps.Version;

import javax.xml.tranorm.*;

import javax.xml.transform.stream.*;

/**

 *  Class to convert an XML document to PDF via

 *  XSLT and XSL formatting s.

 */

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("JAconfiguration 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 ba= 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檔案。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-984952/,如需轉載,請註明出處,否則將追究法律責任。

相關文章