Commit 158488da authored by wanglei's avatar wanglei

...提交部分功能...

parent 5be40c4b
...@@ -15,6 +15,7 @@ android { ...@@ -15,6 +15,7 @@ android {
versionName "1.0" versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
setProperty("archivesBaseName", "PDF-v${versionName}")
} }
buildTypes { buildTypes {
...@@ -61,11 +62,14 @@ dependencies { ...@@ -61,11 +62,14 @@ dependencies {
//XLS表格 //XLS表格
implementation("com.github.huangyanbin:SmartTable:2.2.0") implementation("com.github.huangyanbin:SmartTable:2.2.0")
//https://blog.csdn.net/guoxiaolongonly/article/details/76992138
//pdf浏览 //pdf浏览
//https://github.com/DImuthuUpe/AndroidPdfViewer //https://github.com/DImuthuUpe/AndroidPdfViewer
implementation("com.github.barteksc:android-pdf-viewer:2.8.2") implementation("com.github.barteksc:android-pdf-viewer:2.8.2")
//pdf文件操作 //pdf文件操作,AndroidPdfViewer依赖于它
implementation("com.github.barteksc:pdfium-android:1.7.1") implementation("com.github.barteksc:pdfium-android:1.7.1")
//https://github.com/TomRoush/PdfBox-Android
implementation("com.tom-roush:pdfbox-android:2.0.27.0")
//apache / poi 内容提取 //apache / poi 内容提取
//有个问题是gradle版本需要升级到8.4 //有个问题是gradle版本需要升级到8.4
......
...@@ -24,6 +24,7 @@ class ImageSelectionActivity : BaseActivity<ActivityImageSelectionBinding>() { ...@@ -24,6 +24,7 @@ class ImageSelectionActivity : BaseActivity<ActivityImageSelectionBinding>() {
private lateinit var imageSelectionAdapter: ImageSelectionAdapter private lateinit var imageSelectionAdapter: ImageSelectionAdapter
private lateinit var selectedAdapter: ImageSelectionAdapter private lateinit var selectedAdapter: ImageSelectionAdapter
private var add: String = ""
override val binding: ActivityImageSelectionBinding by lazy { override val binding: ActivityImageSelectionBinding by lazy {
ActivityImageSelectionBinding.inflate(layoutInflater) ActivityImageSelectionBinding.inflate(layoutInflater)
...@@ -32,7 +33,7 @@ class ImageSelectionActivity : BaseActivity<ActivityImageSelectionBinding>() { ...@@ -32,7 +33,7 @@ class ImageSelectionActivity : BaseActivity<ActivityImageSelectionBinding>() {
override fun initView() { override fun initView() {
BarUtils.setStatusBarLightMode(this, true) BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT) BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
add = intent.extras?.getString("Add", "") ?: ""
imageSelectionAdapter = ImageSelectionAdapter(UI_IMAGE_GRID, select = { imageBean -> imageSelectionAdapter = ImageSelectionAdapter(UI_IMAGE_GRID, select = { imageBean ->
imageSelectAction(imageBean) imageSelectAction(imageBean)
...@@ -79,12 +80,21 @@ class ImageSelectionActivity : BaseActivity<ActivityImageSelectionBinding>() { ...@@ -79,12 +80,21 @@ class ImageSelectionActivity : BaseActivity<ActivityImageSelectionBinding>() {
finishToMain() finishToMain()
} }
binding.tvImport.setOnClickListener { binding.tvImport.setOnClickListener {
if (add == "") {
startActivity(Intent(this@ImageSelectionActivity, ImageToPdfActivity::class.java) startActivity(Intent(this@ImageSelectionActivity, ImageToPdfActivity::class.java)
.apply { .apply {
val pathList = selectedAdapter.getSelectBean().map { it.path } val pathList = selectedAdapter.getSelectBean().map { it.path }
putExtra("PathList", pathList.toTypedArray()) putExtra("PathList", pathList.toTypedArray())
} }
) )
} else {
setResult(0, Intent().apply {
val pathList = selectedAdapter.getSelectBean().map { it.path }
putExtra("PathList", pathList.toTypedArray())
})
finish()
}
} }
} }
......
package com.base.superpdfreader.activity package com.base.superpdfreader.activity
import android.content.Intent
import android.graphics.Color import android.graphics.Color
import androidx.activity.addCallback import androidx.activity.addCallback
import com.base.superpdfreader.adapter.ImageDragAdapter import com.base.superpdfreader.adapter.ImageDragAdapter
...@@ -41,11 +42,24 @@ class ImageToPdfActivity : BaseActivity<ActivityImageDragBinding>() { ...@@ -41,11 +42,24 @@ class ImageToPdfActivity : BaseActivity<ActivityImageDragBinding>() {
finish() finish()
} }
binding.ivAdd.setOnClickListener { binding.ivAdd.setOnClickListener {
onBackPressedDispatcher.onBackPressed() val intent = Intent(this, ImageSelectionActivity::class.java).apply {
putExtra("Add", "Add")
}
launcher.launch(intent) { result ->
val array = result.data?.getStringArrayExtra("PathList") ?: arrayOf()
val dataList = arrayListOf<ImageBean>().apply {
addAll(array.map { ImageBean(it) })
}
imageDragAdapter.setData(dataList, false)
}
} }
binding.tvConvert.setOnClickListener { binding.tvConvert.setOnClickListener {
showPDFSaveDialog { showPDFSaveDialog { pdfParameterBean ->
startActivity(Intent(this, PdfConvertedActivity::class.java).apply {
pdfParameterBean.pathArray = pathList.map { it.path }.toTypedArray()
putExtra("Parameter", Gson().toJson(pdfParameterBean))
})
finish()
} }
} }
} }
......
...@@ -4,12 +4,15 @@ import android.animation.Animator ...@@ -4,12 +4,15 @@ import android.animation.Animator
import android.animation.AnimatorListenerAdapter import android.animation.AnimatorListenerAdapter
import android.animation.ValueAnimator import android.animation.ValueAnimator
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.graphics.Color
import android.view.View import android.view.View
import androidx.activity.addCallback
import androidx.core.animation.addListener import androidx.core.animation.addListener
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.base.superpdfreader.databinding.ActivityPdfBrowserBinding import com.base.superpdfreader.databinding.ActivityPdfBrowserBinding
import com.base.superpdfreader.helps.BaseActivity import com.base.superpdfreader.helps.BaseActivity
import com.base.superpdfreader.helps.LogEx import com.base.superpdfreader.helps.LogEx
import com.base.superpdfreader.utils.BarUtils
import com.github.barteksc.pdfviewer.scroll.DefaultScrollHandle import com.github.barteksc.pdfviewer.scroll.DefaultScrollHandle
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
...@@ -28,10 +31,11 @@ class PdfBrowserActivity : BaseActivity<ActivityPdfBrowserBinding>() { ...@@ -28,10 +31,11 @@ class PdfBrowserActivity : BaseActivity<ActivityPdfBrowserBinding>() {
ActivityPdfBrowserBinding.inflate(layoutInflater) ActivityPdfBrowserBinding.inflate(layoutInflater)
} }
override fun initView() { override fun initView() {
val path = intent.extras?.getString("Path") ?: "" BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
val path = intent.extras?.getString("Path") ?: ""
val file = File(path) val file = File(path)
if (file.exists()) { if (file.exists()) {
binding.pdfview.fromFile(file) binding.pdfview.fromFile(file)
...@@ -49,6 +53,14 @@ class PdfBrowserActivity : BaseActivity<ActivityPdfBrowserBinding>() { ...@@ -49,6 +53,14 @@ class PdfBrowserActivity : BaseActivity<ActivityPdfBrowserBinding>() {
binding.pdfview.setOnClickListener { binding.pdfview.setOnClickListener {
toggleTools() toggleTools()
} }
binding.flBack.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
onBackPressedDispatcher.addCallback {
finishToMain()
}
} }
......
package com.base.superpdfreader.activity package com.base.superpdfreader.activity
import android.os.Bundle import android.content.Intent
import androidx.activity.enableEdgeToEdge import android.os.Environment
import androidx.appcompat.app.AppCompatActivity import android.util.Log
import androidx.core.view.ViewCompat import androidx.lifecycle.lifecycleScope
import androidx.core.view.WindowInsetsCompat
import com.base.superpdfreader.R import com.base.superpdfreader.R
import com.base.superpdfreader.bean.PdfParameterBean
import com.base.superpdfreader.databinding.ActivityPdfConvertedBinding import com.base.superpdfreader.databinding.ActivityPdfConvertedBinding
import com.base.superpdfreader.helps.BaseActivity import com.base.superpdfreader.helps.BaseActivity
import com.base.superpdfreader.helps.LogEx
import com.base.superpdfreader.helps.pdf.PdfHelp.convertImagesToPdf
import com.google.gson.Gson
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.io.File
class PdfConvertedActivity : BaseActivity<ActivityPdfConvertedBinding>() { class PdfConvertedActivity : BaseActivity<ActivityPdfConvertedBinding>() {
private val TAG = "PdfConvertedActivity"
override val binding: ActivityPdfConvertedBinding by lazy { override val binding: ActivityPdfConvertedBinding by lazy {
ActivityPdfConvertedBinding.inflate(layoutInflater) ActivityPdfConvertedBinding.inflate(layoutInflater)
} }
private var pdfParameterBean: PdfParameterBean? = null
override fun initView() { override fun initView() {
val json = intent.extras?.getString("Parameter") ?: ""
pdfParameterBean = Gson().fromJson(json, PdfParameterBean::class.java)
LogEx.logDebug(TAG, "pdfParameterBean=$pdfParameterBean")
convertPdf()
} }
fun convertPdf() = lifecycleScope.launch(Dispatchers.IO) {
var path = ""
pdfParameterBean?.let {
val document = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS)
val appName = resources.getString(R.string.app_name)
val dir = File(document, appName)
if (!dir.exists()) {
dir.mkdirs()
}
val pdfPath = File(dir, it.pdfName + ".pdf")
path = pdfPath.absolutePath
convertImagesToPdf(it, path)
}
launch(Dispatchers.Main) {
startActivity(Intent(this@PdfConvertedActivity, PdfBrowserActivity::class.java).apply {
putExtra("Path", path)
})
finish()
}
}
} }
\ No newline at end of file
...@@ -32,8 +32,10 @@ class ImageDragAdapter : RecyclerView.Adapter<ImageDragAdapter.AAA>() { ...@@ -32,8 +32,10 @@ class ImageDragAdapter : RecyclerView.Adapter<ImageDragAdapter.AAA>() {
Glide.with(context).load(bean.path).centerCrop().into(binding.iv) Glide.with(context).load(bean.path).centerCrop().into(binding.iv)
} }
fun setData(data: List<ImageBean>) { fun setData(data: List<ImageBean>, isClean: Boolean = true) {
if (isClean) {
beanList.clear() beanList.clear()
}
beanList.addAll(data) beanList.addAll(data)
notifyDataSetChanged() notifyDataSetChanged()
} }
......
package com.base.superpdfreader.bean package com.base.superpdfreader.bean
data class ImageBean( data class ImageBean(
val path: String? = null val path: String = ""
) { ) {
var isCamera: Boolean = false var isCamera: Boolean = false
var isSelect: Boolean = false var isSelect: Boolean = false
......
package com.base.superpdfreader.bean package com.base.superpdfreader.bean
data class PdfParameterBean( data class PdfParameterBean(
var pdfName: String = "",
var orientation: Int = 0, var orientation: Int = 0,
var pageSize: Int = 1, var pageSize: Int = 1,
var margin: Int = 0, var margin: Int = 0,
var compression: Int = 0, var compression: Int = 0,
var pathArray: Array<String> = arrayOf(),
var password: String? = null var password: String? = null
) { ) {
companion object { companion object {
val arrayOrientation = arrayOf("Portrait", "Landscape") val arrayOrientation = arrayOf("Portrait", "Landscape")
val arrayPageSize = arrayOf("Fit(Sample page size as image)", "A4 (297x210 mm)", "Use Letter(215x279.4 mm)") val arrayPageSize = arrayOf("Fit(Sample page size as image)", "A4 (297x210 mm)", "Use Letter(215x279.4 mm)")
val arrayMargin = arrayOf("No margin", "Small", "Big") val arrayMargin = arrayOf("No margin", "Small", "Big")
val arrayCompression = arrayOf("Low", "Medium", "High") val arrayCompression = arrayOf("Low", "Medium", "High")
} }
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as PdfParameterBean
if (orientation != other.orientation) return false
if (pageSize != other.pageSize) return false
if (margin != other.margin) return false
if (compression != other.compression) return false
if (!pathArray.contentEquals(other.pathArray)) return false
if (password != other.password) return false
return true
}
override fun hashCode(): Int {
var result = orientation
result = 31 * result + pageSize
result = 31 * result + margin
result = 31 * result + compression
result = 31 * result + pathArray.contentHashCode()
result = 31 * result + (password?.hashCode() ?: 0)
return result
}
} }
...@@ -7,30 +7,6 @@ import java.util.Locale ...@@ -7,30 +7,6 @@ import java.util.Locale
object KotlinExt { object KotlinExt {
private val aesMap = mutableMapOf<Int, String>()
fun View.setTrackedOnClickListener(action: (view: View) -> Unit) {
setOnClickListener {
action(this)
var view: View? = this
while (view != null) {
try {
val obj = JSONObject()
obj.put("view_id", resources.getResourceEntryName(view.id))
// EventHelper.event("click_id", ext = obj)
break
} catch (_: Exception) {
view = view.parent as? View
}
}
}
}
fun Number.toFormatSize(count: Int = 1): String { fun Number.toFormatSize(count: Int = 1): String {
var suffix = "B" var suffix = "B"
var fSize = this.toDouble() var fSize = this.toDouble()
......
package com.base.superpdfreader.helps.pdf
import com.base.superpdfreader.bean.PdfParameterBean
import com.base.superpdfreader.helps.LogEx
import com.tom_roush.pdfbox.pdmodel.PDDocument
import com.tom_roush.pdfbox.pdmodel.PDPage
import com.tom_roush.pdfbox.pdmodel.PDPageContentStream
import com.tom_roush.pdfbox.pdmodel.common.PDRectangle
import com.tom_roush.pdfbox.pdmodel.graphics.image.PDImageXObject
import java.io.File
import java.io.IOException
object PdfHelp {
private val TAG = "PdfHelp"
fun convertImagesToPdf(imagePath: PdfParameterBean, pdfPath: String) {
try {
PDDocument().use { document ->
imagePath.pathArray.forEach { imagePath ->
val page = PDPage(PDRectangle.A4) // 创建一个 A4 大小的页面
document.addPage(page)
val pdImage = PDImageXObject.createFromFileByExtension(File(imagePath), document)
val pageSize = page.mediaBox
var x = 0f
var y = 0f
var scaledWidth = 0f
var scaledHeight = 0f
var needScale = false
if (pdImage.width > pageSize.width || pdImage.height > pageSize.height) {
// val scaleX = PDRectangle.A4.width / imageWidth
// val scaleY = PDRectangle.A4.height / imageHeight
needScale = true
val scaleX = pageSize.width / pdImage.width
val scaleY = pageSize.height / pdImage.height
val scale = minOf(scaleX, scaleY)
scaledWidth = pdImage.width * scale
scaledHeight = pdImage.height * scale
LogEx.logDebug(TAG, "======================scale=$scale=================")
x = (pageSize.width - scaledWidth) / 2f
y = (pageSize.height - scaledHeight) / 2f
} else {
x = (pageSize.width - pdImage.width) / 2f
y = (pageSize.height - pdImage.height) / 2f
}
LogEx.logDebug(TAG, "x=$x y=$y")
LogEx.logDebug(TAG, "pageSize.width=${pageSize.width}")
LogEx.logDebug(TAG, "pageSize.height=${pageSize.height}")
LogEx.logDebug(TAG, "pdImage.width=${pdImage.width}")
LogEx.logDebug(TAG, "pdImage.height=${pdImage.height}")
LogEx.logDebug(TAG, "scaledWidth=${scaledWidth}")
LogEx.logDebug(TAG, "scaledHeight=${scaledHeight}")
PDPageContentStream(document, page).use { contentStream ->
if (needScale) {
contentStream.drawImage(pdImage, x, y, scaledWidth, scaledHeight)
} else {
contentStream.drawImage(pdImage, x, y)
}
}
}
document.save(pdfPath) // 保存 PDF
}
} catch (e: IOException) {
e.printStackTrace()
}
}
}
\ No newline at end of file
...@@ -6,6 +6,7 @@ import android.content.Context ...@@ -6,6 +6,7 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import android.view.LayoutInflater import android.view.LayoutInflater
import android.widget.Toast
import com.base.superpdfreader.R import com.base.superpdfreader.R
import com.base.superpdfreader.activity.DocBrowserActivity import com.base.superpdfreader.activity.DocBrowserActivity
import com.base.superpdfreader.activity.PdfBrowserActivity import com.base.superpdfreader.activity.PdfBrowserActivity
...@@ -103,13 +104,21 @@ object DocumentDetailDialog { ...@@ -103,13 +104,21 @@ object DocumentDetailDialog {
binding.llEmail.setOnClickListener { binding.llEmail.setOnClickListener {
dialog.dismiss() dialog.dismiss()
val emailIntent = Intent(Intent.ACTION_SEND).apply { val emailIntent = Intent(Intent.ACTION_SEND).apply {
setType("plain/text");
// 附加文件 // 附加文件
putExtra(Intent.EXTRA_STREAM, bean.uri) putExtra(Intent.EXTRA_STREAM, bean.uri)
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
} }
val chooser: Intent = Intent.createChooser(emailIntent, "select email app")
// 检查是否有可以处理此Intent的应用 // 检查是否有可以处理此Intent的应用
if (emailIntent.resolveActivity(packageManager) != null) { if (emailIntent.resolveActivity(packageManager) != null) {
startActivity(emailIntent) startActivity(chooser)
} else {
Toast.makeText(this, "No mail application found", Toast.LENGTH_SHORT).show()
} }
} }
binding.llCopy.setOnClickListener { binding.llCopy.setOnClickListener {
......
...@@ -17,7 +17,7 @@ object PDFOperationDialog { ...@@ -17,7 +17,7 @@ object PDFOperationDialog {
binding.llImagePdf.setOnClickListener { binding.llImagePdf.setOnClickListener {
startActivity(Intent(this, ImageSelectionActivity::class.java)) startActivity(Intent(this, ImageSelectionActivity::class.java))
dialog.show() dialog.dismiss()
} }
} }
} }
\ No newline at end of file
...@@ -28,11 +28,13 @@ object PDFSaveDialog { ...@@ -28,11 +28,13 @@ object PDFSaveDialog {
dialog.setCanceledOnTouchOutside(true) dialog.setCanceledOnTouchOutside(true)
dialog.show() dialog.show()
val pdfParameterBean = PdfParameterBean()
val appName = resources.getString(R.string.app_name) val appName = resources.getString(R.string.app_name)
val pdfName = appName + " " + SimpleDateFormat("yyyyMMdd HH.mm.ss").format(System.currentTimeMillis()) val pdfName = appName + " " + SimpleDateFormat("yyyyMMdd HH.mm.ss").format(System.currentTimeMillis())
binding.editName.setText(pdfName) binding.editName.setText(pdfName)
pdfParameterBean.pdfName = pdfName
val pdfParameterBean = PdfParameterBean()
binding.tvOrientation.text = arrayOrientation[0] binding.tvOrientation.text = arrayOrientation[0]
binding.tvPageSize.text = arrayPageSize[1] binding.tvPageSize.text = arrayPageSize[1]
binding.tvMargin.text = arrayMargin[0] binding.tvMargin.text = arrayMargin[0]
......
...@@ -7,20 +7,47 @@ ...@@ -7,20 +7,47 @@
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".activity.PdfBrowserActivity"> tools:context=".activity.PdfBrowserActivity">
<View
android:id="@+id/v_top"
android:layout_width="match_parent"
android:layout_height="40dp"
app:layout_constraintTop_toTopOf="parent" />
<com.github.barteksc.pdfviewer.PDFView <com.github.barteksc.pdfviewer.PDFView
android:id="@+id/pdfview" android:id="@+id/pdfview"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" /> android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/v_top" />
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/ll_tools" android:id="@+id/ll_tools"
android:visibility="gone"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@color/white" android:background="@color/white"
android:visibility="gone" app:layout_constraintTop_toTopOf="@id/pdfview">
<FrameLayout
android:id="@+id/fl_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:padding="10dp"
android:src="@mipmap/fanhui"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/fanhui"
tools:ignore="ContentDescription" />
</FrameLayout>
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
......
[versions] [versions]
agp = "8.3.1" agp = "8.3.1"
kotlin = "1.8.0" kotlin = "1.8.0"
coreKtx = "1.8.1" coreKtx = "1.8.0"
junit = "4.13.2" junit = "4.13.2"
junitVersion = "1.1.5" junitVersion = "1.1.5"
espressoCore = "3.5.1" espressoCore = "3.5.1"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment