【问题标题】:How to add captured images from camera or gallery in pdf report?如何在 pdf 报告中添加从相机或图库中捕获的图像?
【发布时间】:2019-12-08 16:14:17
【问题描述】:

我正在开发一项功能,用户可以在其中创建已执行工作订单的报告。通过此报告,您将获得订单本身的信息,例如客户姓名、服务、位置等……以及捕获的服务图像。我已经设法用我想要的数据生成报告,包括格式。但是,我很难在同一份报告中附加从相机或图库中获取的图像。已经研究了无数次,我的尝试并没有出现在报告中的图像。

从相机获取图像

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

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)
        imageCam = uri.getPath().toString()
        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())
            }
        } else {
            val uri = data.data
            if (uri != null) {
                pathImage.add(uri.path.toString())
            }
        }
    }
}

创建报告

     val mDoc = Document()
    //pdf file name
    mFileName = SimpleDateFormat(
        "ddMMyyyy_HHmmss",
        Locale.getDefault()
    ).format(System.currentTimeMillis())
    //pdf file path
    mFilePath =
        Environment.getExternalStorageDirectory().toString() + "/" + mFileName + ".pdf"
    try {
        //create instance of PdfWriter class
        PdfWriter.getInstance(mDoc, FileOutputStream(mFilePath))
        //open the document for writing
        mDoc.open()

        //settings
        mDoc.setPageSize(PageSize.A4)
        mDoc.addCreationDate()
        mDoc.addAuthor(userDTO.user.fullname)
        mDoc.addCreator("Pratik Butani")
        mDoc.setPageSize(PageSize.LETTER)
        //font settings
        val mColorAccent = BaseColor(0, 153, 204, 255)
        val mHeadingFontSize = 20.0f
        val mValueFontSize = 16.0f
        //Font
        val fontName = BaseFont.createFont(
            "assets/fonts/brandon_medium.otf",
            BaseFont.IDENTITY_H,
            BaseFont.EMBEDDED,
            true
        )
        for ( image in pathImage) {
            val img = Image.getInstance(image)
            mDoc.setPageSize(img)
            mDoc.newPage()
            img.setAbsolutePosition(0f, 0f)
            mDoc.add(img)
        }

        //close document
        mDoc.close()
        } catch (e: Exception) {
        //if anything goes wrong causing exception, get and show exception message
        Toast.makeText(this@DetailsActivity, e.message, Toast.LENGTH_SHORT).show()
    }

返回错误:/document/image:8495: open failed: ENOENT (No such file or directory)

【问题讨论】:

  • 那不是有效的路径。使用 uri 本身。或者 uri.toString().
  • 但是当我得到相机返回 URI 时我已经这样做了,在:imageCam = uri.getPath ()。 toString()
  • 没有。你不是。那是完全不同的东西。改为查看 uri.toString()。
  • 那会是什么样子?你能帮帮我吗?
  • 告诉 uri.toString() 的值。

标签: java android kotlin mobile report


【解决方案1】:

您在这一行pathImage.add(uri.path.toString())onActivityResult 方法中获取path from uri 时犯了错误。

您可以尝试以下方法从 URI 获取路径:

public static String getPathFromUri(final Context context, final Uri uri) {

    // DocumentProvider
    if (DocumentsContract.isDocumentUri(context, uri)) {
        // ExternalStorageProvider
        if (isExternalStorageDocument(uri)) {
            final String docId = DocumentsContract.getDocumentId(uri);
            final String[] split = docId.split(":");
            final String type = split[0];

            if ("primary".equalsIgnoreCase(type)) {
                return Environment.getExternalStorageDirectory() + "/" + split[1];
            }

            // TODO handle non-primary volumes
        }
        // DownloadsProvider
        else if (isDownloadsDocument(uri)) {

            final String id = DocumentsContract.getDocumentId(uri);
            final Uri contentUri = ContentUris.withAppendedId(
                    Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));

            return getDataColumn(context, contentUri, null, null);
        }
        // MediaProvider
        else if (isMediaDocument(uri)) {
            final String docId = DocumentsContract.getDocumentId(uri);
            final String[] split = docId.split(":");
            final String type = split[0];

            Uri contentUri = null;
            if ("image".equals(type)) {
                contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
            } else if ("video".equals(type)) {
                contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
            } else if ("audio".equals(type)) {
                contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
            }

            final String selection = "_id=?";
            final String[] selectionArgs = new String[]{
                    split[1]
            };

            return getDataColumn(context, contentUri, selection, selectionArgs);
        }
    }
    // MediaStore (and general)
    else if ("content".equalsIgnoreCase(uri.getScheme())) {

        // Return the remote address
        if (isGooglePhotosUri(uri))
            return uri.getLastPathSegment();

        return getDataColumn(context, uri, null, null);
    }
    // File
    else if ("file".equalsIgnoreCase(uri.getScheme())) {
        return uri.getPath();
    }

    return null;
}

Here is the full gist 会帮助你的。

谢谢。

【讨论】:

    猜你喜欢
    • 2012-01-17
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 2013-12-14
    • 2020-08-15
    • 2014-01-05
    • 1970-01-01
    • 2012-01-11
    相关资源
    最近更新 更多