/*
* Nextcloud Android client application
*
* @author Álvaro Brey
* Copyright (C) 2023 Álvaro Brey
* Copyright (C) 2023 Nextcloud GmbH
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this program. If not, see .
*
*/
package com.nextcloud.client.documentscan
import android.graphics.BitmapFactory
import android.graphics.pdf.PdfDocument
import com.nextcloud.client.logger.Logger
import java.io.FileOutputStream
import java.io.IOException
import javax.inject.Inject
/**
* This class takes a list of images and generates a PDF file.
*/
class GeneratePDFUseCase @Inject constructor(private val logger: Logger) {
/**
* @param imagePaths list of image paths
* @return `true` if the PDF was generated successfully, `false` otherwise
*/
fun execute(imagePaths: List, filePath: String): Boolean {
return if (imagePaths.isEmpty() || filePath.isBlank()) {
logger.w(TAG, "Invalid parameters: imagePaths: $imagePaths, filePath: $filePath")
false
} else {
val document = PdfDocument()
fillDocumentPages(document, imagePaths)
writePdfToFile(filePath, document)
}
}
/**
* @return `true` if the PDF was generated successfully, `false` otherwise
*/
private fun writePdfToFile(
filePath: String,
document: PdfDocument
): Boolean {
return try {
val fileOutputStream = FileOutputStream(filePath)
document.writeTo(fileOutputStream)
fileOutputStream.close()
document.close()
true
} catch (ex: IOException) {
logger.e(TAG, "Error generating PDF", ex)
false
}
}
private fun fillDocumentPages(
document: PdfDocument,
imagePaths: List
) {
imagePaths.forEach { path ->
val bitmap = BitmapFactory.decodeFile(path)
val pageInfo = PdfDocument.PageInfo.Builder(bitmap.width, bitmap.height, 1).create()
val page = document.startPage(pageInfo)
page.canvas.drawBitmap(bitmap, 0f, 0f, null)
document.finishPage(page)
}
}
companion object {
private const val TAG = "GeneratePDFUseCase"
}
}