需要帮助使用 PdfDocument 制作 PDF 文件
页面画布为空或空白。
我尝试了很多方法,但没有任何内容写入页面画布。
我找到了类似问题的link,但它不适用于我的情况,因为我没有在 Create 函数中执行 PdfDocument 代码。已经是布局显示在屏幕上之后了。
我正在使用以下代码:
class pdfSelection(
var pg: Int,
var bm: Bitmap
)
////// I have a PdfRenderer where I get the bitmap from the render page and save it in a List
selChk.setOnCheckedChangeListener { buttonView, isChecked ->
val element: pdfSelection
if (isChecked) {
////The pageW/pageH are the values from the render page not the ImageView
element = pdfSelection(pdfnum, pdfview.drawable!!.toBitmap(pageW, pageH ,Bitmap.Config.ARGB_8888))
savelist.add(element)
} else {
savelist.removeIf { x: pdfSelection -> x.pg == pdfnum }
}
}
/// PdfDocument is called in a Button Click event so the Layout is completely active
savebtn.setOnClickListener {
if (savelist.isNotEmpty()) {
// create document
val document = PdfDocument()
// create a page description
val pageInfo = PdfDocument.PageInfo.Builder(pageW, pageH, 1).create()
savelist.forEach { item ->
// start 1st page
val docpage = document.startPage(pageInfo)
// draw something on the page
binding.imageView.setImageBitmap(item.bm) //I use the new gradle directive viewBinding = true
binding.imageView.draw(docpage.getCanvas())
//// THIS CODE DOES NOT WORK. THE DOCUMENT PAGE GETS NULL BITMAP. EXECUTES WITHOUT ERROR
// finish 1st page
document.finishPage(docpage)
}
val file: File = File(cacheDir,"Selected_${textview.text}")
val fos: FileOutputStream
try {
val fileNameWithPath = file
fos = FileOutputStream(fileNameWithPath, false)
// write the document content
document.writeTo(fos)
} catch (e: FileNotFoundException) {
e.printStackTrace()
} catch (e: IOException) {
e.printStackTrace()
}
// close the document
document.close()
}
创建的文档带有空白页面。
我验证了列表中的位图已成功添加,并检查了 imageView 中 setImageBitmap 的代码行中的 [item.bm] 变量,它就在那里。还要检查 binding.imageView 并将可绘制对象成功设置为位图。 imageView.draw 不会写入页面画布。
为了测试,我在与页面无关的新画布上绘制,并且它工作正常。
终于找到解决办法了。
代替:
binding.imageView.setImageBitmap(item.bm) //I use the new gradle directive viewBinding = true
binding.imageView.draw(docpage.getCanvas())
做:
scaledbmp = Bitmap.createScaledBitmap(item.bm, pageW, pageH, false)
var canvas: Canvas = docpage.canvas
canvas.drawBitmap(scaledbmp, 0F, 0F, paint)
//Notice the parameters are a top/left location for the Bitmap not the width/heigh.
//I was using the width/heigh values and that was the problem.
仍然不知道为什么 imageView.draw 不起作用,但我猜也是因为它是在 Canvas 之外绘制的。