我想使用PdfDocument API创建PDF文档。为此,我创建了一个名为getTicketAsPdf
的演示函数,它还有一个名为addText
的子函数,用于向pdf文档添加文本。
所有似乎都在运行,但是当出现“选择文件”对话框并选择Adobe Reader时,我收到一条错误消息
无法访问此文件。检查位置或网络 再试一次
我了解保存在您的应用程序中的文档需要使用我已经完成的FileProvider
生成Uri,这适用于我使用StringBuilder
生成的CSV文件,但不适用于PDF,所以我不认为问题出在我的FileProvider
。
这是代码
private void getTicketAsPdf() {
try {
int width = 595;
int height = 842;
// create a new document
PdfDocument document = new PdfDocument();
// crate a page description
PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(width, height, 1).create();
// start a page
PdfDocument.Page page = document.startPage(pageInfo);
// get canvas
Canvas canvas = page.getCanvas();
// get color
Paint paint = new Paint();
paint.setColor(Color.parseColor("#ff0000"));
// draw header square
canvas.drawRect(25, 25, width - 25, 50, paint);
addText(canvas, "MY HEADER", "#ffffff", 100, 50, 50, 1);
addText(canvas, "And some simple text", "#FF0000", 25, 100, 100, 1);
// finish the page
document.finishPage(page);
// write the document content
File file = new File(context.getFilesDir(), "test.pdf");
FileOutputStream fileOutputStream = new FileOutputStream(file);
document.writeTo(fileOutputStream);
document.close();
fileOutputStream.close();
// make file available
Uri contentUri = FileProvider.getUriForFile(context, "com.mycompany.myapp.fileprovider", file);
Intent target = new Intent(Intent.ACTION_VIEW);
target.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
target.setDataAndType(contentUri, "application/pdf");
Intent intent = Intent.createChooser(target, "Open File");
context.startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
}
private static void addText(Canvas canvas, String text, String color, int size, int x, int y, int align) {
Paint paint = new Paint();
paint.setColor(Color.parseColor(color));
paint.setTextAlign(align == 0 ? Paint.Align.LEFT : align == 1 ? Paint.Align.CENTER : Paint.Align.RIGHT);
//paint.setTypeface(font);
paint.setTextSize(size);
canvas.drawText(text, x, y, paint);
}
正如我所说,我已经设置了我的FileProvider
,这适用于另一个功能,但只是包装内容不同的PDF,这里是
RES \ XML \ file_paths.xml
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<files-path name="my_files" path="" />
</paths>
的AndroidManifest.xml
<provider android:authorities="com.mycompany.myapp.fileprovider" android:exported="false" android:grantUriPermissions="true" android:name="android.support.v4.content.FileProvider">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" />
</provider>