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));