Commit 158488da authored by wanglei's avatar wanglei

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

parent 5be40c4b
......@@ -15,6 +15,7 @@ android {
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
setProperty("archivesBaseName", "PDF-v${versionName}")
}
buildTypes {
......@@ -61,11 +62,14 @@ dependencies {
//XLS表格
implementation("com.github.huangyanbin:SmartTable:2.2.0")
//https://blog.csdn.net/guoxiaolongonly/article/details/76992138
//pdf浏览
//https://github.com/DImuthuUpe/AndroidPdfViewer
implementation("com.github.barteksc:android-pdf-viewer:2.8.2")
//pdf文件操作
//pdf文件操作,AndroidPdfViewer依赖于它
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 内容提取
//有个问题是gradle版本需要升级到8.4
......
......@@ -24,6 +24,7 @@ class ImageSelectionActivity : BaseActivity<ActivityImageSelectionBinding>() {
private lateinit var imageSelectionAdapter: ImageSelectionAdapter
private lateinit var selectedAdapter: ImageSelectionAdapter
private var add: String = ""
override val binding: ActivityImageSelectionBinding by lazy {
ActivityImageSelectionBinding.inflate(layoutInflater)
......@@ -32,7 +33,7 @@ class ImageSelectionActivity : BaseActivity<ActivityImageSelectionBinding>() {
override fun initView() {
BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
add = intent.extras?.getString("Add", "") ?: ""
imageSelectionAdapter = ImageSelectionAdapter(UI_IMAGE_GRID, select = { imageBean ->
imageSelectAction(imageBean)
......@@ -79,12 +80,21 @@ class ImageSelectionActivity : BaseActivity<ActivityImageSelectionBinding>() {
finishToMain()
}
binding.tvImport.setOnClickListener {
if (add == "") {
startActivity(Intent(this@ImageSelectionActivity, ImageToPdfActivity::class.java)
.apply {
val pathList = selectedAdapter.getSelectBean().map { it.path }
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
import android.content.Intent
import android.graphics.Color
import androidx.activity.addCallback
import com.base.superpdfreader.adapter.ImageDragAdapter
......@@ -41,11 +42,24 @@ class ImageToPdfActivity : BaseActivity<ActivityImageDragBinding>() {
finish()
}
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 {
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
import android.animation.AnimatorListenerAdapter
import android.animation.ValueAnimator
import android.annotation.SuppressLint
import android.graphics.Color
import android.view.View
import androidx.activity.addCallback
import androidx.core.animation.addListener
import androidx.lifecycle.lifecycleScope
import com.base.superpdfreader.databinding.ActivityPdfBrowserBinding
import com.base.superpdfreader.helps.BaseActivity
import com.base.superpdfreader.helps.LogEx
import com.base.superpdfreader.utils.BarUtils
import com.github.barteksc.pdfviewer.scroll.DefaultScrollHandle
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
......@@ -28,10 +31,11 @@ class PdfBrowserActivity : BaseActivity<ActivityPdfBrowserBinding>() {
ActivityPdfBrowserBinding.inflate(layoutInflater)
}
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)
if (file.exists()) {
binding.pdfview.fromFile(file)
......@@ -49,6 +53,14 @@ class PdfBrowserActivity : BaseActivity<ActivityPdfBrowserBinding>() {
binding.pdfview.setOnClickListener {
toggleTools()
}
binding.flBack.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
onBackPressedDispatcher.addCallback {
finishToMain()
}
}
......
package com.base.superpdfreader.activity
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import android.content.Intent
import android.os.Environment
import android.util.Log
import androidx.lifecycle.lifecycleScope
import com.base.superpdfreader.R
import com.base.superpdfreader.bean.PdfParameterBean
import com.base.superpdfreader.databinding.ActivityPdfConvertedBinding
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>() {
private val TAG = "PdfConvertedActivity"
override val binding: ActivityPdfConvertedBinding by lazy {
ActivityPdfConvertedBinding.inflate(layoutInflater)
}
private var pdfParameterBean: PdfParameterBean? = null
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>() {
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.addAll(data)
notifyDataSetChanged()
}
......
package com.base.superpdfreader.bean
data class ImageBean(
val path: String? = null
val path: String = ""
) {
var isCamera: Boolean = false
var isSelect: Boolean = false
......
package com.base.superpdfreader.bean
data class PdfParameterBean(
var pdfName: String = "",
var orientation: Int = 0,
var pageSize: Int = 1,
var margin: Int = 0,
var compression: Int = 0,
var pathArray: Array<String> = arrayOf(),
var password: String? = null
) {
companion object {
val arrayOrientation = arrayOf("Portrait", "Landscape")
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 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
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 {
var suffix = "B"
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
import android.content.Intent
import android.net.Uri
import android.view.LayoutInflater
import android.widget.Toast
import com.base.superpdfreader.R
import com.base.superpdfreader.activity.DocBrowserActivity
import com.base.superpdfreader.activity.PdfBrowserActivity
......@@ -103,13 +104,21 @@ object DocumentDetailDialog {
binding.llEmail.setOnClickListener {
dialog.dismiss()
val emailIntent = Intent(Intent.ACTION_SEND).apply {
setType("plain/text");
// 附加文件
putExtra(Intent.EXTRA_STREAM, bean.uri)
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
}
val chooser: Intent = Intent.createChooser(emailIntent, "select email app")
// 检查是否有可以处理此Intent的应用
if (emailIntent.resolveActivity(packageManager) != null) {
startActivity(emailIntent)
startActivity(chooser)
} else {
Toast.makeText(this, "No mail application found", Toast.LENGTH_SHORT).show()
}
}
binding.llCopy.setOnClickListener {
......
......@@ -17,7 +17,7 @@ object PDFOperationDialog {
binding.llImagePdf.setOnClickListener {
startActivity(Intent(this, ImageSelectionActivity::class.java))
dialog.show()
dialog.dismiss()
}
}
}
\ No newline at end of file
......@@ -28,11 +28,13 @@ object PDFSaveDialog {
dialog.setCanceledOnTouchOutside(true)
dialog.show()
val pdfParameterBean = PdfParameterBean()
val appName = resources.getString(R.string.app_name)
val pdfName = appName + " " + SimpleDateFormat("yyyyMMdd HH.mm.ss").format(System.currentTimeMillis())
binding.editName.setText(pdfName)
pdfParameterBean.pdfName = pdfName
val pdfParameterBean = PdfParameterBean()
binding.tvOrientation.text = arrayOrientation[0]
binding.tvPageSize.text = arrayPageSize[1]
binding.tvMargin.text = arrayMargin[0]
......
......@@ -7,20 +7,47 @@
android:layout_height="match_parent"
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
android:id="@+id/pdfview"
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
android:id="@+id/ll_tools"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
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">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/fanhui"
tools:ignore="ContentDescription" />
</FrameLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
......
[versions]
agp = "8.3.1"
kotlin = "1.8.0"
coreKtx = "1.8.1"
coreKtx = "1.8.0"
junit = "4.13.2"
junitVersion = "1.1.5"
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