首页 > 解决方案 > 错误:打开失败:ENOENT(没有这样的文件或目录)在文档 pdf 中添加画廊图像

问题描述

在我正在创建的 pdf 文档中添加移动图库中的图像时遇到困难。传递图像路径返回以下错误:错误:无法打开:ENOENT(此文件或目录不存在)。我创建了一个类,用户可以从图库中选择照片或通过相机捕获新图像。我将这些图像的路径存储在数组列表中。所以我需要将这些路径传递给创建 pdf 文档的函数。

private val pathImage: ArrayList<String> = arrayListOf()

private fun openCam() {
    imageCapture.setOnClickListener(object : View.OnClickListener {
        override fun onClick(v: View?) {
            if (checkPermission()) {
                val diretorio: File =
                    Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
                val imagem =
                    File(diretorio.path + "/" + System.currentTimeMillis().toString() + ".jpg")
                uri = Uri.fromFile(imagem)
                val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
                startActivityForResult(intent, CAM)
            } else {
                requestPermission()
            }
        }
    })

   private fun openGatelry() {
    imageGallery.setOnClickListener(object : View.OnClickListener {
        override fun onClick(v: View?) {
            val intent = Intent()
            intent.type = "image/*"
            intent.action = Intent.ACTION_GET_CONTENT
            intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
            startActivityForResult(Intent.createChooser(intent, R.string.select_picture.toString()), GALLERY)
        }
    })
}

 override fun onActivityResult(
    requestCode: Int,
    resultCode: Int,
    data: Intent?
) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == CAM && resultCode == Activity.RESULT_OK && data != null) {
        val novaIntent = Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri)
        sendBroadcast(novaIntent)
        val imageCam = uri.getPath()
        if (imageCam != null) {
            Log.i("TAG", "Camera: "+imageCam)
            pathImage.add(imageCam)
        }
    } else if (requestCode == GALLERY && resultCode == Activity.RESULT_OK && data != null) {
        val clipData = data.clipData
        if (clipData != null) {
            for (i in 0 until clipData.itemCount) {
                val uri: Uri = clipData.getItemAt(i).uri
                pathImage.add(uri.path.toString())
                showImages()
            }
        } else {
            val uri = data.data
            if (uri != null) {
                pathImage.add(uri.path.toString())
                showImages()
            }
        }
    }
}


// Do something when user press the positive button
                val mDoc = Document()
                //pdf file name
                val mFileName = SimpleDateFormat(
                    "ddMMyyyy_HHmmss",
                    Locale.getDefault()
                ).format(System.currentTimeMillis())
                //pdf file path
                val mFilePath =
                    Environment.getExternalStorageDirectory().toString() + "/" + mFileName + ".pdf"
                try {
                    //create instance of PdfWriter class
                    PdfWriter.getInstance(mDoc, FileOutputStream(mFilePath))
                    //open the document for writing
                    mDoc.open()
                    val image = Image.getInstance("/storage/emulated/0/Pictures/1573066971461.jpg")
                    mDoc.add(image)
                    //close document
                    mDoc.close()

标签: javaandroidimagepdfkotlin

解决方案


在使用该文件之前,请确保它存在

// Make sure the directory exists.
File(mFilePath).mkdirs()

在访问之前还要检查图像文件是否存在。

File imageFile = new File("/storage/emulated/0/Pictures/1573066971461.jpg");
if(imageFile.exists())

除此之外不要忘记从用户那里获取权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

推荐阅读