java - 如何在android中打印受密码保护的PDF?

标签 java android android-studio android-print-framework android-print-manager

我正在使用以下代码打印 pdf,该代码适用于普通 pdf,但会因受密码保护的 pdf 而崩溃。有什么方法可以打印受密码保护的 pdf 或阻止应用程序崩溃。应用程序甚至崩溃 print()在 try-catch 块内调用。

Exception :

java.lang.RuntimeException: 
  at android.print.PrintManager$PrintDocumentAdapterDelegate$MyHandler.handleMessage (PrintManager.java:1103)
  at android.os.Handler.dispatchMessage (Handler.java:106)
  at android.os.Looper.loop (Looper.java:246)
  at android.app.ActivityThread.main (ActivityThread.java:8506)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:602)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1139)

code that causing Exception:

val printManager = this.getSystemService(Context.PRINT_SERVICE) as PrintManager
        val jobName = this.getString(R.string.app_name) + " Document"
        try{
            printManager.print(jobName, pda, null)
        }
        catch(ex:RuntimeException)
        {
            Toast.makeText(this,"Can't print pdf file",Toast.LENGTH_SHORT).show()
        }

PrintDocumentAdapter.kt

  var pda: PrintDocumentAdapter = object : PrintDocumentAdapter() {
    
            override fun onWrite(
                    pages: Array<PageRange>,
                    destination: ParcelFileDescriptor,
                    cancellationSignal: CancellationSignal,
                    callback: WriteResultCallback
            ) {
                var input: InputStream? = null
                var output: OutputStream? = null
                try {
                    input = uri?.let { contentResolver.openInputStream(it) }
    
                    output = FileOutputStream(destination.fileDescriptor)
                    val buf = ByteArray(1024)
                    var bytesRead: Int
                    if (input != null) {
                        while (input.read(buf).also { bytesRead = it } > 0) {
                            output.write(buf, 0, bytesRead)
                        }
                    }
                    callback.onWriteFinished(arrayOf(PageRange.ALL_PAGES))
                } catch (ee: FileNotFoundException) {
                    //Code to Catch FileNotFoundException
                } catch (e: Exception) {
                   //Code to Catch exception
                } finally {
                    try {
                        input!!.close()
                        output!!.close()
                    } catch (e: IOException) {
                        e.printStackTrace()
                    }
                }
            }
    
            override fun onLayout(
                    oldAttributes: PrintAttributes,
                    newAttributes: PrintAttributes,
                    cancellationSignal: CancellationSignal,
                    callback: LayoutResultCallback,
                    extras: Bundle
            ) {
                if (cancellationSignal.isCanceled) {
                    callback.onLayoutCancelled()
                    return
                }
                val pdi = PrintDocumentInfo.Builder("Name of file")
                    .setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT).build()
                callback.onLayoutFinished(pdi, true)
            }
        }
或者如果不可能,那么如何从pdf中删除密码。

最佳答案

您无需生成没有密码的 pdf 即可打印。正如您所说,您正在使用 barteksc:android-pdf-viewer用于查看使用 PDfium 渲染 pdf 的 pdf,该 pdf 具有从方法渲染位图的方法。

void getBitmaps() {
    ImageView iv = (ImageView) findViewById(R.id.imageView);
    ParcelFileDescriptor fd = ...;
    int pageNum = 0;
    PdfiumCore pdfiumCore = new PdfiumCore(context);
    try {
        PdfDocument pdfDocument = pdfiumCore.newDocument(fd);

        pdfiumCore.openPage(pdfDocument, pageNum);

        int width = pdfiumCore.getPageWidthPoint(pdfDocument, pageNum);
        int height = pdfiumCore.getPageHeightPoint(pdfDocument, pageNum);

        // ARGB_8888 - best quality, high memory usage, higher possibility of OutOfMemoryError
        // RGB_565 - little worse quality, twice less memory usage
        Bitmap bitmap = Bitmap.createBitmap(width, height,
                Bitmap.Config.RGB_565);
        pdfiumCore.renderPageBitmap(pdfDocument, bitmap, pageNum, 0, 0,
                width, height);
        //if you need to render annotations and form fields, you can use
        //the same method above adding 'true' as last param

        iv.setImageBitmap(bitmap);

        printInfo(pdfiumCore, pdfDocument);

        pdfiumCore.closeDocument(pdfDocument); // important!
    } catch(IOException ex) {
        ex.printStackTrace();
    }
}
将这些位图存储在 arraylist 中并使用 android 打印框架打印它们

关于java - 如何在android中打印受密码保护的PDF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68768960/

相关文章:

Android和Vitamio : sorry, 此视频无法播放

java - Android apk 无法使用 PHP 检索超过 3g 的数据,在 wifi 上工作正常

java - 安卓工作室 :error: illegal character: '\u2028'

java - 如何让我的微调器与我的 EditText 具有相同的宽度?

java - "return new A()"和 "return a = new A()"有什么区别

java - 拖动组件时更改其背景

java - 在 OpenGL 中渲染加载了 Assimp 的动画模型时网格折叠

Java 注释约定

android - 使用 fileTransfer 下载 Ionic 4

android - 自定义数据类型渲染器部署