Je développe une application où j'ai besoin de convertir une image en PDF. J'ai essayé quelque chose, mais le problème est, la taille de l'image dans ce PDF est très très petit. J'ai besoin d'une solution pour résoudre ce problème. Je recherche également la conversion de plusieurs images en une seule PDF. Je posterai le code que j'ai essayé.
public void convertPDF(byte[] path)
{
String FILE = "mnt/sdcard/FirstPdf.pdf";
Document document=new Document();
try {
PdfWriter.getInstance(document, new FileOutputStream(FILE));
document.open();
try {
image=Image.getInstance(path);
document.add(new Paragraph("My Heading"));
document.add(image);
document.close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (DocumentException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
Lorsque je convertis Bitmap en tableau d'octets, je compresse l'image et je suppose que c'est la raison. Sans compresser l'image, je ne parviens pas à convertir Bitmap en tableau d'octets.
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG,100,stream);
byte[] byteArray=stream.toByteArray();
convertPDF(byteArray);
Existe-t-il une solution à ça?
[~ # ~] mis à jour [~ # ~]
Ici, j'ai mis en œuvre la réponse suggérée par @Burak Cakir dans la réponse. Mais maintenant, j'obtiens une image plus grande en PDF. Pour une meilleure compréhension, veuillez trouver les images ci-dessous.
Je vous suggère d'utiliser iText
bibliothèque pdf. Voici la dépendance gradle
:
implementation 'com.itextpdf:itextg:5.5.10'
Document document = new Document();
String directoryPath = Android.os.Environment.getExternalStorageDirectory().toString();
PdfWriter.getInstance(document, new FileOutputStream(directoryPath + "/example.pdf")); // Change pdf's name.
document.open();
Image image = Image.getInstance(directoryPath + "/" + "example.jpg"); // Change image's name and extension.
float scaler = ((document.getPageSize().getWidth() - document.leftMargin()
- document.rightMargin() - 0) / image.getWidth()) * 100; // 0 means you have no indentation. If you have any, change it.
image.scalePercent(scaler);
image.setAlignment(Image.ALIGN_CENTER | Image.ALIGN_TOP);
document.add(image);
document.close();
Téléchargez le code source à partir d'ici ( Convertir l'image en pdf en Android par programmation )
MainActivity.Java:
package com.deepshikha.convertbitmap;
import Android.Manifest;
import Android.app.ProgressDialog;
import Android.content.Context;
import Android.content.Intent;
import Android.content.pm.PackageManager;
import Android.database.Cursor;
import Android.graphics.Bitmap;
import Android.graphics.BitmapFactory;
import Android.graphics.Canvas;
import Android.graphics.Color;
import Android.graphics.Paint;
import Android.graphics.pdf.PdfDocument;
import Android.net.Uri;
import Android.provider.MediaStore;
import Android.support.v4.app.ActivityCompat;
import Android.support.v4.content.ContextCompat;
import Android.support.v7.app.AppCompatActivity;
import Android.os.Bundle;
import Android.util.DisplayMetrics;
import Android.util.Log;
import Android.view.Display;
import Android.view.View;
import Android.view.WindowManager;
import Android.widget.Button;
import Android.widget.ImageView;
import Android.widget.Toast;
import Java.io.File;
import Java.io.FileOutputStream;
import Java.io.IOException;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
public static final int GALLERY_PICTURE = 1;
Button btn_select, btn_convert;
ImageView iv_image;
boolean boolean_permission;
boolean boolean_save;
Bitmap bitmap;
public static final int REQUEST_PERMISSIONS = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
listener();
fn_permission();
}
private void init() {
btn_select = (Button) findViewById(R.id.btn_select);
btn_convert = (Button) findViewById(R.id.btn_convert);
iv_image = (ImageView) findViewById(R.id.iv_image);
}
private void listener() {
btn_select.setOnClickListener(this);
btn_convert.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_select:
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, GALLERY_PICTURE);
break;
case R.id.btn_convert:
if (boolean_save){
Intent intent1=new Intent(getApplicationContext(),PDFViewActivity.class);
startActivity(intent1);
}else {
createPdf();
}
break;
}
}
private void createPdf(){
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
DisplayMetrics displaymetrics = new DisplayMetrics();
this.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
float hight = displaymetrics.heightPixels ;
float width = displaymetrics.widthPixels ;
int convertHighet = (int) hight, convertWidth = (int) width;
// Resources mResources = getResources();
// Bitmap bitmap = BitmapFactory.decodeResource(mResources, R.drawable.screenshot);
PdfDocument document = new PdfDocument();
PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(bitmap.getWidth(), bitmap.getHeight(), 1).create();
PdfDocument.Page page = document.startPage(pageInfo);
Canvas canvas = page.getCanvas();
Paint paint = new Paint();
Paint.setColor(Color.parseColor("#ffffff"));
canvas.drawPaint(Paint);
bitmap = Bitmap.createScaledBitmap(bitmap, bitmap.getWidth(), bitmap.getHeight(), true);
Paint.setColor(Color.BLUE);
canvas.drawBitmap(bitmap, 0, 0 , null);
document.finishPage(page);
// write the document content
String targetPdf = "/sdcard/test.pdf";
File filePath = new File(targetPdf);
try {
document.writeTo(new FileOutputStream(filePath));
btn_convert.setText("Check PDF");
boolean_save=true;
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(this, "Something wrong: " + e.toString(), Toast.LENGTH_LONG).show();
}
// close the document
document.close();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == GALLERY_PICTURE && resultCode == RESULT_OK) {
if (resultCode == RESULT_OK) {
Uri selectedImage = data.getData();
String[] filePathColumn = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(
selectedImage, filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String filePath = cursor.getString(columnIndex);
cursor.close();
bitmap = BitmapFactory.decodeFile(filePath);
iv_image.setImageBitmap(bitmap);
btn_convert.setClickable(true);
}
}
}
private void fn_permission() {
if ((ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)||
(ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) {
if ((ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Android.Manifest.permission.READ_EXTERNAL_STORAGE))) {
} else {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Android.Manifest.permission.READ_EXTERNAL_STORAGE},
REQUEST_PERMISSIONS);
}
if ((ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE))) {
} else {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_PERMISSIONS);
}
} else {
boolean_permission = true;
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_PERMISSIONS) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
boolean_permission = true;
} else {
Toast.makeText(getApplicationContext(), "Please allow the permission", Toast.LENGTH_LONG).show();
}
}
}
}
Merci!
Vous pouvez convertir un JPG en PDF en ciblant un SDK minimum de 19 (KitKat 4.4) et en utilisant l'API PdfDocument de Google ( https://developer.Android.com/reference/ Android/graphics/pdf/PdfDocument ), comme indiqué ci-dessous dans Kotlin:
// Load JPG file into bitmap
val f: File = myJPGFile
val bitmap: Bitmap = BitmapFactory.decodeFile(f.absolutePath)
// Create a PdfDocument with a page of the same size as the image
val document: PdfDocument = PdfDocument()
val pageInfo: PdfDocument.PageInfo = PdfDocument.PageInfo.Builder(bitmap.width, bitmap.height, 1).create()
val page: PdfDocument.Page = document.startPage(pageInfo)
// Draw the bitmap onto the page
val canvas: Canvas = page.canvas
canvas.drawBitmap(bitmap, 0f, 0f, null)
document.finishPage(page)
// Write the PDF file to a file
val directoryPath: String = Android.os.Environment.getExternalStorageDirectory().toString()
document.writeTo( FileOutputStream(directoryPath + "/example.pdf"))
document.close()