Pdf文档页面画布已损坏。继续努力,但没有任何效果

问题描述 投票:0回答:1

需要帮助使用 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 不会写入页面画布。

为了测试,我在与页面无关的新画布上绘制,并且它工作正常。

注意文档页面调试值:

null bitmap drawbitmap pdfdocument
1个回答
0
投票

终于找到解决办法了。

代替:

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 之外绘制的。

© www.soinside.com 2019 - 2024. All rights reserved.