Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.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 HTML到PDF转换-“;Can';t加载XML资源";错误_Java_Xhtml_Itext_Flying Saucer - Fatal编程技术网

Java HTML到PDF转换-“;Can';t加载XML资源";错误

Java HTML到PDF转换-“;Can';t加载XML资源";错误,java,xhtml,itext,flying-saucer,Java,Xhtml,Itext,Flying Saucer,我正在尝试使用飞碟和iText将严格的XHTML转换为PDF。我已经验证了XHTML以及输入和输出文件的路径是精确的。我根本不知道为什么这会在renderer.setDocument(“file:/c:/example/First.html”)行抛出异常 我的班级: package flyingsaucerpdf; import java.io.*; import org.xhtmlrenderer.pdf.ITextRenderer; import com.lowagi

我正在尝试使用飞碟和iText将严格的XHTML转换为PDF。我已经验证了XHTML以及输入和输出文件的路径是精确的。我根本不知道为什么这会在renderer.setDocument(“file:/c:/example/First.html”)行抛出异常

我的班级:

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();
         }

    }
我的例外:

错误:“”我无法创建文件。错误:无法加载XML资源(使用TRaX transformer)。java.lang.NullPointerException

线程“main”java.lang.NullPointerException中出现异常 在org.xhtmlender.layout.BoxBuilder.createRootBox(BoxBuilder.java:81)上 位于org.xhtmlrenderer.pdf.ITextRenderer.layout(ITextRenderer.java:152) 在flyingsauerpdf.FirstDoc.main(FirstDoc.java:31)

我的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>

在此处插入标题
b{颜色:绿色;}

地球人你好!
我们是为你的Java而来的。


有什么帮助吗

您的虚拟机是否联机?渲染器/解析器可能会尝试加载链接资源,如

这是确保您提供的xml(xhtml)正确所必需的

在Servlet中,我执行了以下似乎有效的操作(由于服务器没有internet连接,所以在我自己的文件系统中提供了一些在线资源):


这基本上是建立一个DocumentBuilder,然后解析我的文档(它是字符串格式的,由变量html表示)

虽然我解决了这个问题(它实际上是一个无效的XHTML),但您的方法更微妙,也更能防止错误。谢谢。你能上传正确的xhtml吗?我遇到了同样的问题
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();