简体   繁体   English

HTML到PDF转换 - “无法加载XML资源”错误

[英]HTML to PDF Conversion - “Can't load the XML resource” Error

I'm trying to convert strict XHTML to PDF using flying saucer and iText. 我正在尝试使用飞碟和iText将严格的XHTML转换为PDF。 I've validated XHTML and path of input and output file are precise. 我已经验证了XHTML,输入和输出文件的路径是精确的。 I have no goddamn clue why this is throwing an exception on renderer.setDocument("file:/c:/example/First.html") line. 我没有该死的线索,为什么这会在renderer.setDocument(“file:/ c:/example/First.html”)行上抛出异常。

My Class: 我的课:

package flyingsaucerpdf;
    import java.io.*;
    import org.xhtmlrenderer.pdf.ITextRenderer;
    import com.lowagie.text.DocumentException;

    public class FirstDoc {
     public static void main(String[] args) throws IOException, DocumentException
         {
                 String outputFile = "results/firstdoc.pdf";
                 OutputStream os = new FileOutputStream(outputFile);
                 ITextRenderer renderer = new ITextRenderer();
             try
             {
                 renderer.setDocument("file:/c:/example/First.html");
             }
             catch( Exception e )
             {
                 System.out.println("Me not create file. Error:"+e.getMessage());
             }
             renderer.layout();
             renderer.createPDF(os);

             os.close();
         }

    }

My Exception: 我的例外:

ERROR: ''Me not create file. 错误:''我不创建文件。 Error:Can't load the XML resource (using TRaX transformer). 错误:无法加载XML资源(使用TRaX转换器)。 java.lang.NullPointerException 显示java.lang.NullPointerException

Exception in thread "main" java.lang.NullPointerException at org.xhtmlrenderer.layout.BoxBuilder.createRootBox(BoxBuilder.java:81) at org.xhtmlrenderer.pdf.ITextRenderer.layout(ITextRenderer.java:152) at flyingsaucerpdf.FirstDoc.main(FirstDoc.java:31) 位于org.xhtmlrenderer.layout.BoxBuilder.createRootBox(BoxBuilder.java:81)的主题“main”java.lang.NullPointerException中的异常,位于orings.xhtmlrenderer.pdf.ITextRenderer.layout(ITextRenderer.java:152)的flyingsaucerpdf.FirstDoc。主(FirstDoc.java:31)

My XHTML: 我的XHTML:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Insert title here</title>
<style type="text/css"> b { color: green; } </style>
</head>
<body>
<p>
<b>Greetings Earthlings!</b>
We've come for your Java.
</p>
</body>
</html>

Any help? 有帮助吗?

Is your virtual machine online? 您的虚拟机在线吗? It may be possible that the renderer/parser tries to load the linked resources like the 渲染器/解析器可能会尝试加载链接的资源,如

http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd

that are needed to ensure that the xml (xhtml) you provide is correct. 确保您提供的xml(xhtml)正确所需。

In a Servlet I do the following that seems to work (some online resources are made available within my own filesystem because the server has no internet connection): 在Servlet中,我执行以下似乎工作(一些在线资源在我自己的文件系统中可用,因为服务器没有Internet连接):

final DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
builder.setEntityResolver(new EntityResolver() {
  @Override
  public InputSource resolveEntity(String publicId, String systemId)
      throws SAXException, IOException {
    if (systemId.contains("xhtml1-transitional.dtd")) {
      return new InputSource(new FileReader(realPath + "/WEB-INF/dtd/xhtml1-transitional.dtd"));
    } else if (systemId.contains("xhtml-lat1.ent")) {
      return new InputSource(new FileReader(realPath + "/WEB-INF/dtd/xhtml-lat1.ent"));
    } else if (systemId.contains("xhtml-symbol.ent")) {
      return new InputSource(new FileReader(realPath + "/WEB-INF/dtd/xhtml-symbol.ent"));
    } else if (systemId.contains("xhtml-special.ent")) {
      return new InputSource(new FileReader(realPath + "/WEB-INF/dtd/xhtml-special.ent"));
    } else {
      return null;
    }
  }
});
final ByteArrayInputStream inputStream = new ByteArrayInputStream(html.getBytes("UTF-8"));
final Document doc = builder.parse(inputStream);
inputStream.close();
final ITextRenderer renderer = new ITextRenderer(26f * 4f / 3f, 26);
renderer.setDocument(doc, request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort());
renderer.layout();

This basically sets up a DocumentBuilder and then parses my document (which is in String format and represented by the variable html ) 这基本上设置了一个DocumentBuilder然后解析我的文档(它是String格式并由变量html表示)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM