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

Android(Kotlin)中iText7 PDF压缩功能无效问题求助

iText7 Android(Kotlin) 图片转PDF压缩无效问题解决

问题原因

PdfWriter.setCompressionLevel()仅控制PDF文档中文本、元数据、未压缩资源的压缩,对于已经是压缩格式的图片(如JPG、PNG),iText默认不会重复压缩,避免不必要的画质损失,因此设置压缩级别后文件大小无变化。

解决方案

针对仅包含图片的PDF,需对图片本身进行压缩处理,以下是几种可行方案:

1. 压缩图片质量(JPEG格式)

通过调整图片压缩质量来减小体积,适合JPG格式图片,替换createPages中的图片创建逻辑:

private fun createPages(document: Document, pdfDocument: PdfDocument) {
    fileHolder.imagePathList.forEach { uri ->
        val imageFile = File(uri.path ?: "")
        val bitmap = BitmapFactory.decodeFile(imageFile.absolutePath)
        val baos = ByteArrayOutputStream()
        // 压缩质量设为70(范围0-100,值越小压缩率越高、画质损失越大)
        bitmap.compress(Bitmap.CompressFormat.JPEG, 70, baos)
        val imageData = ImageDataFactory.create(baos.toByteArray())
        val image = Image(imageData)
        
        setImageSize(image)
        pdfDocument.addNewPage(getPageSize(image))
        document.add(image)
        
        bitmap.recycle() // 释放Bitmap资源
        baos.close()
    }
}

2. 缩放图片分辨率

如果图片分辨率远高于PDF页面需求,可先缩放图片尺寸,减少像素总量从而降低体积:

private fun createPages(document: Document, pdfDocument: PdfDocument) {
    fileHolder.imagePathList.forEach { uri ->
        val image = Image(ImageDataFactory.create(uri))
        // 按比例缩放到原尺寸的60%
        val scaleRatio = 0.6f
        image.scale(scaleRatio, scaleRatio)
        
        setImageSize(image)
        pdfDocument.addNewPage(getPageSize(image))
        document.add(image)
    }
}

3. 转换图片格式(如PNG转JPEG)

PNG为无损压缩格式,体积通常大于JPEG,可将PNG图片转为JPEG格式并压缩:

private fun createPages(document: Document, pdfDocument: PdfDocument) {
    fileHolder.imagePathList.forEach { uri ->
        val bitmap = BitmapFactory.decodeFile(uri.path ?: "")
        val baos = ByteArrayOutputStream()
        // 将PNG转为JPEG并设置压缩质量
        bitmap.compress(Bitmap.CompressFormat.JPEG, 60, baos)
        val imageData = ImageDataFactory.create(baos.toByteArray())
        val image = Image(imageData)
        
        setImageSize(image)
        pdfDocument.addNewPage(getPageSize(image))
        document.add(image)
        
        bitmap.recycle()
        baos.close()
    }
}

注意事项

  • 压缩质量和缩放比例需根据实际需求调整,平衡体积和画质;
  • Android环境下处理图片需注意权限(如READ_EXTERNAL_STORAGE),并及时释放Bitmap资源避免内存泄漏;
  • 若原图片为未压缩格式(如BMP),setCompressionLevel()会自动生效,无需额外处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 22:12:04