【问题标题】:how convert multiple images to single PDF from folder in android?如何将多个图像从android中的文件夹转换为单个PDF?
【发布时间】:2020-01-01 11:07:40
【问题描述】:

我想让 android 应用程序将单个文件夹中的多个图像合并到单个 pdf 文件中。

前:

文件夹名称:

- 图片

    - 1.jpg
    - 2.jpg
    - 3.jpg
    - 4.jpg
    - 5.jpg

在名为images的文件夹中有5张图片

如何将这些图片制作成 pdf 格式?

如果有人有可能的解决方案,请评论答案:)

【问题讨论】:

    标签: java android


    【解决方案1】:

    在 4.4 版本之后试试这个就可以了。

      private void createPDF() {
        final File file = new File(uploadFolder, "AnswerSheet_" + queId + ".pdf");
    
        final ProgressDialog dialog = ProgressDialog.show(this, "", "Generating PDF...");
        dialog.show();
        new Thread(() -> {
            Bitmap bitmap;
            PdfDocument document = new PdfDocument();
               //  int height = 842;
                 //int width = 595;
            int height = 1010;
            int width = 714;
            int reqH, reqW;
            reqW = width;
    
            for (int i = 0; i < array.size(); i++) {
                   //  bitmap = BitmapFactory.decodeFile(array.get(i));
                bitmap = Utility.getCompressedBitmap(array.get(i), height, width);
    
    
                reqH = width * bitmap.getHeight() / bitmap.getWidth();
                Log.e("reqH", "=" + reqH);
                if (reqH < height) {
                      //  bitmap = Bitmap.createScaledBitmap(bitmap, reqW, reqH, true);
                } else {
                    reqH = height;
                    reqW = height * bitmap.getWidth() / bitmap.getHeight();
                    Log.e("reqW", "=" + reqW);
                      //   bitmap = Bitmap.createScaledBitmap(bitmap, reqW, reqH, true);
                }
                // Compress image by decreasing quality
                    // ByteArrayOutputStream out = new ByteArrayOutputStream();
                   //  bitmap.compress(Bitmap.CompressFormat.WEBP, 50, out);
                 //    bitmap = BitmapFactory.decodeStream(new ByteArrayInputStream(out.toByteArray()));
                //bitmap = bitmap.copy(Bitmap.Config.RGB_565, false);
                  //Create an A4 sized page 595 x 842 in Postscript points.
              //PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(595, 842, 1).create();
                PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(reqW, reqH, 1).create();
                PdfDocument.Page page = document.startPage(pageInfo);
                Canvas canvas = page.getCanvas();
    
                Log.e("PDF", "pdf = " + bitmap.getWidth() + "x" + bitmap.getHeight());
                canvas.drawBitmap(bitmap, 0, 0, null);
    
                document.finishPage(page);
            }
    
            FileOutputStream fos;
            try {
                fos = new FileOutputStream(file);
                document.writeTo(fos);
                document.close();
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            runOnUiThread(() -> {
                dismissDialog(dialog);
    
            });
        }).start();
    }
    

    【讨论】:

    • 我应该在数组中放入什么?
    • @PrafulKorat 在数组中您需要图像的完整路径
    • 输出文件很大,PdfDocument 不压缩文件。最好使用 PdfBox。
    【解决方案2】:

    如果您想创建包含多个图像的 pdf 文件,您可以使用 Android 中的PdfDocument。这是一个演示:

    private void createPDFWithMultipleImage(){
        File file = getOutputFile();
        if (file != null){
            try {
                FileOutputStream fileOutputStream = new FileOutputStream(file);
                PdfDocument pdfDocument = new PdfDocument();
    
                for (int i = 0; i < images.size(); i++){
                    Bitmap bitmap = BitmapFactory.decodeFile(images.get(i).getPath());
                    PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(bitmap.getWidth(), bitmap.getHeight(), (i + 1)).create();
                    PdfDocument.Page page = pdfDocument.startPage(pageInfo);
                    Canvas canvas = page.getCanvas();
                    Paint paint = new Paint();
                    paint.setColor(Color.BLUE);
                    canvas.drawPaint(paint);
                    canvas.drawBitmap(bitmap, 0f, 0f, null);
                    pdfDocument.finishPage(page);
                    bitmap.recycle();
                }
                pdfDocument.writeTo(fileOutputStream);
                pdfDocument.close();
    
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    private File getOutputFile(){
        File root = new File(this.getExternalFilesDir(null),"My PDF Folder");
    
        boolean isFolderCreated = true;
    
        if (!root.exists()){
            isFolderCreated = root.mkdir();
        }
    
        if (isFolderCreated) {
            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(new Date());
            String imageFileName = "PDF_" + timeStamp;
    
            return new File(root, imageFileName + ".pdf");
        }
        else {
            Toast.makeText(this, "Folder is not created", Toast.LENGTH_SHORT).show();
            return null;
        }
    }
    

    这里的 images 是带有路径的图像的 ArrayList。

    【讨论】:

    • 输出文件很大,PdfDocument 不压缩文件。最好使用 PdfBox。
    【解决方案3】:

    将您的问题分解为更小的问题。这是一个相当简单的应用程序。

    1. 从用户那里获取文件夹名称。查看本机文件打开对话框以查找文件夹。见here
    2. 在其文件中搜索图像
    3. 创建图像的 pdf。使用 apache pdfbox 等库。

    【讨论】:

      【解决方案4】:

      Use this iText library

      创建文档

                  String FILE = "{folder-path}/FirstPdf.pdf";
                  Document document = new Document();
                  PdfWriter.getInstance(document, new FileOutputStream(FILE));
                  document.open();
      

      在文档中添加图片

          try {
                  // get input stream
                 String fileName = "OfflineMap/abc.jpg";
                 String path = 
                 Environment.getExternalStorageDirectory()+"/"+fileName;
                 File file = new File(path);
                 FileInputStream fileInputStream = new FileInputStream(file);
                 InputStream ims = getAssets().open("myImage.png");
                 Bitmap bmp = BitmapFactory.decodeStream(ims);
                 ByteArrayOutputStream stream = new ByteArrayOutputStream();
                 bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
                 Image image = Image.getInstance(stream.toByteArray());
                 document.add(image);
                 document.close();
              }
          catch(IOException ex)
              {
                  return;
              }
      

      【讨论】:

        猜你喜欢
        • 2022-01-12
        • 2015-02-14
        • 2010-10-15
        • 1970-01-01
        • 1970-01-01
        • 2013-06-08
        • 2010-10-21
        • 2012-09-01
        相关资源
        最近更新 更多