You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

额外注意事项

  1. iText版本兼容性:如果使用的是iText 7,API会有差异,比如需要用ImageDataFactory.create(imageBytes)来创建图片,而不是Image.getInstance(),请确认你的依赖版本是否匹配。
  2. MySQL Blob存储正确性:检查写入Blob的代码是否正确,比如使用PreparedStatement.setBlob()而不是字符串转码的方式,避免存储过程中损坏图片字节。
  3. 文件写入权限:确保filePath指向的目录有写入权限,否则会导致PDF文件创建失败或不完整。

内容的提问来源于stack exchange,提问作者Stubborn Master

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:23:25