Disable OCR on external call

This commit is contained in:
Pierre-Yves Nicolas
2026-06-10 19:02:02 +02:00
parent cf96095938
commit 0be14e5e8d
4 changed files with 26 additions and 16 deletions
@@ -29,6 +29,7 @@ fun interface PdfWriter {
suspend fun writePdfFromJpegs(
pages: List<PageToExport>,
outputStream: OutputStream,
disableOcr: Boolean,
onProgress: (Int) -> Unit,
)
}
@@ -47,12 +48,16 @@ class FileManager(
}
}
suspend fun generatePdf(pages: List<PageToExport>, onProgress: (Int) -> Unit): GeneratedPdf {
suspend fun generatePdf(
pages: List<PageToExport>,
disableOcr: Boolean,
onProgress: (Int) -> Unit
): GeneratedPdf {
pdfDir.mkdirs()
require(pdfDir.exists() && pdfDir.isDirectory) { "Invalid pdfDir: $pdfDir" }
val file = File(pdfDir, "${System.currentTimeMillis()}.pdf")
FileOutputStream(file).use {
pdfWriter.writePdfFromJpegs(pages, it, onProgress)
pdfWriter.writePdfFromJpegs(pages, it, disableOcr, onProgress)
}
val sizeBytes = file.length()
return GeneratedPdf(file, sizeBytes, pages.size)
@@ -43,6 +43,7 @@ class AndroidPdfWriter(val ocrService: OcrService, val assets: AssetManager) : P
override suspend fun writePdfFromJpegs(
pages: List<PageToExport>,
outputStream: OutputStream,
disableOcr: Boolean,
onProgress: (Int) -> Unit,
) {
val doc = PDDocument()
@@ -80,15 +81,17 @@ class AndroidPdfWriter(val ocrService: OcrService, val assets: AssetManager) : P
val contentStream = PDPageContentStream(document, page, AppendMode.OVERWRITE, false)
contentStream.drawImage(image, 0f, 0f, widthPoints, heightPoints)
val bitmap = jpeg.toBitmap()
val ocrTextBoxes = ocrService.runOcr(bitmap)
val pdfPageDimensions = PageDimensions(
bitmap.width,
bitmap.height,
widthPoints,
heightPoints
)
ocrDocument.addPage(page, ocrTextBoxes, pdfPageDimensions)
if (!disableOcr) {
val bitmap = jpeg.toBitmap()
val ocrTextBoxes = ocrService.runOcr(bitmap)
val pdfPageDimensions = PageDimensions(
bitmap.width,
bitmap.height,
widthPoints,
heightPoints
)
ocrDocument.addPage(page, ocrTextBoxes, pdfPageDimensions)
}
contentStream.close()
onProgress(index + 1)
@@ -77,15 +77,16 @@ class ExportViewModel(container: AppContainer, val imageRepository: ImageReposit
private suspend fun generatePdf(
exportQuality: ExportQuality,
disableOcr: Boolean,
onProgress: (Int) -> Unit,
): ExportResult.Pdf = withContext(Dispatchers.IO) {
val pageToExports = pagesToExport(imageRepository, exportQuality)
val pdf = fileManager.generatePdf(pageToExports, onProgress)
val pdf = fileManager.generatePdf(pageToExports, disableOcr, onProgress)
return@withContext ExportResult.Pdf(pdf.file, pdf.sizeInBytes, pdf.pageCount)
}
suspend fun generatePdfForExternalCall(): ExportResult.Pdf {
val pdf = generatePdf(ExportQuality.BALANCED) {}
val pdf = generatePdf(ExportQuality.BALANCED, true) {}
val sourceFile = pdf.file
val targetFile = File(sourceFile.parentFile, defaultFilename() + ".pdf")
if (sourceFile.absolutePath == targetFile.absolutePath) return pdf
@@ -175,7 +176,7 @@ class ExportViewModel(container: AppContainer, val imageRepository: ImageReposit
val result = if (exportFormat == ExportFormat.JPEG) {
generateJpegs(exportQuality, onProgress)
} else {
generatePdf(exportQuality, onProgress)
generatePdf(exportQuality, false, onProgress)
}
_uiState.update { it.copy(result = result) }
val t2 = System.currentTimeMillis()
@@ -29,7 +29,7 @@ class FileManagerTest {
val pdfDir: File = createTempDirectory().toFile()
val externalDir: File = createTempDirectory().toFile()
val dummyPdfWriter = PdfWriter { _,_,_ -> }
val dummyPdfWriter = PdfWriter { _,_,_,_ -> }
@Test
fun copyToExternalDir() {
@@ -78,6 +78,7 @@ class FileManagerTest {
override suspend fun writePdfFromJpegs(
pages: List<PageToExport>,
outputStream: OutputStream,
disableOcr: Boolean,
onProgress: (Int) -> Unit,
) {
val list = pages.toList()
@@ -87,7 +88,7 @@ class FileManagerTest {
val manager = FileManager(pdfDir, externalDir, fakePdfWriter)
val pages = listOf(byteArrayOf(0x01, 0x02), byteArrayOf(0x11))
.map { PageToExport(ScanPage("1", Rotation.R0, null, 1, null)) { Jpeg(it) } }
val pdf = manager.generatePdf(pages) {}
val pdf = manager.generatePdf(pages, true) {}
assertThat(pdf.pageCount).isEqualTo(2)
assertThat(pdf.sizeInBytes).isEqualTo(3)
assertThat(pdf.file.readBytes()).isEqualTo(byteArrayOf(0x01, 0x02, 0x11))