You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 17:57:33