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
相关产品推荐
相关产品推荐

