Commit aa1326d8 authored by wanglei's avatar wanglei

...

parent bfddd66a
package com.base.scanqrclear.ui.exportpdf package com.base.scanqrclear.ui.exportpdf
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Intent
import android.graphics.Bitmap
import android.net.Uri
import android.view.Gravity import android.view.Gravity
import android.widget.LinearLayout import android.widget.LinearLayout
import androidx.activity.addCallback import androidx.activity.addCallback
...@@ -12,9 +15,14 @@ import com.base.scanqrclear.bean.FunctionUIBean.Companion.KEY_PRODUCT ...@@ -12,9 +15,14 @@ import com.base.scanqrclear.bean.FunctionUIBean.Companion.KEY_PRODUCT
import com.base.scanqrclear.bean.FunctionUIBean.Companion.KEY_TEXT import com.base.scanqrclear.bean.FunctionUIBean.Companion.KEY_TEXT
import com.base.scanqrclear.databinding.ActivityExportPdfBinding import com.base.scanqrclear.databinding.ActivityExportPdfBinding
import com.base.scanqrclear.utils.BarUtils import com.base.scanqrclear.utils.BarUtils
import com.base.scanqrclear.utils.ExportPdf.generatePdfWithTextAndImage
import com.base.scanqrclear.utils.LogEx
import com.base.scanqrclear.utils.QRCodeUtils import com.base.scanqrclear.utils.QRCodeUtils
import com.base.scanqrclear.utils.QRCodeUtils.generateQRCode import com.base.scanqrclear.utils.QRCodeUtils.generateQRCode
import com.base.scanqrclear.utils.ToastUtils.toast
import com.gyf.immersionbar.ktx.immersionBar import com.gyf.immersionbar.ktx.immersionBar
import java.io.File
import java.io.FileInputStream
class ExportPdfActivity : BaseActivity<ActivityExportPdfBinding>(ActivityExportPdfBinding::inflate) { class ExportPdfActivity : BaseActivity<ActivityExportPdfBinding>(ActivityExportPdfBinding::inflate) {
...@@ -22,6 +30,9 @@ class ExportPdfActivity : BaseActivity<ActivityExportPdfBinding>(ActivityExportP ...@@ -22,6 +30,9 @@ class ExportPdfActivity : BaseActivity<ActivityExportPdfBinding>(ActivityExportP
private var qrType: String = KEY_TEXT private var qrType: String = KEY_TEXT
private var qrString: String = "" private var qrString: String = ""
private var pdfQrName: String = ""
private var pdfTempFile: File? = null
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
override fun initView() { override fun initView() {
super.initView() super.initView()
...@@ -35,12 +46,14 @@ class ExportPdfActivity : BaseActivity<ActivityExportPdfBinding>(ActivityExportP ...@@ -35,12 +46,14 @@ class ExportPdfActivity : BaseActivity<ActivityExportPdfBinding>(ActivityExportP
when (qrType) { when (qrType) {
KEY_TEXT -> { KEY_TEXT -> {
pdfQrName = "QR_TEXT"
binding.tvQrType.text = "QR_TEXT" binding.tvQrType.text = "QR_TEXT"
binding.tvQr.text = qrString binding.tvQr.text = qrString
generateQRCode() generateQRCode()
} }
KEY_PRODUCT -> { KEY_PRODUCT -> {
pdfQrName = "QR_PRODUCT"
binding.tvQrType.text = "QR_PRODUCT" binding.tvQrType.text = "QR_PRODUCT"
binding.tvQr.text = qrString binding.tvQr.text = qrString
...@@ -59,6 +72,8 @@ class ExportPdfActivity : BaseActivity<ActivityExportPdfBinding>(ActivityExportP ...@@ -59,6 +72,8 @@ class ExportPdfActivity : BaseActivity<ActivityExportPdfBinding>(ActivityExportP
Thread { Thread {
val bitmap = generateQRCode(qrString, 735, 735, 5) val bitmap = generateQRCode(qrString, 735, 735, 5)
runOnUiThread { binding.ivQr.setImageBitmap(bitmap) } runOnUiThread { binding.ivQr.setImageBitmap(bitmap) }
bitmap?.let { generatePdfFile(it, 0.5f, 30f) }
}.start() }.start()
} }
...@@ -66,9 +81,30 @@ class ExportPdfActivity : BaseActivity<ActivityExportPdfBinding>(ActivityExportP ...@@ -66,9 +81,30 @@ class ExportPdfActivity : BaseActivity<ActivityExportPdfBinding>(ActivityExportP
Thread { Thread {
val bitmap = QRCodeUtils.generateEAN13Barcode(qrString, 648, 255) val bitmap = QRCodeUtils.generateEAN13Barcode(qrString, 648, 255)
runOnUiThread { binding.ivQr.setImageBitmap(bitmap) } runOnUiThread { binding.ivQr.setImageBitmap(bitmap) }
bitmap?.let { generatePdfFile(it, 0.5f, 50f) }
}.start() }.start()
} }
fun generatePdfFile(bitmap: Bitmap, scale: Float = 0.5f, margin: Float = 50f) {
val tempPdf = File(this.cacheDir, "${pdfQrName}_${System.currentTimeMillis()}.pdf")
this.cacheDir.mkdirs()
tempPdf.createNewFile()
val scaledBitmap = Bitmap.createScaledBitmap(
bitmap,
(bitmap.width * scale).toInt(),
(bitmap.height * scale).toInt(),
true
)
val flag = generatePdfWithTextAndImage(tempPdf, scaledBitmap, qrType, qrString, margin)
if (flag) {
LogEx.logDebug(TAG, "${tempPdf.absoluteFile}")
pdfTempFile = tempPdf
}
}
override fun initListener() { override fun initListener() {
super.initListener() super.initListener()
onBackPressedDispatcher.addCallback { onBackPressedDispatcher.addCallback {
...@@ -78,10 +114,44 @@ class ExportPdfActivity : BaseActivity<ActivityExportPdfBinding>(ActivityExportP ...@@ -78,10 +114,44 @@ class ExportPdfActivity : BaseActivity<ActivityExportPdfBinding>(ActivityExportP
onBackPressedDispatcher.onBackPressed() onBackPressedDispatcher.onBackPressed()
} }
binding.tvSave.setOnClickListener { binding.tvSave.setOnClickListener {
pdfTempFile ?: return@setOnClickListener
launcher.launch(
Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
setType("application/pdf")
putExtra(Intent.EXTRA_TITLE, pdfTempFile?.name)
}
) { result ->
val uri: Uri? = result.data?.data
uri ?: return@launch
pdfTempFile?.let { writePdfContent(it, uri) }
}
} }
} }
private fun writePdfContent(file: File, uri: Uri) = Thread {
try {
val ips = FileInputStream(file)
val ops = contentResolver.openOutputStream(uri)
// 缓冲区大小
val buffer = ByteArray(1024)
var length: Int
while ((ips.read(buffer).also { length = it }) > 0) {
ops?.write(buffer, 0, length)
}
ips.close()
ops?.close()
runOnUiThread {
toast("save pdf success", true)
}
} catch (e: Exception) {
e.printStackTrace()
}
}.start()
override fun configSystemBar() { override fun configSystemBar() {
immersionBar { immersionBar {
statusBarColor("#FFFFFFFF") statusBarColor("#FFFFFFFF")
......
package com.base.scanqrclear.utils
import android.graphics.Bitmap
import android.graphics.Color
import android.graphics.Paint
import android.graphics.pdf.PdfDocument
import java.io.File
import java.io.FileOutputStream
object ExportPdf {
fun generatePdfWithTextAndImage(
file: File,
bitmap: Bitmap,
qrType: String,
qrString: String,
marginVertical: Float = 50f
): Boolean {
// A4纸张大小(单位:点,1英寸=72点)
val pageWidth = 595
val pageHeight = 842
val pdfDocument = PdfDocument()
val pageInfo = PdfDocument.PageInfo.Builder(pageWidth, pageHeight, 1).create()
val page = pdfDocument.startPage(pageInfo)
val canvas = page.canvas
val imageWidth = bitmap.width
val imageHeight = bitmap.height
// 计算图片的绘制位置(水平和垂直居中)
val imageX = (pageWidth - imageWidth) / 2f
val imageY = (pageHeight - imageHeight) / 2f
// 绘制图片
canvas.drawBitmap(bitmap, imageX, imageY, null)
// 绘制文本和图片
val paint = Paint()
paint.color = Color.BLACK
paint.textSize = 25f // 设置文本大小
paint.textAlign = Paint.Align.CENTER // 文本居中对齐
// 计算顶部文本的绘制位置
val textTopY = imageY - marginVertical - paint.descent() // 图片上方50点
canvas.drawText(qrType, pageWidth / 2f, textTopY, paint)
// 计算底部文本的绘制位置
val textBottomY = imageY + imageHeight + marginVertical - paint.descent() // 图片下方50点
canvas.drawText(qrString, pageWidth / 2f, textBottomY + 25f, paint)
// 完成页面绘制
pdfDocument.finishPage(page)
try {
val outputStream = FileOutputStream(file)
pdfDocument.writeTo(outputStream)
pdfDocument.close()
outputStream.close()
return true
} catch (e: Exception) {
}
return false
}
}
\ No newline at end of file
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