【问题标题】:Java Css+ html to pdf convertion exception Invalid nested tag head found, expected closing tag linkJava Css html到pdf转换异常找到无效的嵌套标签头,预期结束标签链接
【发布时间】:2017-12-23 07:44:58
【问题描述】:
    package sandbox.xmlworker;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorker;
import com.itextpdf.tool.xml.XMLWorkerHelper;
import com.itextpdf.tool.xml.css.CssFile;
import com.itextpdf.tool.xml.css.StyleAttrCSSResolver;
import com.itextpdf.tool.xml.html.Tags;
import com.itextpdf.tool.xml.parser.XMLParser;
import com.itextpdf.tool.xml.pipeline.css.CSSResolver;
import com.itextpdf.tool.xml.pipeline.css.CssResolverPipeline;
import com.itextpdf.tool.xml.pipeline.end.PdfWriterPipeline;
import com.itextpdf.tool.xml.pipeline.html.HtmlPipeline;
import com.itextpdf.tool.xml.pipeline.html.HtmlPipelineContext;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class D04_ParseHtmlCss {

    public static final String SRC = "/home/xxx/workspace/DemoTransformer/src/data/result.html";
    public static final String CSS = "/home/xxx/workspace/DemoTransformer/src/data/beyanname.css";
    public static final String DEST = "/home/xxx/workspace/DemoTransformer/src/data/resultpdffileson.pdf";

    public void createPdf(File file) throws IOException, DocumentException {
        // step 1
        Document document = new Document();

        // step 2
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));
        writer.setInitialLeading(12.5f);

        // step 3
        document.open();

        // step 4

        // CSS
        CSSResolver cssResolver = new StyleAttrCSSResolver();
        CssFile cssFile = XMLWorkerHelper.getCSS(new FileInputStream(CSS));
        cssResolver.addCss(cssFile);

        // HTML
        HtmlPipelineContext htmlContext = new HtmlPipelineContext(null);
        htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());

        // Pipelines
        PdfWriterPipeline pdf = new PdfWriterPipeline(document, writer);
        HtmlPipeline html = new HtmlPipeline(htmlContext, pdf);
        CssResolverPipeline css = new CssResolverPipeline(cssResolver, html);

        // XML Worker
        XMLWorker worker = new XMLWorker(css, true);
        XMLParser p = new XMLParser(worker);
        p.parse(new FileInputStream(SRC));

        // step 5
        document.close();
    }

    /**
     * Main method
     */
    public static void main(String[] args) throws IOException, DocumentException {
        File file = new File(DEST);
        file.getParentFile().mkdirs();
        new D04_ParseHtmlCss().createPdf(new File(DEST));
    }
}

此代码来自 itext 沙箱:http://developers.itextpdf.com/examples/xml-worker-itext5/xml-worker-examples

我也使用 itext-pdf5.4.5 和 xml-worker 5.4.5

但它给出了这个错误,我不知道如何解决这个问题

Exception in thread "main" com.itextpdf.tool.xml.exceptions.RuntimeWorkerException: Invalid nested tag head found, expected closing tag link.
    at com.itextpdf.tool.xml.XMLWorker.endElement(XMLWorker.java:134)
    at com.itextpdf.tool.xml.parser.XMLParser.endElement(XMLParser.java:395)
    at com.itextpdf.tool.xml.parser.state.ClosingTagState.process(ClosingTagState.java:70)
    at com.itextpdf.tool.xml.parser.XMLParser.parseWithReader(XMLParser.java:235)
    at com.itextpdf.tool.xml.parser.XMLParser.parse(XMLParser.java:213)
    at com.itextpdf.tool.xml.parser.XMLParser.parse(XMLParser.java:174)
    at sandbox.xmlworker.D04_ParseHtmlCss.createPdf(D04_ParseHtmlCss.java:59)
    at sandbox.xmlworker.D04_ParseHtmlCss.main(D04_ParseHtmlCss.java:71)

html文件的头部是这样的:

<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>KDV1</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="beyanname.css">
</head>

我使用 itext 从 xml 和 xslt 文件生成了这段代码

【问题讨论】:

  • 问题似乎出在 HTML 中,能发一下吗?或者至少是完整的&lt;head&gt;
  • 完整的头是这样的:'code' KDV1 'code' 我使用 tanother java 代码从 xml 和 xslt 文件生成了这段代码
  • 编辑您的问题以添加代码,而不是将其放在评论中。事实上,它是不可读的
  • 编辑完成

标签: java html css exception


【解决方案1】:

您的工具正在使用 XML 解析器来解析 HTML。虽然两者看起来很相似,但they are not exactly the same。您的错误是由非子句 &lt;link&gt; 标记引起的,它是 valid in HTML 但不是 XML。这会导致您的解析器抛出异常。因此,对您而言,最简单的解决方案是用 HTML 解析器替换 XMLParser,或者确保您的 HTML 文件位于 XHTML 中,即 XML compliant

【讨论】:

  • 有没有最简单的方法将css、xml和xslt文件加入pdf文件?
  • 在您的示例中,您没有任何 xmlxslt。但是如果你想用纯 XML 来做,你需要阅读它并自己生成 PDF(当然使用 PDF 库),因为 XML 仅用于数据。或者您可以使用支持导出为 PDF 的报告框架
猜你喜欢
  • 2014-10-18
  • 1970-01-01
  • 2012-05-24
  • 1970-01-01
  • 1970-01-01
  • 2012-09-03
  • 1970-01-01
  • 2021-01-10
  • 1970-01-01
相关资源
最近更新 更多