使用Flying Saucer生成PDF后,Itext PdfReader报InvalidPdfException求助
解决Flying Saucer生成PDF后iText PdfReader报InvalidPdfException的问题
异常信息
com.itextpdf.text.exceptions.InvalidPdfException: PDF header signature not found.
问题分析
生成的PDF文件无效,未以%PDF-开头,通常由流处理不当、版本不兼容或生成过程异常导致。
解决方案
1. 修正流的处理逻辑
手动管理流容易出现关闭顺序错误,导致文件未完全写入。改用try-with-resources自动管理流,确保资源正确释放:
try (OutputStream os = new FileOutputStream(path)) { ITextRenderer renderer = new ITextRenderer(); renderer.setDocumentFromString(html); renderer.layout(); renderer.createPDF(os); renderer.finishPDF(); } catch (IOException e) { e.printStackTrace(); }
2. 检查Flying Saucer与iText版本兼容性
Flying Saucer对iText版本有严格依赖,版本不匹配会导致生成的PDF无法被高版本PdfReader识别:
- 若使用Flying Saucer 9.x+,需搭配iText 5.x(推荐5.5.13.3)
- 旧版Flying Saucer(如8.x及以下)通常依赖iText 2.1.7,此时需使用对应版本的PdfReader
Maven依赖示例(匹配版本):
<!-- Flying Saucer --> <dependency> <groupId>org.xhtmlrenderer</groupId> <artifactId>flying-saucer-pdf</artifactId> <version>9.1.22</version> </dependency> <!-- 对应iText版本 --> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.13.3</version> </dependency>
3. 排查生成过程中的异常
生成PDF时若出现HTML解析错误、CSS不支持等问题,会导致文件损坏。添加异常捕获,查看具体错误:
try (OutputStream os = new FileOutputStream(path)) { ITextRenderer renderer = new ITextRenderer(); renderer.setDocumentFromString(html); renderer.layout(); renderer.createPDF(os); renderer.finishPDF(); } catch (Exception e) { e.printStackTrace(); // 打印生成过程中的所有异常 }
4. 验证HTML内容有效性
复杂或不规范的HTML可能导致生成失败。先用极简HTML测试:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head> <body> <h1>测试PDF</h1> <p>这是一个测试文档</p> </body> </html>
若用此HTML生成的PDF能正常读取,说明原HTML存在格式或兼容性问题。
内容的提问来源于stack exchange,提问作者YoHaRo
相关产品推荐
相关产品推荐

