Java 如何使用SVG创建具有以下HTML字符串的PDF文档?
我正在尝试将HTML字符串转换为PDF文档。但是只有文本部分被打印到PDF中,而不是SVG。这是我试过的Java 如何使用SVG创建具有以下HTML字符串的PDF文档?,java,html,pdf,svg,flying-saucer,Java,Html,Pdf,Svg,Flying Saucer,我正在尝试将HTML字符串转换为PDF文档。但是只有文本部分被打印到PDF中,而不是SVG。这是我试过的 将HTML字符串转换为org.w3c.dom.Document 使用飞碟生成pdf 公共类PDFCreator{ 公共静态void main(字符串[]args){ PDFCreator PDFCreator=新的PDFCreator(); 字符串html=“#svg{display:block;}示例文档我的第一个带有svg的html文档”; Document Document=pdfCr
公共类PDFCreator{
公共静态void main(字符串[]args){
PDFCreator PDFCreator=新的PDFCreator();
字符串html=“#svg{display:block;}示例文档我的第一个带有svg的html文档”;
Document Document=pdfCreator.createDocument(html);
创建(文档);
}
公共作废创建(文档){
试一试{
String outputFile=“D:\\htmlWithSVG.pdf”;
OutputStream os=新文件OutputStream(outputFile);
ITextRenderer=newitextrenderer();
renderer.setDocument(document,null);
ChainingReplacedElementFactory ChainingReplacedElementFactory=新ChainingReplacedElementFactory();
chainingReplacedElementFactory.addReplacedElementFactory(新的SVGReplacedElementFactory());
SharedContext SharedContext=renderer.getSharedContext();
setReplacedElementFactory(chainingReplacedElementFactory);
layout();
createPDF(os);
os.close();
}捕获(DocumentException-ex){
例如printStackTrace();
}捕获(FileNotFoundException ex){
例如printStackTrace();
}捕获(IOEX异常){
例如printStackTrace();
}
}
公共文档createDocument(字符串xml){
InputSource InputSource=新的InputSource(新的StringReader(xml));
DocumentBuilderFactory工厂=DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder=null;
单据=空;
试一试{
builder=factory.newDocumentBuilder();
document=builder.parse(inputSource);
}捕获(ParserConfiguration异常ex){
例如printStackTrace();
}捕获(SAXEx异常){
例如printStackTrace();
}捕获(IOEX异常){
例如printStackTrace();
}
归还文件;
}}
我还查看了以下教程,该教程使用了类ChainingReplacedElementFactory
和SVGReplacedElementFactory
您可以尝试使用第三方工具将html文件转换为pdf格式。 它主要处理一切 wkhtmltopdf是一种很好的外观
这是我发布的链接。我在c#中尝试过,但您没有XML字符串,是吗?您实际上有一个HTML字符串。@RobertLongson我认为HTML也是一个xml。事实上,我必须把html转换成pdf格式。你需要改变你的想法:html不是xml。xhtml是xml,所以你可以试试看。@RobertLongson,对不起。该html是使用JTidy生成的。所以,它是xhtml文档。不,它不是。它没有名称空间定义。也就是说,没有xmlns=“”属性,所以它是HTML。这不是有效的xhtml。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,则仅链接的答案可能无效
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.xhtmlrenderer.layout.SharedContext;
import org.xhtmlrenderer.pdf.ITextRenderer;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import com.lowagie.text.DocumentException;
public class PDFCreator {
public static void main(String[] args) {
PDFCreator pdfCreator = new PDFCreator();
String html = "<!DOCTYPE html> <html> <head> <meta name=\"generator\" content=\"HTML Tidy for Java (vers. 2009-12-01), see jtidy.sourceforge.net\" /> <style type=\"text/css\"> #svg {display:block;}</style> <title>Sample Document</title> </head> <body> <h1>My First HTML Document with SVG</h1> <div id=\"svg\"> <svg width=\"100\" height=\"100\"> <circle cx=\"50\" cy=\"50\" r=\"40\" stroke=\"green\" stroke-width=\"4\" fill=\"yellow\" /></svg></div> </body></html>";
Document document = pdfCreator.createDocument(html);
pdfCreator.create(document);
}
public void create(Document document) {
try {
String outputFile = "D:\\htmlWithSVG.pdf";
OutputStream os = new FileOutputStream(outputFile);
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(document, null);
ChainingReplacedElementFactory chainingReplacedElementFactory = new ChainingReplacedElementFactory();
chainingReplacedElementFactory.addReplacedElementFactory(new SVGReplacedElementFactory());
SharedContext sharedContext = renderer.getSharedContext();
sharedContext.setReplacedElementFactory(chainingReplacedElementFactory);
renderer.layout();
renderer.createPDF(os);
os.close();
} catch (DocumentException ex) {
ex.printStackTrace();
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
}
public Document createDocument(String xml) {
InputSource inputSource = new InputSource(new StringReader(xml));
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = null;
Document document = null;
try {
builder = factory.newDocumentBuilder();
document = builder.parse(inputSource);
} catch (ParserConfigurationException ex) {
ex.printStackTrace();
} catch (SAXException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
return document;
}}