Java Html到Pdf呈现程序Java.io.IOException:流关闭并冻结
我有一个Java渲染器类,它使用飞碟库将HTML文档转换为pdf文件Java Html到Pdf呈现程序Java.io.IOException:流关闭并冻结,java,pdf,Java,Pdf,我有一个Java渲染器类,它使用飞碟库将HTML文档转换为pdf文件 public static void openPdf(String renderedHtml) { /* save file inside tmp folder */ boolean fileCorrectlySaved = false; File outputFile = null; try { /*
public static void openPdf(String renderedHtml)
{
/* save file inside tmp folder */
boolean fileCorrectlySaved = false;
File outputFile = null;
try
{
/*
* All below is to set off any xml validity checking off, otherwise parse function takes almost 1 minute!
*/
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
// parse the markup into an xml Document
DocumentBuilder builder = documentBuilderFactory.newDocumentBuilder();
//Document doc = builder.parse(new StringBufferInputStream(stringBuilder.toString()));
Document doc = builder.parse(new ByteArrayInputStream(renderedHtml.getBytes("UTF-8")));
ITextRenderer renderer = new ITextRenderer();
CreationListener listener = new CreationListener();
listener.parseMetaTags(doc);
renderer.setListener(listener);
renderer.setDocument(doc, null);
outputFile = File.createTempFile("out_print", ".pdf");
OutputStream outputStream = new FileOutputStream(outputFile);
renderer.layout();
renderer.createPDF(outputStream);
outputStream.close();
fileCorrectlySaved = true;
}
catch (Exception e)
{
JOptionPane.showMessageDialog(null, e.toString());
}
[...]
}
它可以正常工作并正确显示pdf文件,但每次都会记录错误:
java.io.IOException: Stream closed
at java.io.BufferedInputStream.getInIfOpen(BufferedInputStream.java:159)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:284)
at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at org.xhtmlrenderer.css.parser.Lexer.zzRefill(Lexer.java:1634)
at org.xhtmlrenderer.css.parser.Lexer.yylex(Lexer.java:1865)
at org.xhtmlrenderer.css.parser.CSSParser.next(CSSParser.java:1798)
at org.xhtmlrenderer.css.parser.CSSParser.la(CSSParser.java:1810)
at org.xhtmlrenderer.css.parser.CSSParser.stylesheet(CSSParser.java:159)
at org.xhtmlrenderer.css.parser.CSSParser.parseStylesheet(CSSParser.java:89)
at org.xhtmlrenderer.context.StylesheetFactoryImpl.parse(StylesheetFactoryImpl.java:78)
at org.xhtmlrenderer.context.StylesheetFactoryImpl.parse(StylesheetFactoryImpl.java:95)
at org.xhtmlrenderer.context.StylesheetFactoryImpl.getStylesheet(StylesheetFactoryImpl.java:174)
at org.xhtmlrenderer.context.StyleReference.readAndParseAll(StyleReference.java:123)
at org.xhtmlrenderer.context.StyleReference.setDocumentContext(StyleReference.java:107)
at org.xhtmlrenderer.pdf.ITextRenderer.setDocument(ITextRenderer.java:175)
at org.xhtmlrenderer.pdf.ITextRenderer.setDocument(ITextRenderer.java:142)
at Test.gui.renderer.Renderer.openPdf(Renderer.java:267)
生成错误的线路就是调用该线路的线路
renderer.setDocument(doc, null);
接下来的情况是,有时整个操作系统会冻结几秒钟(鼠标移动所有窗口都会冻结)
我试图更改代码以避免StreamClosed异常,但到目前为止没有结果。错误是在计算机冻结后引发的?可能尝试增加VM的可用内存。我遇到了类似的问题,发现当URL在https上运行时,我需要将证书导入到“jre/lib/security/cacerts”JVM密钥库中
keytool -import -alias <alias_name_here> -keystore ../lib/security/cacerts -file <path_to_public.cer>
keytool-import-alias-keystore../lib/security/cacerts-file
那么这不应该是内存问题。您是否尝试过从renderer.setDocument(doc,null)中删除null代码>并替换为renderer.setDocument(doc)代码>?您可以查看您发布的关于如何向pdf添加元数据的链接。我的代码与此无关。。。