我正在将 pdf 页面转换为位图,以便能够在我的应用程序中对其进行更改,然后我正在使用 pdfdocument 类创建带有位图的 pdf 文件,但当我在其他 pdf 编辑器应用程序上打开它时,最终的 pdf 文件没有可选择的文本
有没有办法在这些位图上应用文本数据,以便在创建 pdf 文件时可以选择它们
public void createpdf() throws IOException {
PdfDocument document = new PdfDocument();
for (int i = 0; i < pdfBitmaps.size(); i++) {
Bitmap bitmap = pdfBitmaps.get(i);
PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(1080, 1920, i+ 1).create();
PdfDocument.Page page = document.startPage(pageInfo);
// Draw the bitmap onto the page
Canvas canvas = page.getCanvas();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 0, bos);
Bitmap decoded = BitmapFactory.decodeStream(new ByteArrayInputStream(bos.toByteArray()));
canvas.drawBitmap(decoded, 0f, 0f, null);
document.finishPage(page);
}
ContentResolver contentResolver = getContentResolver();
ContentValues values = new ContentValues();
values.put(MediaStore.Files.FileColumns.DISPLAY_NAME, "fınal_pdf_deneme");
values.put(MediaStore.Files.FileColumns.MIME_TYPE, "application/pdf");
values.put(MediaStore.Files.FileColumns.RELATIVE_PATH,Environment.DIRECTORY_DOCUMENTS);
Uri uri = ontentResolver.insert(MediaStore.Files.getContentUri("external"),values);
if (uri != null) {
try (OutputStream outputStream = contentResolver.openOutputStream(uri)) {
document.writeTo(outputStream);
Toast.makeText(this, "File saved successfully", Toast.LENGTH_SHORT).show();
Log.d("PDF Directory", uri.toString());
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(this, "Failed to save file", Toast.LENGTH_SHORT).show();
} finally {
document.close();
}
} else {
Toast.makeText(this, "Failed to create document", Toast.LENGTH_SHORT).show();
}
}
实际上不可能用
PdfDocument
类做你想做的事情,因为它无法编辑现有的 PDF,它只能创建新的 PDF。
一旦将现有 PDF 渲染为位图,您就会失去所有结构和选择性,它只是变成 pdf 中所有元素的图片。
如果您使用
PdfDocument
类及其画布将位图绘制到 PDF,那么您只是将所有元素的图片添加到 PDF,这是不可选择的。
如果您在
drawText
画布上使用画布 PdfDocument
方法,那么这将转换为可选择的本机 PDF 文本元素。
你确实需要使用一个可以编辑 PDF 结构的类,比如 Apache PdfBox,它是 Android 版本
这样,您可以加载文档并将其渲染为位图来显示,但是当您想要添加文本时,您可以将文本添加到内容流中您想要的位置(示例)并重新渲染以显示包含您所做更改的原始文档。