Android 导出PDF PdfDocument

2023-05-16


/**
 * 导出PDF
 *
 * @param view            要导出的view,如果view高度过高(超过一屏的高度),在改view外部套一层Scrollview即可
 *                        如果要导出列表类型View 比如Listview Recyclerview ,会遇见导出不全的情况,这里提前绘制view即可,方法如下
 *                        binding.mReDetail.measure(
 *                        View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
 *                        View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
 *                        );
 *                        binding.mReDetail.layout(0, 0, binding.mReDetail.getMeasuredWidth(), binding.mReDetail.getMeasuredHeight());
 * @param fileDir         导出文件夹
 * @param fileName        导出文件名称
 * @param fileNameReplace 文件名称存在时,是否需要替换
 * @return
 */
public static boolean createPdfFromView(View view, String fileDir, String fileName, boolean fileNameReplace) {
        try {
            if (view == null || fileDir == null || fileName == null) {
                Log.e(TAG, "导出PDF" + "入参为空");
                return false;
            }
            String s = Environment.getExternalStorageDirectory() + "/" + fileDir;
//            String mSDCardFolderPath = context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS) + "/" + fileDir;
            File dir = new File(s);
            //判断文件是否存在
            if (!dir.exists()) {
                //不存在则创建
                dir.mkdirs();
            }
            File pdfFile = new File(dir, fileName + ".PDF");
            if (!pdfFile.exists()) {
                pdfFile.createNewFile();
            } else {
                if (fileNameReplace) {
                    String newFileName = getPDFNewFileName(pdfFile);
                    pdfFile = new File(newFileName);
                    pdfFile.createNewFile();
                }
            }

            PdfDocument document = new PdfDocument();
            //页对象
            PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(
                    view.getWidth(),
                    view.getHeight(),
                    1)
                    .create();

            // 开始页
            PdfDocument.Page page = document.startPage(pageInfo);
            //绘制页
            Canvas canvas = page.getCanvas();
            view.draw(canvas);
            //结束页
            document.finishPage(page);
            //TODO  需要的话,增加更多页
            //导出文档
            FileOutputStream os = null;

            Log.i(TAG, "导出PDF" + " 开始导出,导出路径:" + pdfFile);
            os = new FileOutputStream(pdfFile);
            document.writeTo(os);
            os.close();
            Log.i(TAG, "导出PDF" + " 导出成功");
            document.close();
            return true;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        }
    }
  

private static String getPDFNewFileName(File file) {
    if (file.exists()) {
        String newPath = file.getPath().substring(0, file.getPath().length() - 4) + "(1).PDF";
        return getPDFNewFileName(new File(newPath));
    } else {
        return file.getPath();
    }
}  

使用方式:


