Resize and compress bitmaps to decrease PDF size

This commit is contained in:
Pierre-Yves Nicolas
2025-06-01 17:40:43 +02:00
parent fee1e48b6d
commit ba2a9cf8fd

View File

@@ -1,19 +1,27 @@
package org.mydomain.myscan
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.pdf.PdfDocument
import android.util.Log
import androidx.core.graphics.scale
import java.io.ByteArrayOutputStream
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
import kotlin.math.max
fun createPdfFromBitmaps(bitmaps: List<Bitmap>, outputFile: File): Boolean {
val document = PdfDocument()
try {
for ((index, bitmap) in bitmaps.withIndex()) {
for ((index, bitmap) in bitmaps.map { resizeImage(it) }.withIndex()) {
val jpegStream = ByteArrayOutputStream()
bitmap.compress(Bitmap.CompressFormat.JPEG, 72, jpegStream)
val compressedBytes = jpegStream.toByteArray()
val compressedBitmap = BitmapFactory.decodeByteArray(compressedBytes, 0, compressedBytes.size)
val pageInfo = PdfDocument.PageInfo.Builder(bitmap.width, bitmap.height, index + 1).create()
val page = document.startPage(pageInfo)
page.canvas.drawBitmap(bitmap, 0f, 0f, null)
page.canvas.drawBitmap(compressedBitmap, 0f, 0f, null)
document.finishPage(page)
}
FileOutputStream(outputFile).use { outputStream ->
@@ -26,4 +34,17 @@ fun createPdfFromBitmaps(bitmaps: List<Bitmap>, outputFile: File): Boolean {
} finally {
document.close()
}
}
}
fun resizeImage(original: Bitmap): Bitmap {
val targetMax = 1500
if (max(original.width, original.height) < targetMax)
return original;
var targetWidth = targetMax
var targetHeight = original.height * targetWidth / original.width
if (original.width < original.height) {
targetHeight = targetMax
targetWidth = original.width * targetHeight / original.height
}
return original.scale(targetWidth, targetHeight)
}