修复拆分需要密码的文档,错误。

This commit is contained in:
ocean 2025-10-16 16:38:01 +08:00
parent 0cded6a58d
commit 0bc4a4fab2
3 changed files with 65 additions and 26 deletions

View File

@ -38,15 +38,20 @@ class PdfResultActivity : BaseActivity() {
private const val EXTRA_SELECTED_LIST = "extra_selected_list"
private const val EXTRA_FILE_LIST = "extra_file_list"
private const val EXTRA_SOURCE = "extra_source"
private const val EXTRA_PASSWORD = "extra_password"
private const val EXTRA_LOCK_UNLOCK_PASSWORD = "extra_lock_unlock_password"
private const val EXTRA_FILE_PATH = "extra_file_path"
private const val EXTRA_SPLIT_PASSWORD = "extra_split_password"
fun createIntentPdfSelectedPagesItem(
context: Context, list: ArrayList<PdfSelectedPagesItem>, source: PdfPickerSource
context: Context,
list: ArrayList<PdfSelectedPagesItem>,
source: PdfPickerSource,
password: String? = null
): Intent {
return Intent(context, PdfResultActivity::class.java).apply {
putParcelableArrayListExtra(EXTRA_SELECTED_LIST, list)
putExtra(EXTRA_SOURCE, source)
putExtra(EXTRA_SPLIT_PASSWORD, password)
}
}
@ -64,7 +69,7 @@ class PdfResultActivity : BaseActivity() {
): Intent {
return Intent(context, PdfResultActivity::class.java).apply {
putExtra(EXTRA_FILE_PATH, filepath)
putExtra(EXTRA_PASSWORD, password)
putExtra(EXTRA_LOCK_UNLOCK_PASSWORD, password)
putExtra(EXTRA_SOURCE, source)
}
}
@ -81,7 +86,7 @@ class PdfResultActivity : BaseActivity() {
private val pdfRepository = getRepository()
private lateinit var pdfScanner: PdfScanner
private lateinit var filepath: String
private lateinit var password: String
private lateinit var lockAndUnlockPassword: String
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@ -93,7 +98,7 @@ class PdfResultActivity : BaseActivity() {
selectedList = requireParcelableArrayList(EXTRA_SELECTED_LIST)
inputFile = requireStringArrayList(EXTRA_FILE_LIST)
filepath = intent.getStringExtra(EXTRA_FILE_PATH) ?: ""
password = intent.getStringExtra(EXTRA_PASSWORD) ?: ""
lockAndUnlockPassword = intent.getStringExtra(EXTRA_LOCK_UNLOCK_PASSWORD) ?: ""
source = getSerializableOrDefault(EXTRA_SOURCE, PdfPickerSource.NONE)
if (source == PdfPickerSource.NONE) {
showToast(getString(R.string.pdf_loading_failed))
@ -113,7 +118,7 @@ class PdfResultActivity : BaseActivity() {
return
}
} else if (source == PdfPickerSource.LOCK || source == PdfPickerSource.UNLOCK) {
if (filepath.isEmpty() || password.isEmpty()) {
if (filepath.isEmpty() || lockAndUnlockPassword.isEmpty()) {
showToast(getString(R.string.pdf_loading_failed))
finish()
return
@ -139,6 +144,7 @@ class PdfResultActivity : BaseActivity() {
binding.processingLayout.visibility = View.VISIBLE
}
if (source == PdfPickerSource.SPLIT) {
val splitPassword = intent.getStringExtra(EXTRA_SPLIT_PASSWORD) ?: ""
binding.progressBar.isIndeterminate = false
binding.progressBar.progress = 0
binding.progressBar.max = 100
@ -166,7 +172,8 @@ class PdfResultActivity : BaseActivity() {
binding.progressTv.text = "$percent"
binding.progressBar.progress = percent
}
})?.let { resultFile ->
}, splitPassword
)?.let { resultFile ->
val thumbnails = generateFastThumbnail(this@PdfResultActivity, resultFile)
val result = PdfSplitResultItem(resultFile.absolutePath, thumbnails, false)
pdfScanner.addNewPdfToDatabase(result.filePath, result.thumbnailPath) {
@ -208,7 +215,7 @@ class PdfResultActivity : BaseActivity() {
} else if (source == PdfPickerSource.LOCK) {
binding.congratulationsDesc.text = getString(R.string.set_password_successfully)
PdfSecurityUtils.setPasswordToPdfWithProgress(
filepath, password, password
filepath, lockAndUnlockPassword, lockAndUnlockPassword
) { progress ->
binding.progressTv.text = "$progress"
}.let { it ->
@ -220,7 +227,7 @@ class PdfResultActivity : BaseActivity() {
}
} else if (source == PdfPickerSource.UNLOCK) {
binding.congratulationsDesc.text = getString(R.string.remove_password_successfully)
PdfSecurityUtils.removePasswordFromPdfWithProgress(filepath, password) { progress ->
PdfSecurityUtils.removePasswordFromPdfWithProgress(filepath, lockAndUnlockPassword) { progress ->
binding.progressTv.text = "$progress"
}?.let { it ->
val result = PdfSplitResultItem(

View File

@ -34,6 +34,7 @@ class SplitPdfActivity : BaseActivity() {
private var currentViewState: ViewState = ViewState.SPLIT_LIST
var currentPassword : String? = null//拆分只会选择一个文件。直接进行密码传递
private enum class ViewState {
SPLIT_LIST, // 拆分页列表
@ -143,7 +144,8 @@ class SplitPdfActivity : BaseActivity() {
val intent = PdfResultActivity.createIntentPdfSelectedPagesItem(
this,
ArrayList(selectedList),
PdfPickerSource.SPLIT
PdfPickerSource.SPLIT,
password = currentPassword
)
startActivity(intent)
finish()
@ -169,6 +171,9 @@ class SplitPdfActivity : BaseActivity() {
}
private fun initSplitDataWithPassword(file: File, password: String? = null) {
if(!password.isNullOrEmpty()){
currentPassword = password
}
lifecycleScope.launch {
splitList.clear()
// 先切换到 IO 线程执行删除,等待完成

View File

@ -119,7 +119,8 @@ object PdfUtils {
selectedPages: List<PdfPageItem>,
outputDir: File,
outputFileName: String,
onProgress: ((current: Int, total: Int) -> Unit)? = null
onProgress: ((current: Int, total: Int) -> Unit)? = null,
splitPassword: String? = null
): File? = withContext(Dispatchers.IO) {
// 如果没有选中的页,直接返回 null
@ -127,6 +128,7 @@ object PdfUtils {
if (!outputDir.exists()) outputDir.mkdirs()
val outputFile = File(outputDir, outputFileName)
try {
if (splitPassword.isNullOrEmpty()) {
PDDocument.load(inputFile, MemoryUsageSetting.setupTempFileOnly()).use { document ->
PDDocument().use { newDocument ->
// 按页索引排序,保证顺序正确
@ -143,6 +145,25 @@ object PdfUtils {
newDocument.save(outputFile)
}
}
} else {
PDDocument.load(inputFile, splitPassword, MemoryUsageSetting.setupTempFileOnly())
.use { document ->
PDDocument().use { newDocument ->
// 按页索引排序,保证顺序正确
val sortedPages = selectedPages.sortedBy { it.pageIndex }
val total = sortedPages.size//总数
sortedPages.forEachIndexed { index, pageItem ->
// 导入原文档的页面到新文档
newDocument.importPage(document.getPage(pageItem.pageIndex))
// 回调进度
onProgress?.invoke(index + 1, total)
delay(1)
}
// 保存新 PDF 文件
newDocument.save(outputFile)
}
}
}
outputFile
} catch (e: Exception) {
e.printStackTrace()
@ -273,7 +294,13 @@ object PdfUtils {
val pdImage = JPEGFactory.createFromImage(document, bitmap)
PDPageContentStream(document, page).use { contentStream ->
contentStream.drawImage(pdImage, offsetX, offsetY, targetWidth, targetHeight)
contentStream.drawImage(
pdImage,
offsetX,
offsetY,
targetWidth,
targetHeight
)
}
bitmap.recycle()