PdfRenderer 错误:java.io.IOException:无法创建文档。错误:3

Posted

技术标签:

【中文标题】PdfRenderer 错误:java.io.IOException:无法创建文档。错误:3【英文标题】:PdfRenderer Error : java.io.IOException: cannot create document. Error: 3 【发布时间】:2019-01-26 05:59:37 【问题描述】:

我正在尝试将 PDF 转换为图像位图.. 为此我使用下面的代码。

pdfFile = Environment.getExternalStorageDirectory().toString() + "/" + "imagepdf.pdf"

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 

            try 
                Uri uri = MainActivity.getUriFromFile(PdfExtrectorActivity.this,new File(pdfFile));
                final ParcelFileDescriptor parcelFileDescriptor = getContentResolver().openFileDescriptor(
                        uri, "r");
                final FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
                pdfRenderer = new PdfRenderer(parcelFileDescriptor);
             catch (IOException e) 
                e.printStackTrace();
            
            Bitmap bitmap;
            final int pageCount = pdfRenderer.getPageCount();
            for (int i = 0; i < pageCount; i++) 
                PdfRenderer.Page page = pdfRenderer.openPage(i);


                bitmap = Bitmap.createBitmap(500, 500, Bitmap.Config.ARGB_8888);
                page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);



                // close the page
                page.close();
            

            // close the renderer
            pdfRenderer.close();
        

当我将 ParcelFileDescriptor 发送到 pdfRenderer 时,它会抛出异常

java.io.IOException: cannot create document. Error: 3

我从 GitHub 问题中找到了一些链接。 https://github.com/googlesamples/android-PdfRendererBasic/issues/15 但这对我没有帮助。

接受任何帮助。 谢谢。

【问题讨论】:

parcelFileDescriptor = getContentResolver().openFileDescriptor( uri, "r"); 该文件是否已经存在? pdfFile 是什么?请告诉我们完整路径。 是的.. 文件已经存在并且没有损坏。在 pdf 查看器中正确打开 请告诉uri.toString()的值。 @greenapps 请参阅已编辑的 ans。我在代码顶部添加了 pdf 文件路径 【参考方案1】:

我的问题通过这个解决方案解决了从 PDF 转换 SD 卡中的图像位图。,

这对我来说很好用

  File file = new File(getCacheDir(), PDF_FILE_NAME);
        //if (!file.exists()) 
        // Since PdfRenderer cannot handle the compressed asset file directly, we copy it into
        // the cache directory.
        //InputStream asset = context.getAssets().open("imagepdf.pdf");
        FileInputStream fileInputStream = null;
        FileOutputStream output = null;
        try 
            fileInputStream = new FileInputStream( Environment.getExternalStorageDirectory().toString() +  "/imagepdf.pdf");
            output = new FileOutputStream(file);
         catch (FileNotFoundException e) 
            e.printStackTrace();
        

        final byte[] buffer = new byte[1024];
        int size;
        while ((size = fileInputStream.read(buffer)) != -1) 
            output.write(buffer, 0, size);
        
        fileInputStream.close();
        output.close();
        //
        ParcelFileDescriptor mFileDescriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
        // This is the PdfRenderer we use to render the PDF.
        PdfRenderer renderer = null;
        if (mFileDescriptor != null) 
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
                renderer = new PdfRenderer(mFileDescriptor);
                Bitmap bitmap;
                final int pageCount = renderer.getPageCount();
                for (int i = 0; i < pageCount; i++) 
                    PdfRenderer.Page page = renderer.openPage(i);

                    // say we render for showing on the screen
                    bitmap = Bitmap.createBitmap(500, 500, Bitmap.Config.ARGB_8888);
                    page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
                    myImageBitmap.add(bitmap);
                    // do stuff with the bitmap

                    // close the page
                    page.close();
                

                // close the renderer
                renderer.close();
            
        

【讨论】:

以上是关于PdfRenderer 错误:java.io.IOException:无法创建文档。错误:3的主要内容,如果未能解决你的问题,请参考以下文章

使用 Sun PDFRenderer 进行 Java 打印编码

PdfRenderer 在呈现受密码保护的文件后总是抛出“需要密码”SecurityException

第1章 Java IO系统

Java IO1:IO和File

带有 PdfRenderer 的 SecurityException,带有受密码保护的 pdf,即使使用普通 pdf 也会重复

23(java/io/data_io)