使用iText生成PDF后通过ByteArrayOutputStream打印无输出问题排查
排查iText生成PDF内存流打印无输出的问题
我来帮你梳理下可能导致打印无输出的几个关键点,结合你的代码逐一分析:
1. 明确指定PDF格式的DocFlavor
你当前用的DocFlavor.BYTE_ARRAY.AUTOSENSE依赖打印服务自动识别文件类型,但有些打印服务对PDF的自动识别支持不好。明确指定PDF格式能避免这个问题:
DocFlavor docType = DocFlavor.BYTE_ARRAY.PDF;
2. 验证默认打印服务是否支持PDF打印
不是所有打印服务都原生支持PDF打印,你需要先确认默认服务是否能处理PDF格式的文档。可以添加一段代码来检查并选择合适的打印服务:
// 获取所有支持PDF打印的服务 PrintService[] pdfServices = PrintServiceLookup.lookupPrintServices(docType, null); if (pdfServices.length == 0) { System.err.println("没有找到支持PDF打印的服务!"); return; } // 选择第一个支持的服务,或者让用户选择 PrintService services = pdfServices[0];
3. 确认生成的PDF文件有效
有时候问题出在iText生成的PDF本身,比如内容为空或者格式损坏。你可以把内存流的内容写入本地文件,用PDF阅读器打开验证:
// 在document.close()之后添加这段代码,验证PDF是否有效 Files.write(Paths.get("generated.pdf"), byteStream);
如果本地文件能正常打开,说明PDF生成没问题;如果打不开,那要先排查iText生成PDF的逻辑(比如是否真的添加了内容到document中)。
4. 增强异常处理和打印作业状态监听
你的catch块只打印栈轨迹,可以添加更多日志,或者监听打印作业的状态,确认作业是否真的被提交:
// 添加打印作业监听器 job.addPrintJobListener(new PrintJobAdapter() { @Override public void printJobCompleted(PrintJobEvent pje) { System.out.println("打印作业已完成"); } @Override public void printJobFailed(PrintJobEvent pje) { System.err.println("打印作业失败"); } });
修改后的完整示例代码
ByteArrayOutputStream byteArr = new ByteArrayOutputStream(); Document document = new Document(); PdfWriter.getInstance(document, byteArr); document.open(); // 确保这里真的添加了内容到文档中,比如: document.add(new Paragraph("测试打印内容")); document.close(); // 验证生成的PDF(可选) byte[] byteStream = byteArr.toByteArray(); Files.write(Paths.get("generated.pdf"), byteStream); // 指定PDF格式的DocFlavor DocFlavor docType = DocFlavor.BYTE_ARRAY.PDF; // 获取支持PDF打印的服务 PrintService[] pdfServices = PrintServiceLookup.lookupPrintServices(docType, null); if (pdfServices.length == 0) { System.err.println("没有找到支持PDF打印的服务!"); return; } PrintService services = pdfServices[0]; Doc documentToBePrinted = new SimpleDoc(byteStream, docType, null); PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); DocPrintJob job = services.createPrintJob(); // 添加打印作业监听器 job.addPrintJobListener(new PrintJobAdapter() { @Override public void printJobCompleted(PrintJobEvent pje) { System.out.println("打印作业已完成"); } @Override public void printJobFailed(PrintJobEvent pje) { System.err.println("打印作业失败"); } }); try { job.print(documentToBePrinted, aset); System.out.println("打印作业已提交"); } catch (Exception pe) { pe.printStackTrace(); } byteArr = null;
先按以上步骤逐一排查,大概率能找到问题所在。
内容的提问来源于stack exchange,提问作者Mohammed Amer
相关产品推荐
相关产品推荐

