From ba2a9cf8fd42a6b2162a93e4e49753075ff7fec1 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Nicolas <6371790+pynicolas@users.noreply.github.com> Date: Sun, 1 Jun 2025 17:40:43 +0200 Subject: [PATCH] Resize and compress bitmaps to decrease PDF size --- .../java/org/mydomain/myscan/PdfGeneration.kt | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/mydomain/myscan/PdfGeneration.kt b/app/src/main/java/org/mydomain/myscan/PdfGeneration.kt index 5500945..c894cd3 100644 --- a/app/src/main/java/org/mydomain/myscan/PdfGeneration.kt +++ b/app/src/main/java/org/mydomain/myscan/PdfGeneration.kt @@ -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, 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, outputFile: File): Boolean { } finally { document.close() } -} \ No newline at end of file +} + +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) +}