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

为何PDF转JPG后文件体积反而大于原PDF?技术分析

问题:PDF转JPG后体积波动的影响因素

我为了节省存储空间,使用PDFBox将单个PDF的所有页面垂直拼接为一张JPG图像,代码如下:

BufferedImage combinedImage = new BufferedImage(maxWidth, maxHeight, TYPE_INT_RGB);
int currentYPlacement = 0;

for (int i = 0; i < document.getPages().getCount(); i++) {
  BufferedImage currentImage = pdfRenderer.renderImageWithDPI(i, 72, ImageType.RGB);

  Graphics graphics = combinedImage.getGraphics();
  graphics.drawImage(currentImage, 0, currentYPlacement, null);
  currentYPlacement += currentImage.getHeight();
}
File outputfile = new File("test.jpg");
ImageIO.write(combinedImage, "jpg", outputfile);

但我发现JPG文件体积并非总是小于原PDF,我需要图像保持可读且与原PDF尺寸一致。我了解小体积PDF(<50KB)转JPG可能变大,但不确定其他影响因素。以下是我的测试结果,注意两个单页PDF的差异:第二个单页PDF转JPG后体积几乎是原PDF的2倍,哪些因素会影响JPG体积?

页数PDF大小JPG大小结果示例PDF
1178 KB88 KB减小50.5618%TN州车辆登记表格
195 KB135 KB增大42.1053%内华达州DMV表格
2144 KB169 KB增大17.3611%TN州委托协议表格
2372 KB184 KB减小50.5376%火奴鲁鲁市驾照申请表格

更新
我用Microsoft Word创建了一个8.5×11英寸的PDF,仅包含文字“Hello, World!”,转换后PDF为23 KB,JPG为14 KB,这让我感到困惑……


影响JPG体积的核心因素

一、PDF本身的内容特性

  1. 存储格式差异:
    PDF是结构化文档,文字、线条、表单控件都是用矢量指令描述的,并非像素。比如表单类PDF,核心元素是矢量/文本,体积小;但如果PDF是扫描件转的(本质是内嵌图像),PDF可能对图像做了低效压缩,转JPG时用更优算法就能缩小体积。你测试里体积反超的那个单页PDF,大概率是包含大量复杂矢量图形或表单控件,转成像素图后,JPG需要存储所有像素信息,反而比PDF的指令描述更占空间。
  2. 内容复杂度:
    页面元素越多、色彩越丰富、细节越密集,转JPG后需要存储的信息就越多。比如带渐变、阴影、大量小文字的页面,JPG压缩难度高,体积会更大;纯文字少的页面,压缩后体积更小。
  3. PDF内部压缩率:
    PDF支持多种高效压缩算法(如Flate、JBIG2),如果PDF本身已经对内部元素做了最优压缩,转成JPG时可能无法进一步压缩,甚至因为像素化带来冗余,体积反超。

二、JPG转换的参数设置

  1. 压缩质量:
    ImageIO.write默认的JPG压缩质量不是最优的,手动调整压缩系数(0.1-1.0)能在保证可读性的前提下大幅减小体积。比如设置0.7的质量系数,既能保持清晰,又能有效压缩。修改代码示例:
    ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next();
    ImageWriteParam param = writer.getDefaultWriteParam();
    param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
    param.setCompressionQuality(0.7f); // 平衡质量与体积的常用值
    FileImageOutputStream output = new FileImageOutputStream(outputfile);
    writer.setOutput(output);
    writer.write(null, new IIOImage(combinedImage, null, null), param);
    writer.dispose();
    output.close();
    
  2. 色彩模式:
    你当前用的是TYPE_INT_RGB(24位真彩色),如果PDF是黑白或灰度内容,转成灰度图(TYPE_BYTE_GRAY)能把体积降到原来的1/3左右,因为灰度图每个像素只占8位。
  3. DPI匹配:
    代码里用的72DPI是屏幕分辨率,如果原PDF的原生分辨率更高(比如300DPI),转72DPI会缩小体积;但如果PDF本身就是72DPI,转出来的像素数刚好,压缩空间有限。要保持尺寸一致,需匹配原PDF的实际分辨率。

三、测试特例解释

你用Word生成的“Hello, World!”PDF体积23KB,转JPG后只有14KB,是因为这个PDF包含大量Word生成的元数据(字体嵌入信息、文档结构、打印设置等),而JPG只存储文字对应的像素,没有这些冗余内容,所以体积更小。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 14:16:52