无法从MySQL数据库将Medium Blob类型图片添加至PDF问题排查
解决从MySQL Medium Blob读取图片并写入PDF的问题
看起来你遇到的问题大概率是几个常见的细节疏漏导致的,我帮你梳理一下排查方向和修正方案:
首先排查核心问题点
- ResultSet是否正确定位:你的代码里没体现
rs.next()调用,如果没有移动到结果集的有效行,rs.getBlob()要么返回null,要么抛出异常,这是最容易忽略的点。 - Blob数据有效性:先确认数据库里的Medium Blob确实存储了完整的图片字节流——可以把读取到的
imageBytes写入本地文件,看看能不能用图片浏览器正常打开,排除数据本身损坏的可能。 - 异常信息缺失:你的代码没有异常捕获逻辑,很多时候问题的根源就藏在抛出的
SQLException、IOException或DocumentException里,必须打印异常栈才能定位问题。
修正后的完整代码
我给你调整了代码,加上了必要的异常处理、资源自动关闭(用try-with-resources)和关键校验:
import com.itextpdf.text.Document; import com.itextpdf.text.DocumentException; import com.itextpdf.text.Image; import com.itextpdf.text.pdf.PdfWriter; import java.io.FileOutputStream; import java.io.IOException; import java.sql.Blob; import java.sql.ResultSet; import java.sql.SQLException; public class BlobToPdf { public void addBlobImageToPdf(ResultSet rs, String filePath) { Document myDocument = new Document(); try (FileOutputStream fos = new FileOutputStream(filePath); PdfWriter myWriter = PdfWriter.getInstance(myDocument, fos)) { myDocument.open(); // 必须先移动到ResultSet的有效行 if (rs.next()) { Blob imageBlob = rs.getBlob("Signature"); // 校验Blob不为空且有数据 if (imageBlob != null && imageBlob.length() > 0) { long blobLength = imageBlob.length(); // 读取Blob字节流(Medium Blob最大16MB,强转int没问题,这里做了兼容) byte[] imageBytes = imageBlob.getBytes(1, (int) blobLength); // 可选:写入本地文件验证图片有效性 try (FileOutputStream imgTestFos = new FileOutputStream("test_blob_image.jpg")) { imgTestFos.write(imageBytes); } // 实例化iText图片并添加到PDF Image image = Image.getInstance(imageBytes); image.scaleAbsolute(300, 300); myDocument.add(image); System.out.println("图片已成功添加到PDF"); } else { System.out.println("数据库中Signature字段为空或无数据"); } } else { System.out.println("ResultSet中未找到匹配的数据行"); } } catch (SQLException e) { System.err.println("数据库操作异常:"); e.printStackTrace(); } catch (IOException e) { System.err.println("文件IO异常:"); e.printStackTrace(); } catch (DocumentException e) { System.err.println("PDF文档处理异常:"); e.printStackTrace(); } finally { // 确保文档关闭 if (myDocument.isOpen()) { myDocument.close(); } } } }
额外注意事项
- iText版本兼容性:如果使用的是iText 7,API会有差异,比如需要用
ImageDataFactory.create(imageBytes)来创建图片,而不是Image.getInstance(),请确认你的依赖版本是否匹配。 - MySQL Blob存储正确性:检查写入Blob的代码是否正确,比如使用
PreparedStatement.setBlob()而不是字符串转码的方式,避免存储过程中损坏图片字节。 - 文件写入权限:确保
filePath指向的目录有写入权限,否则会导致PDF文件创建失败或不完整。
内容的提问来源于stack exchange,提问作者Stubborn Master
相关产品推荐
相关产品推荐

