Fix page dimensions when a manual rotation is applied

This commit is contained in:
Pierre-Yves Nicolas
2026-05-24 16:30:07 +02:00
parent f18b65579e
commit 66f71927df
2 changed files with 9 additions and 6 deletions

View File

@@ -27,10 +27,11 @@ fun interface JpegProvider {
} }
data class PageToExport( data class PageToExport(
val metadata: PageMetadata?, val page: ScanPage,
val jpeg: JpegProvider, val jpeg: JpegProvider,
) { ) {
fun estimatedDimensions(): EstimatedDimensions? { fun estimatedDimensions(): EstimatedDimensions? {
val metadata = page.metadata
if (metadata == null) if (metadata == null)
return null return null
val size = metadata.sourceSize val size = metadata.sourceSize
@@ -40,7 +41,7 @@ data class PageToExport(
val realDimensions = estimateRealDimensions( val realDimensions = estimateRealDimensions(
quad, size.width.toInt(), size.height.toInt(), metadata.opticalMeasures quad, size.width.toInt(), size.height.toInt(), metadata.opticalMeasures
).snapToStandardFormat() ).snapToStandardFormat()
return realDimensions.applyRotation(metadata.baseRotation) return realDimensions.applyRotation(page.totalRotation())
} }
} }
@@ -60,11 +61,11 @@ suspend fun pagesToExport(
val pages = imageRepository.pages() val pages = imageRepository.pages()
return when (exportQuality) { return when (exportQuality) {
ExportQuality.BALANCED -> pages.map { ExportQuality.BALANCED -> pages.map {
PageToExport(it.metadata) { jpeg(it, imageRepository) } PageToExport(it) { jpeg(it, imageRepository) }
} }
ExportQuality.LOW -> pages.map { page -> ExportQuality.LOW -> pages.map { page ->
PageToExport(page.metadata) { PageToExport(page) {
resizeJpegBytesForMaxPixels( resizeJpegBytesForMaxPixels(
jpeg = jpeg(page, imageRepository), jpeg = jpeg(page, imageRepository),
maxPixels = exportQuality.maxPixels.toDouble(), maxPixels = exportQuality.maxPixels.toDouble(),
@@ -74,7 +75,7 @@ suspend fun pagesToExport(
} }
ExportQuality.HIGH -> pages.map { page -> ExportQuality.HIGH -> pages.map { page ->
PageToExport(page.metadata) { PageToExport(page) {
val source = imageRepository.source(page.id) val source = imageRepository.source(page.id)
val metadata = page.metadata val metadata = page.metadata
val colorMode = page.colorMode val colorMode = page.colorMode

View File

@@ -18,6 +18,8 @@ import kotlinx.coroutines.test.runTest
import org.assertj.core.api.Assertions.assertThat import org.assertj.core.api.Assertions.assertThat
import org.fairscan.app.domain.Jpeg import org.fairscan.app.domain.Jpeg
import org.fairscan.app.domain.PageToExport import org.fairscan.app.domain.PageToExport
import org.fairscan.app.domain.Rotation
import org.fairscan.app.domain.ScanPage
import org.junit.Test import org.junit.Test
import java.io.File import java.io.File
import java.io.OutputStream import java.io.OutputStream
@@ -81,7 +83,7 @@ class FileManagerTest {
} }
val manager = FileManager(pdfDir, externalDir, fakePdfWriter) val manager = FileManager(pdfDir, externalDir, fakePdfWriter)
val pages = listOf(byteArrayOf(0x01, 0x02), byteArrayOf(0x11)) val pages = listOf(byteArrayOf(0x01, 0x02), byteArrayOf(0x11))
.map { PageToExport(null) { Jpeg(it) } } .map { PageToExport(ScanPage("1", Rotation.R0, null, 1, null)) { Jpeg(it) } }
val pdf = manager.generatePdf(pages) val pdf = manager.generatePdf(pages)
assertThat(pdf.pageCount).isEqualTo(2) assertThat(pdf.pageCount).isEqualTo(2)
assertThat(pdf.sizeInBytes).isEqualTo(3) assertThat(pdf.sizeInBytes).isEqualTo(3)