Disable OCR on external call
This commit is contained in:
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user