如何从多个图像中制作 PDF
How Can I make a PDF out of Multiple Images
我正在构建一个应用程序来将图像上传到我公司的服务器
我现在正致力于拍摄多张图像并将它们转换为 PDF,以便属于同一文档的图像可以放在一起[=13=]
我的问题是我不知道如何制作它以便我可以将多个图像添加到 PDF 创建
我正在使用 Kosal Geek 的 android 库 PhotoUtils 进行图像处理
和 PDFdocument 来创建 pdf
目前单个图像有效,但如果我 select 多个图像,我会得到空指针异常
主要代码
public class PdfMake extends AppCompatActivity {
private final int PICK_IMAGE=12345;
private final int REQUEST_CAMERA=6352;
CameraPhoto cameraPhoto;
GalleryPhoto galleryPhoto;
String selectedPhoto;
@Override
protected void onCreate(Bundle savedInstanceState) {
StrictMode.VmPolicy.Builder builder4=new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder4.build());
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pdf_make);
Button fromCamera=findViewById(R.id.SelectImages2);
Button PdfMake=findViewById(R.id.button4);
fromCamera.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showPictureDialog();
}
});
PdfMake.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api=Build.VERSION_CODES.KITKAT)
@Override
public void onClick(View v) {
try {
createPdf();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
private void showPictureDialog () {
AlertDialog.Builder pictureDialog=new AlertDialog.Builder(this);
pictureDialog.setTitle("Select Action");
String[] pictureDialogItems={
"Select photo from gallery",
"Capture photo from camera"};
pictureDialog.setItems(pictureDialogItems,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0:
getImageFromGallery();
break;
case 1:
try {
getImageFromCamera();
} catch (IOException e) {
e.printStackTrace();
}
break;
}
}
});
}
@RequiresApi(api=Build.VERSION_CODES.KITKAT)
private void createPdf() throws IOException {
// create a new document
PdfDocument document=new PdfDocument();
// crate a page description
PdfDocument.PageInfo pageInfo=new PdfDocument.PageInfo.Builder(3000, 6000, 1).create();
// start a page
PdfDocument.Page page=document.startPage(pageInfo);
Canvas canvas=page.getCanvas();
Bitmap image=BitmapFactory.decodeFile(selectedPhoto);
canvas.drawBitmap(image, 10, 10, null);
document.finishPage(page);
String directory_path=Environment.getExternalStorageDirectory().getPath() + "/mypdf/";
File file=new File(directory_path);
if (!file.exists()) {
file.mkdirs();
}
String targetPdf=directory_path + "test-2.pdf";
File filePath=new File(targetPdf);
try {
document.writeTo(new FileOutputStream(filePath));
Toast.makeText(this, "Done", Toast.LENGTH_LONG).show();
} catch (IOException e) {
Log.e("main", "error " + e.toString());
Toast.makeText(this, "Something wrong: " + e.toString(), Toast.LENGTH_LONG).show();
}
// close the document
document.close();
}
private void getImageFromCamera () throws IOException {
cameraPhoto=new CameraPhoto(getApplicationContext());
Intent in=cameraPhoto.takePhotoIntent();
startActivityForResult(in, REQUEST_CAMERA);
Bungee.split(PdfMake.this);
}
private void getImageFromGallery () {
Intent intent=new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
}
if (intent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE);
Bungee.split(PdfMake.this);
}
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
if (requestCode == REQUEST_CAMERA) {
String photoPath=cameraPhoto.getPhotoPath();
selectedPhoto=photoPath;
try {
Bitmap bitmap=ImageLoader.init().from(photoPath).requestSize(512, 512).getBitmap();
} catch (FileNotFoundException e) {
Toasty.error(getApplicationContext(),
"Something Wrong while loading photos", Toast.LENGTH_SHORT).show();
}
} else if (requestCode == PICK_IMAGE) {
Uri uri=data.getData();
galleryPhoto.setPhotoUri(uri);
String photoPath=galleryPhoto.getPath();
selectedPhoto=photoPath;
try {
Bitmap bitmap=ImageLoader.init().from(photoPath).requestSize(512, 512).getBitmap();
} catch (FileNotFoundException e) {
Toasty.error(getApplicationContext(),
"Something Wrong while choosing photos", Toast.LENGTH_SHORT).show();
}
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
int CAMERA_RESULT=11100;
if(requestCode == CAMERA_RESULT){
if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED){
try {
getImageFromCamera();
} catch (IOException e) {
e.printStackTrace();
}
}
else{
Toasty.error(getApplicationContext(), "Permission Needed.", Toast.LENGTH_LONG).show();
}
}
else {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
if(requestCode == PICK_IMAGE){
if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED){
getImageFromGallery();
}
else{
Toasty.error(getApplicationContext(), "Permission Needed.", Toast.LENGTH_LONG).show();
}
}
else {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
}
画廊图片代码
public class GalleryPhoto {
final String TAG = this.getClass().getSimpleName();
private Context context;
private Uri photoUri;
public void setPhotoUri(Uri photoUri) {
this.photoUri = photoUri;
}
public GalleryPhoto(Context context) {
this.context = context;
}
public Intent openGalleryIntent() {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction("android.intent.action.GET_CONTENT");
return Intent.createChooser(intent, this.getChooserTitle());
}
public String getChooserTitle() {
return "Select Pictures";
}
public String getPath() {
String path;
if (VERSION.SDK_INT < 11) {
path = RealPathUtil.getRealPathFromURI_BelowAPI11(this.context, this.photoUri);
} else if (VERSION.SDK_INT < 19) {
path = RealPathUtil.getRealPathFromURI_API11to18(this.context, this.photoUri);
} else {
path = RealPathUtil.getRealPathFromURI_API19(this.context, this.photoUri);
}
return path;
}
}
相机图像代码
public class CameraPhoto {
final String TAG = this.getClass().getSimpleName();
private String photoPath;
private Context context;
public String getPhotoPath() {
return this.photoPath;
}
public CameraPhoto(Context context) {
this.context = context;
}
public Intent takePhotoIntent() throws IOException {
Intent in = new Intent("android.media.action.IMAGE_CAPTURE");
if (in.resolveActivity(this.context.getPackageManager()) != null) {
File photoFile = this.createImageFile();
if (photoFile != null) {
in.putExtra("output", Uri.fromFile(photoFile));
}
}
return in;
}
private File createImageFile() throws IOException {
String timeStamp = (new SimpleDateFormat("yyyyMMdd_HHmmss")).format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(imageFileName, ".jpg", storageDir);
this.photoPath = image.getAbsolutePath();
return image;
}
public void addToGallery() {
Intent mediaScanIntent = new Intent("android.intent.action.MEDIA_SCANNER_SCAN_FILE");
File f = new File(this.photoPath);
Uri contentUri = Uri.fromFile(f);
mediaScanIntent.setData(contentUri);
this.context.sendBroadcast(mediaScanIntent);
}
}
有一个不错的库,叫做 "Android PDF Writer"。
您要做的是在其中创建一个 PDF 对象和一个页面。
PDFWriter mPDFWriter = new PDFWriter(PaperSize.FOLIO_WIDTH, PaperSize.FOLIO_HEIGHT);
然后您可以通过 addImage
添加图片,通过 newPage()
添加页面
您可以在项目demo page here中看到一个演示。
我正在构建一个应用程序来将图像上传到我公司的服务器 我现在正致力于拍摄多张图像并将它们转换为 PDF,以便属于同一文档的图像可以放在一起[=13=]
我的问题是我不知道如何制作它以便我可以将多个图像添加到 PDF 创建 我正在使用 Kosal Geek 的 android 库 PhotoUtils 进行图像处理 和 PDFdocument 来创建 pdf
目前单个图像有效,但如果我 select 多个图像,我会得到空指针异常
主要代码
public class PdfMake extends AppCompatActivity {
private final int PICK_IMAGE=12345;
private final int REQUEST_CAMERA=6352;
CameraPhoto cameraPhoto;
GalleryPhoto galleryPhoto;
String selectedPhoto;
@Override
protected void onCreate(Bundle savedInstanceState) {
StrictMode.VmPolicy.Builder builder4=new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder4.build());
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pdf_make);
Button fromCamera=findViewById(R.id.SelectImages2);
Button PdfMake=findViewById(R.id.button4);
fromCamera.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showPictureDialog();
}
});
PdfMake.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api=Build.VERSION_CODES.KITKAT)
@Override
public void onClick(View v) {
try {
createPdf();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
private void showPictureDialog () {
AlertDialog.Builder pictureDialog=new AlertDialog.Builder(this);
pictureDialog.setTitle("Select Action");
String[] pictureDialogItems={
"Select photo from gallery",
"Capture photo from camera"};
pictureDialog.setItems(pictureDialogItems,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0:
getImageFromGallery();
break;
case 1:
try {
getImageFromCamera();
} catch (IOException e) {
e.printStackTrace();
}
break;
}
}
});
}
@RequiresApi(api=Build.VERSION_CODES.KITKAT)
private void createPdf() throws IOException {
// create a new document
PdfDocument document=new PdfDocument();
// crate a page description
PdfDocument.PageInfo pageInfo=new PdfDocument.PageInfo.Builder(3000, 6000, 1).create();
// start a page
PdfDocument.Page page=document.startPage(pageInfo);
Canvas canvas=page.getCanvas();
Bitmap image=BitmapFactory.decodeFile(selectedPhoto);
canvas.drawBitmap(image, 10, 10, null);
document.finishPage(page);
String directory_path=Environment.getExternalStorageDirectory().getPath() + "/mypdf/";
File file=new File(directory_path);
if (!file.exists()) {
file.mkdirs();
}
String targetPdf=directory_path + "test-2.pdf";
File filePath=new File(targetPdf);
try {
document.writeTo(new FileOutputStream(filePath));
Toast.makeText(this, "Done", Toast.LENGTH_LONG).show();
} catch (IOException e) {
Log.e("main", "error " + e.toString());
Toast.makeText(this, "Something wrong: " + e.toString(), Toast.LENGTH_LONG).show();
}
// close the document
document.close();
}
private void getImageFromCamera () throws IOException {
cameraPhoto=new CameraPhoto(getApplicationContext());
Intent in=cameraPhoto.takePhotoIntent();
startActivityForResult(in, REQUEST_CAMERA);
Bungee.split(PdfMake.this);
}
private void getImageFromGallery () {
Intent intent=new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
}
if (intent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE);
Bungee.split(PdfMake.this);
}
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
if (requestCode == REQUEST_CAMERA) {
String photoPath=cameraPhoto.getPhotoPath();
selectedPhoto=photoPath;
try {
Bitmap bitmap=ImageLoader.init().from(photoPath).requestSize(512, 512).getBitmap();
} catch (FileNotFoundException e) {
Toasty.error(getApplicationContext(),
"Something Wrong while loading photos", Toast.LENGTH_SHORT).show();
}
} else if (requestCode == PICK_IMAGE) {
Uri uri=data.getData();
galleryPhoto.setPhotoUri(uri);
String photoPath=galleryPhoto.getPath();
selectedPhoto=photoPath;
try {
Bitmap bitmap=ImageLoader.init().from(photoPath).requestSize(512, 512).getBitmap();
} catch (FileNotFoundException e) {
Toasty.error(getApplicationContext(),
"Something Wrong while choosing photos", Toast.LENGTH_SHORT).show();
}
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
int CAMERA_RESULT=11100;
if(requestCode == CAMERA_RESULT){
if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED){
try {
getImageFromCamera();
} catch (IOException e) {
e.printStackTrace();
}
}
else{
Toasty.error(getApplicationContext(), "Permission Needed.", Toast.LENGTH_LONG).show();
}
}
else {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
if(requestCode == PICK_IMAGE){
if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED){
getImageFromGallery();
}
else{
Toasty.error(getApplicationContext(), "Permission Needed.", Toast.LENGTH_LONG).show();
}
}
else {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
}
画廊图片代码
public class GalleryPhoto {
final String TAG = this.getClass().getSimpleName();
private Context context;
private Uri photoUri;
public void setPhotoUri(Uri photoUri) {
this.photoUri = photoUri;
}
public GalleryPhoto(Context context) {
this.context = context;
}
public Intent openGalleryIntent() {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction("android.intent.action.GET_CONTENT");
return Intent.createChooser(intent, this.getChooserTitle());
}
public String getChooserTitle() {
return "Select Pictures";
}
public String getPath() {
String path;
if (VERSION.SDK_INT < 11) {
path = RealPathUtil.getRealPathFromURI_BelowAPI11(this.context, this.photoUri);
} else if (VERSION.SDK_INT < 19) {
path = RealPathUtil.getRealPathFromURI_API11to18(this.context, this.photoUri);
} else {
path = RealPathUtil.getRealPathFromURI_API19(this.context, this.photoUri);
}
return path;
}
}
相机图像代码
public class CameraPhoto {
final String TAG = this.getClass().getSimpleName();
private String photoPath;
private Context context;
public String getPhotoPath() {
return this.photoPath;
}
public CameraPhoto(Context context) {
this.context = context;
}
public Intent takePhotoIntent() throws IOException {
Intent in = new Intent("android.media.action.IMAGE_CAPTURE");
if (in.resolveActivity(this.context.getPackageManager()) != null) {
File photoFile = this.createImageFile();
if (photoFile != null) {
in.putExtra("output", Uri.fromFile(photoFile));
}
}
return in;
}
private File createImageFile() throws IOException {
String timeStamp = (new SimpleDateFormat("yyyyMMdd_HHmmss")).format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(imageFileName, ".jpg", storageDir);
this.photoPath = image.getAbsolutePath();
return image;
}
public void addToGallery() {
Intent mediaScanIntent = new Intent("android.intent.action.MEDIA_SCANNER_SCAN_FILE");
File f = new File(this.photoPath);
Uri contentUri = Uri.fromFile(f);
mediaScanIntent.setData(contentUri);
this.context.sendBroadcast(mediaScanIntent);
}
}
有一个不错的库,叫做 "Android PDF Writer"。
您要做的是在其中创建一个 PDF 对象和一个页面。
PDFWriter mPDFWriter = new PDFWriter(PaperSize.FOLIO_WIDTH, PaperSize.FOLIO_HEIGHT);
然后您可以通过 addImage
添加图片,通过 newPage()
您可以在项目demo page here中看到一个演示。