HTML转PDF

zoutuo zoutuo 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
各位大哥大街们,我想把HTML转换成PDF,使用的是FOP,但是报错:
java.lang.ClassCastException: org.apache.fop.layout.BlockArea cannot be cast to org.apache.fop.layout.AreaContainer
at com.test.Html2Pdf.fo2PDF(Html2Pdf.java:115)
115是driver.run()。程序代码如下:

package com.test;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.dom.DOMSource;

import org.apache.avalon.framework.logger.ConsoleLogger;
import org.apache.avalon.framework.logger.Logger;
import org.apache.fop.apps.Driver;
import org.apache.fop.tools.DocumentInputSource;
import org.w3c.dom.Document;
import org.w3c.tidy.Tidy;

/*
* Class that converts HTML to PDF using
* the DOM interfaces of JTidy, Xalan, and FOP.
*
* @author N. Afshartous
*
*/
public class Html2Pdf {

public static void main(String[] args) {

// open file
// if (args.length != 2) {
// System.out.println("Usage: Html2Pdf htmlFile styleSheet");
// System.exit(1);
// }

FileInputStream input = null;
String htmlFileName = "/home/zoutuo/hot_problem.html";
String styleSheet = "/home/zoutuo/xhtml2fo.xsl";
try {

input = new FileInputStream(htmlFileName);

} catch (java.io.FileNotFoundException e) {
System.out.println("File not found: " + htmlFileName);
}

Tidy tidy = new Tidy();
Document xmlDoc = tidy.parseDOM(input, null);

Document foDoc = xml2FO(xmlDoc, styleSheet);

String pdfFileName = htmlFileName.substring(0, htmlFileName.indexOf(".")) + ".pdf";
try {
OutputStream pdf = new FileOutputStream(new File(pdfFileName));
pdf.write(fo2PDF(foDoc));
} catch (java.io.FileNotFoundException e) {
System.out.println("Error creating PDF: " + pdfFileName);
} catch (java.io.IOException e) {
System.out.println("Error writing PDF: " + pdfFileName);
}

}

/*
* Applies stylesheet to input.
*
* @param xml The xml input Document
*
* @param stylesheet Name of the stylesheet
*
* @return Document Result of the transform
*/
private static Document xml2FO(Document xml, String styleSheet) {

DOMSource xmlDomSource = new DOMSource(xml);
DOMResult domResult = new DOMResult();

Transformer transformer = getTransformer(styleSheet);

if (transformer == null) {
System.out.println("Error creating transformer for " + styleSheet);
System.exit(1);
}
try {
transformer.transform(xmlDomSource, domResult);
} catch (javax.xml.transform.TransformerException e) {
return null;
}
return (Document) domResult.getNode();

}

/*
* Apply FOP to XSL-FO input
*
* @param foDocument The XSL-FO input
*
* @return byte[] PDF result
*/
private static byte[] fo2PDF(Document foDocument) {

DocumentInputSource fopInputSource = new DocumentInputSource(foDocument);
ByteArrayOutputStream out = null;
try {
out = new ByteArrayOutputStream();
Logger log = new ConsoleLogger(ConsoleLogger.LEVEL_WARN);

Driver driver = new Driver(fopInputSource, out);
driver.setLogger(log);
driver.setRenderer(Driver.RENDER_PDF);
driver.run();

return out.toByteArray();

} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}

/*
* Create and return a Transformer for the specified stylesheet.
*
* Based on the DOM2DOM.java example in the Xalan distribution.
*/
private static Transformer getTransformer(String styleSheet) {

try {

TransformerFactory tFactory = TransformerFactory.newInstance();

DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();

dFactory.setNamespaceAware(true);

DocumentBuilder dBuilder = dFactory.newDocumentBuilder();
Document xslDoc = dBuilder.parse(styleSheet);
DOMSource xslDomSource = new DOMSource(xslDoc);

return tFactory.newTransformer(xslDomSource);

} catch (javax.xml.transform.TransformerException e) {
e.printStackTrace();
return null;
} catch (java.io.IOException e) {
e.printStackTrace();
return null;
} catch (javax.xml.parsers.ParserConfigurationException e) {
e.printStackTrace();
return null;
} catch (org.xml.sax.SAXException e) {
e.printStackTrace();
return null;
}

}

}



各位清帮帮我吧,非常感谢!
...全文

相关推荐

评论 21
收藏 已收藏
分享
返回顶部
zoutuo
Java EE 67,535 成员 225,843 内容