1

Cloudinary にアップロードする PDF ページを作成する必要があります。うまく機能するPDFJetを見つけました。PDF には、各ページに 1 つの画像を含む 1 つまたは 2 つのページが含まれます。各ページは、WebView とその上に描画される Canvas ビットマップで構成されます。WebView をビットマップにするにはcapturePicture()、画像として保存してから、以下の方法を使用してビットマップに変換しますpictureDrawable2Bitmap。次に、キャンバスをビットマップに変換します。overlayBitmapこの 2 つは、メソッドを使用して新しいビットマップにオーバーレイされます。

これは、2 番目のビットマップに対して繰り返されます。ビットマップは圧縮されてバイト配列に変換されるため、PDFJet の画像オブジェクトを使用して PDF に追加できます。が作成されたときに OutOfMemory を取得していImage imageます。各ビットマップをリサイクルして、使用後にpdfファイルを削除しようとしましたが、役に立ちません。さらに、アップロードされた png は低品質です。

PDFJet を使用してビットマップから PDF を作成するためのより良い方法に関する提案はありますか?

private class CloudinaryTask extends AsyncTask <Bitmap, Void, Object> {

     ProgressDialog progressBar;

     @Override
    protected Object doInBackground (Bitmap...bmp) {            

    tStamp = String.valueOf(System.currentTimeMillis());

        // Scaling used to match canvas drawing to the webview
    Matrix matrix = new Matrix();
    matrix.postScale(1.5f, 1.5f);   

    // Get the contents of the webview and turn it into a bitmap
    Bitmap bmp1 = pictureDrawable2Bitmap(new PictureDrawable(picture));

    // Create a new bitmap from the canvas to match the webview contents
    Bitmap resizedBitmap = Bitmap.createBitmap(DrawingView.canvasBitmap, 0, 0, DrawingView.canvasBitmap.getWidth(), DrawingView.canvasBitmap.getHeight(), matrix, false);

    // Turn the new bitmap into an InputStream to upload to Cloudinary
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    overlayBitmap = overlayMark(bmp1, resizedBitmap);
    bmp1.recycle();
    resizedBitmap.recycle();
    overlayBitmap.compress(CompressFormat.PNG, 100, bos); 

    byte[] bitmapdata = bos.toByteArray();
    overlayBitmap.recycle();
    bs = new ByteArrayInputStream(bitmapdata);

    // If there's a 2nd page or if the user clicked 'flip form over', creates a bitmap of that image
    if (pagetwo || flipPage) {
        if (!flipPage) {
            Bitmap bmp2 = pictureDrawable2Bitmap(new PictureDrawable(picture2));
            ByteArrayOutputStream bos2 = new ByteArrayOutputStream();
            bmp2.compress(CompressFormat.PNG, 100, bos2); 
            bmp2.recycle();
            byte[] bitmapdata2 = bos2.toByteArray();
            bs2 = new ByteArrayInputStream(bitmapdata2);
        }
        else {
            Bitmap bmp2 = pictureDrawable2Bitmap(new PictureDrawable(picture2));
            System.out.println(bmp2.getWidth());
            System.out.println(bmp2.getWidth());
            Bitmap resizedBitmap2 = Bitmap.createBitmap(DrawingViewBack.canvasBitmap, 0, 0, DrawingViewBack.canvasBitmap.getWidth(), DrawingViewBack.canvasBitmap.getHeight(), matrix, false);
            overlayBitmap2 = overlayMark(bmp2, resizedBitmap2);
            bmp2.recycle();
            resizedBitmap.recycle();

            ByteArrayOutputStream bos2 = new ByteArrayOutputStream();
            overlayBitmap2.compress(CompressFormat.PNG, 100, bos2); 
            overlayBitmap2.recycle();
            byte[] bitmapdata2 = bos2.toByteArray();
            bs2 = new ByteArrayInputStream(bitmapdata2);
        }
    }

    // Creates pdf of one or both pages
    PDF pdf;
    File f = new File(Environment.getExternalStorageDirectory(), "offer.pdf");
    try {
        FileOutputStream out = new FileOutputStream(f);
        pdf = new PDF(out);
        float[] aspect = new float[2];
        // Set the height and width of each pdf page
        aspect[0] = (float) overlayBitmap.getWidth();
        aspect[1] = (float) overlayBitmap.getHeight();

        // Create the first page and set the first image
        Page page = new Page(pdf, aspect);
        Image image1 = new Image(pdf, bs, ImageType.PNG);
        image1.setPosition(0, 0);
        image1.drawOn(page);
        if (pagetwo || flipPage) {
            // Create the second page and set the 2nd image
            Page page2 = new Page(pdf, aspect);
            Image image2 = new Image(pdf, bs2, ImageType.PNG);
            image2.setPosition(0, 0);
            image2.drawOn(page2);
        }
        pdf.flush();

        // Turn the pdf file into an inputstream so cloudinary can use it
        FileInputStream fileInputStream=null;
        byte[] bFile = new byte[(int) f.length()];
        try {
            //convert file into array of bytes
            fileInputStream = new FileInputStream(f);
            fileInputStream.read(bFile);
            fileInputStream.close();
            f.delete();
        }catch(Exception e){
            e.printStackTrace();         
        }

        bs3 = new ByteArrayInputStream(bFile);

    } catch (FileNotFoundException e2) {
        // TODO Auto-generated catch block
        e2.printStackTrace();
    } catch (Exception e2) {
        // TODO Auto-generated catch block
        e2.printStackTrace();
    }

    // Create a map and add some required parameters for cloudinary
    Map<Object, Object> cloud = new HashMap<Object, Object>();
    cloud.put("cloud_name", "");
    cloud.put("api_key", "");
    cloud.put("api_secret", "");

    try {
        // Upload to cloudinary
        Cloudinary cloudinary = new Cloudinary(cloud);
        cloudinary.uploader().upload(bs3, Cloudinary.asMap("public_id", Network.imageUrl + tStamp));
4

0 に答える 0