new Thread(new Runnable() {
    @Override
    public void run() {
        boolean pdfFromView = SheetHelper.createPdfFromView(mWeb, "痕迹导出文件夹", "exportPDF", true);
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (pdfFromView) {
                    Toast.makeText(MainActivity2.this, "PDF 导出成功", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(MainActivity2.this, "PDF 导出失败", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
}).start();  

注意:Android 6 以上要动态申请读写权限,Android 10 有私有文件夹限制。

excel 的导入导出:

Android 导入导出excel xls、xlsx_钟情短发姑娘的博客-CSDN博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 导出PDF PdfDocument 的相关文章

  • 如何在android中实现触摸平滑图像橡皮擦?

    我已经从 API 演示中看到了finturePaint java 我想实现触摸平滑橡皮擦 通过在android中触摸移动来擦除部分图像 FingerPaint 告诉我要实现这个 mPaint setXfermode new PorterDu
  • Android Q:file.mkdirs() 返回 false

    我们有一个应用程序 使用外部存储来存储一些临时文件 图像 二进制数据 该代码已经运行了几年 直到最近才发生重大变化 在 Android Q 上它不起作用 File f new File Environment getExternalStor
  • Recyclerview 动态部分不使用任何第三个库

    我想将标头添加到 recyclerview 我正在尝试使用来实现它 Override public int getItemViewType int position depends on your problem if position 0
  • Android 深度链接至 Instagram 应用

    Instagram 已经发布了 iOS 深层链接的 url 方案 但尚未为 Android 创建文档 有没有办法深入链接到 Android 上的 Instagram 应用程序 以转到 Instagram 应用程序中的特定位置 例如 Inst
  • 为什么是 javascript:history.go(-1);无法在移动设备上工作?

    首先 一些背景 我有一个向用户呈现搜索页面 html 表单 的应用程序 填写标准并单击 搜索 按钮后 结果将显示在标准部分下方 在结果列表中 您可以通过单击将您带到新页面的链接来查看单个结果的详细信息 在详细信息页面中 我添加了一个 返回结
  • Android - AudioRecord类不读取数据,audioData和fftArray返回零

    我是 Android 新手 一直在开发音调分析器应用程序 最低 SDK 8 我读了很多关于如何实现 Audiorecord 类的文章 但我想知道为什么它在我录制时不读取任何数据 我尝试显示 audioData 和 fftArray 的值 但
  • Android 构建发布失败,原因为:java.lang.ArrayIndexOutOfBoundsException:213(pr​​oguard 问题)

    我的项目使用调试构建变体构建得很好 但使用发布变体 Android Studio 会抛出 引起原因 java lang ArrayIndexOutOfBoundsException 213 可能是什么问题 如果我设置minifyEnable
  • Android 中如何通过彩信发送图片?

    我正在开发多媒体应用程序 我正在通过相机捕获一张图像 并希望将该图像和文本发送到其他号码 但我不知道如何通过彩信发送图像 MMS 只是一个 http post 请求 您应该使用执行请求额外的网络功能 final ConnectivityMa
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • 我应该释放或重置 MediaPlayer 吗?

    我有自己的自定义适配器类 称为 WordAdapter 并且我正在使用媒体播放器 名为pronounce WordAdapter 类中的全局变量 我有不同的活动 其中每个列表项都有线性布局 名为linearLayout 我正在设置onCli
  • 如何在 Android 中从 WorkManager 取消工作?

    我已经保存了 WorkManagerUUID转换成String在领域数据库中 这是代码 Constraints constraints new Constraints Builder setRequiredNetworkType Netwo
  • Android Studio 缓慢的增量构建

    我已经完成了许多步骤来完善我们的构建系统 those https stackoverflow com questions 16775197 building and running app via gradle and android st
  • Android 如何将总天数准确更改为年、月、日?

    我正在做一个应用程序 该应用程序与根据给定的生日日期输入获取一个人的年龄有关 为此 我从下面的代码中获取从该日期到当前日期的总天数 String strThatDay 1991 05 10 SimpleDateFormat formatte
  • 卡片视图 单击卡片移至新活动

    我是 Android 编程新手 正在研究卡片布局 我想知道如何使其可点击 android clickable true android foreground android attr selectableItemBackground 我的卡
  • 在命令行上卸载 Android SDK 的选定部分

    这与 卸载旧的 Android SDK 版本 https stackoverflow com questions 15182377 uninstall old android sdk versions 除非我想在无头 Linux CI 服务
  • 通过系统应用程序以编程方式静默安装 apk(无需 root)

    我有带有 android sharedUserId android uid system UID 1000 的系统级应用程序 设备未root INSTALL PACKAGES 权限包含在清单中 我可以静默安装下载的 apk 吗 我已经发现这
  • 插件“Android Bundle Support”不兼容

    大家好 自从上次更新以来 当我启动 android studio 时 我遇到了一个非常奇怪的错误 我有这个错误 插件错误 插件 Android Bundle Support 不兼容 直到构建 AI 195 SNAPSHOT 我在网上找不到任
  • Android:如何从网络异步获取搜索建议?

    我创建了一个可搜索的活动 现在 我想添加从网络服务获取的搜索建议 我想异步获取这些建议 根据添加自定义建议 http developer android com guide topics search adding custom sugge
  • Android 屏幕方向错误

    我使用的是 Android HTC HERO 2 1 版本 我写的活动
  • Git 实验分支还是单独的实验存储库?

    我正在开发一个 Android 应用程序 并且在整个开发周期中一直使用 Git 现在 我想构建并发布实验性功能 供人们尝试和安装 同时仍将原始的 稳定的应用程序安装在他们的设备上 现在 这意味着我需要使用不同的包名称 这会更改开发项目中的一

随机推荐