Commit aa1326d8 authored by wanglei's avatar wanglei

...

parent bfddd66a
package com.base.scanqrclear.ui.exportpdf
import android.annotation.SuppressLint
import android.content.Intent
import android.graphics.Bitmap
import android.net.Uri
import android.view.Gravity
import android.widget.LinearLayout
import androidx.activity.addCallback
......@@ -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.databinding.ActivityExportPdfBinding
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.generateQRCode
import com.base.scanqrclear.utils.ToastUtils.toast
import com.gyf.immersionbar.ktx.immersionBar
import java.io.File
import java.io.FileInputStream
class ExportPdfActivity : BaseActivity<ActivityExportPdfBinding>(ActivityExportPdfBinding::inflate) {
......@@ -22,6 +30,9 @@ class ExportPdfActivity : BaseActivity<ActivityExportPdfBinding>(ActivityExportP
private var qrType: String = KEY_TEXT
private var qrString: String = ""
private var pdfQrName: String = ""
private var pdfTempFile: File? = null
@SuppressLint("SetTextI18n")
override fun initView() {
super.initView()
......@@ -35,12 +46,14 @@ class ExportPdfActivity : BaseActivity<ActivityExportPdfBinding>(ActivityExportP
when (qrType) {
KEY_TEXT -> {
pdfQrName = "QR_TEXT"
binding.tvQrType.text = "QR_TEXT"
binding.tvQr.text = qrString
generateQRCode()
}
KEY_PRODUCT -> {
pdfQrName = "QR_PRODUCT"
binding.tvQrType.text = "QR_PRODUCT"
binding.tvQr.text = qrString
......@@ -59,6 +72,8 @@ class ExportPdfActivity : BaseActivity<ActivityExportPdfBinding>(ActivityExportP
Thread {
val bitmap = generateQRCode(qrString, 735, 735, 5)
runOnUiThread { binding.ivQr.setImageBitmap(bitmap) }
bitmap?.let { generatePdfFile(it, 0.5f, 30f) }
}.start()
}
......@@ -66,9 +81,30 @@ class ExportPdfActivity : BaseActivity<ActivityExportPdfBinding>(ActivityExportP
Thread {
val bitmap = QRCodeUtils.generateEAN13Barcode(qrString, 648, 255)
runOnUiThread { binding.ivQr.setImageBitmap(bitmap) }
bitmap?.let { generatePdfFile(it, 0.5f, 50f) }
}.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() {
super.initListener()
onBackPressedDispatcher.addCallback {
......@@ -78,9 +114,43 @@ class ExportPdfActivity : BaseActivity<ActivityExportPdfBinding>(ActivityExportP
onBackPressedDispatcher.onBackPressed()
}
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() {
immersionBar {
......
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