1.首先讲一下将文本和图片写入到pdf文件这个功能实现的思路
获取PdfDocument对象-->通过page.getCanvas()获取一个Canvas对象-->在这个Canvas上进行绘制你想要的内容-->完成后调用document.finishPage()方法,并通过FileOutputStream将数据输出
2.读取手机里的pdf文件数据并进行展示
这个建议直接使用现有的框架
添加依赖:implementation 'com.joanzapata.pdfview:android-pdfview:1.0.4@aar'
pdfView.fromFile(fileUrl) //本地pdf文件地址
.defaultPage(1) // 显示页码,默认显示第1页
.onPageChange(PDFOpenReport.this) //翻页监听
.onLoad(this) //加载监听
.onDraw(this) //绘图监听
.showMinimap(false)
.swipeVertical(false) // 垂直翻页,默认是左右滑动翻页
.enableSwipe(true) // 是否允许翻页,默认是允许翻页
.load();
这里需要注意的是fromFile()是读取手机存储里的文件,而fromAsset是读取Assets文件夹里面的文件要注意区分。
本篇着重说一下写入的过程,其实就是在Canvas上绘制的过程
// 检测手机存储环境
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
final File dirs = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "ABC/report");
if (dirs.exists()) {
// ...
} else {
dirs.mkdirs();
}
// 初始化PdfDocument
PdfDocument document = new PdfDocument();
/***pdf文件的宽 高 页数******/ 这里默认是1页
PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(width, height, 1).create();
PdfDocument.Page page = document.startPage(pageInfo);
Canvas canvas = page.getCanvas();
//? 绘制文字
Paint mPaint = new Paint();
mPaint.setStrokeWidth(10);
mPaint.setTextSize(60);
mPaint.setFakeBoldText(true);
mPaint.setColor(Color.BLACK);
mPaint.setTextAlign(Paint.Align.CENTER);
String text = "***报告";
canvas.drawText(text, width / 2, 70, mPaint);
// 绘制图片(先缩放图片然后在将写入的图片放在一行的中间位置)
Matrix matrix = new Matrix();
matrix.setScale(0.5f, 0.5f);
int bitMapWidth = showBitmap.getWidth();
int bitMapHeight = showBitmap.getHeight();
Bitmap bm = Bitmap.createBitmap(showBitmap, 0, 0, showBitmap.getWidth(),
showBitmap.getHeight(), matrix, true);
canvas.drawBitmap(bm, (float) ((width - (bitMapWidth * 0.5)) / 2), 230, mPaint1);
这里需要注意的是缩放的应用,因为现在的手机照片寸尺很大,如果直接写进去会导致图片信息显示不全。
// 写入数据并保存
document.finishPage(page);
File file1 = new File(dirs, fileTitle + ".pdf");
try {
FileOutputStream mFileOutStream = new FileOutputStream(file1);
document.writeTo(mFileOutStream);
mFileOutStream.flush();
mFileOutStream.close();
} catch (Exception e) {
e.printStackTrace();
}
Toast.makeText(BasePreviewActivity.this, "***报告保存完成", Toast.LENGTH_SHORT).show();
document.close();
就写这么多了!day day up!
|