Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用SVG创建具有以下HTML字符串的PDF文档?_Java_Html_Pdf_Svg_Flying Saucer - Fatal编程技术网

Java 如何使用SVG创建具有以下HTML字符串的PDF文档?

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

我正在尝试将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=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;
        }}