如何在Activity_2中创建包含Activity_1图片的Android PDF文件
嘿,这个需求其实很好实现,我给你梳理一套完整的步骤,跟着做就能搞定!
实现思路与步骤
核心就是两步:先把Activity_1里的ImageView图片拿到并传递/保存到Activity_2,再用PDF生成库把图片写入PDF文件。
一、获取并传递Activity_1中的ImageView图片
这里给你两种方案,根据图片大小选就行:
方案1:通过Intent传递Bitmap(适合小尺寸图片)
如果你的图片不大,直接把Bitmap转成字节数组通过Intent传过去最方便:
在Activity_1的"Go to Next"按钮点击事件里写:
// 获取ImageView的Bitmap(记得替换成你的ImageView ID) ImageView imageView = findViewById(R.id.your_image_view_id); Bitmap bitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap(); // 压缩Bitmap成字节数组,避免Intent传递过大数据报错 ByteArrayOutputStream stream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); byte[] byteArray = stream.toByteArray(); // 启动Activity_2并传递图片数据 Intent intent = new Intent(Activity_1.this, Activity_2.class); intent.putExtra("ACTIVITY1_IMAGE", byteArray); startActivity(intent);
然后在Activity_2里接收这个Bitmap:
// 在onCreate里获取传递过来的图片数据 byte[] imageBytes = getIntent().getByteArrayExtra("ACTIVITY1_IMAGE"); Bitmap activity1Bitmap = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length);
方案2:保存到本地存储(适合大尺寸图片)
如果图片比较大,Intent传递容易出问题,那就先把图片存到App的内部存储,再到Activity_2里读取:
在Activity_1的按钮点击事件里:
ImageView imageView = findViewById(R.id.your_image_view_id); Bitmap bitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap(); // 保存到App内部存储(只有当前App能访问,安全) FileOutputStream fos = null; try { fos = openFileOutput("activity1_image.png", Context.MODE_PRIVATE); bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); } catch (IOException e) { e.printStackTrace(); } finally { if (fos != null) { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } // 启动Activity_2 startActivity(new Intent(Activity_1.this, Activity_2.class));
然后在Activity_2里读取这个图片:
// 读取内部存储的图片 File imageFile = new File(getFilesDir(), "activity1_image.png"); Bitmap activity1Bitmap = BitmapFactory.decodeFile(imageFile.getAbsolutePath());
二、在Activity_2中生成包含图片的PDF
这里推荐用iTextG(iText的Android专用版本)来生成PDF,简单好用。
1. 添加依赖
打开你的Module级build.gradle文件,在dependencies里添加:
implementation 'com.itextpdf:itextg:5.5.10'
然后同步一下项目。
2. 实现CreatePDF按钮的点击逻辑
首先要处理存储权限(因为要把PDF存到手机里),然后写生成PDF的代码:
public class Activity_2 extends AppCompatActivity { private Bitmap activity1Bitmap; private static final int STORAGE_PERMISSION_REQUEST = 101; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_2); // 先获取Activity_1传递/保存的Bitmap(替换成你用的方案代码) // 比如用方案1的话: byte[] imageBytes = getIntent().getByteArrayExtra("ACTIVITY1_IMAGE"); activity1Bitmap = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length); // 绑定CreatePDF按钮 Button createPdfBtn = findViewById(R.id.create_pdf_btn); createPdfBtn.setOnClickListener(v -> { // 先检查存储权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, STORAGE_PERMISSION_REQUEST); } else { // 权限已获取,生成PDF generateImagePdf(); } }); } // 生成PDF的核心方法 private void generateImagePdf() { // 把PDF保存到系统Download目录,方便用户找到 File pdfFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "Activity1_Image.pdf"); try { // 初始化PDF文档 Document document = new Document(); PdfWriter.getInstance(document, new FileOutputStream(pdfFile)); document.open(); // 把Bitmap转成iText能识别的Image对象 ByteArrayOutputStream stream = new ByteArrayOutputStream(); activity1Bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); Image pdfImage = Image.getInstance(stream.toByteArray()); // 调整图片大小适配PDF页面,避免超出边界 float pageWidth = document.getPageSize().getWidth() - document.leftMargin() - document.rightMargin(); pdfImage.scaleToFit(pageWidth, document.getPageSize().getHeight() - document.topMargin() - document.bottomMargin()); // 设置图片居中显示 pdfImage.setAlignment(Image.ALIGN_CENTER); // 把图片添加到PDF里 document.add(pdfImage); document.close(); // 提示用户生成成功 Toast.makeText(this, "PDF已生成!请到Download目录查看", Toast.LENGTH_LONG).show(); } catch (Exception e) { e.printStackTrace(); Toast.makeText(this, "生成失败:" + e.getMessage(), Toast.LENGTH_SHORT).show(); } } // 处理权限申请结果 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == STORAGE_PERMISSION_REQUEST) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { generateImagePdf(); } else { Toast.makeText(this, "需要存储权限才能生成PDF哦", Toast.LENGTH_SHORT).show(); } } } }
3. 配置权限
在AndroidManifest.xml里添加存储权限:
<!-- Android 10及以上不需要这个权限,但为了兼容低版本还是加上 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28"/>
小提示
如果你的ImageView是加载的网络图片,记得要等图片完全加载完成后再获取Bitmap!比如用Glide的话,可以用listener回调来获取加载后的Bitmap:
Glide.with(this) .asBitmap() .load("你的图片URL") .listener(new RequestListener<Bitmap>() { @Override public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Bitmap> target, boolean isFirstResource) { return false; } @Override public boolean onResourceReady(Bitmap resource, Object model, Target<Bitmap> target, DataSource dataSource, boolean isFirstResource) { // 这里拿到加载好的Bitmap,再执行传递/保存逻辑 return false; } }) .into(imageView);
内容的提问来源于stack exchange,提问作者Amila
相关产品推荐
相关产品推荐

