将 PDF 文件的内容绘制到 Canvas
Draw contents of a PDF file to a Canvas
我的 Android 应用正在使用 PdfDocument 以编程方式生成多页 PDF 文件:
public byte[] buildPDF() {
int pageWidth = Math.round(8.5f * 72f);
int pageHeight = Math.round(11.0f * 72f);
int margin = Math.round(.5f * 72f);
int fontSize = 12;
TextPaint textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
textPaint.setColor(Color.BLACK);
textPaint.setTextSize(fontSize);
textPaint.setTypeface(Typeface.DEFAULT_BOLD);
PdfDocument document = new PdfDocument();
PdfDocument.Page page = null;
Canvas canvas = null;
for (int i=0; i<10; i++) {
PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(pageWidth, pageHeight, document.getPages().size()).create();
page = document.startPage(pageInfo);
canvas = page.getCanvas();
String content = "Content for page " + (i + 1);
canvas.drawText(content, margin, margin + fontSize, textPaint);
document.finishPage(page);
}
byte[] output = new byte[0];
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try {
document.writeTo(outputStream);
} catch (Exception e) {
Log.d("buildPDF", "error writing PDF output");
return output;
}
output = outputStream.toByteArray();
document.close();
return output;
}
在某些情况下,我想将本地设备中现有的PDF 文件放入这一系列页面中。最简单的工作流程是以某种方式打开 PDF 文件作为数据,然后将其写入 canvas。 Android SDK 有什么方法可以做到这一点吗?
这在 iOS 中使用 CGPDFDocumentRef
和 CGContextDrawPDFPage
很容易,但我还没有找到 Android 的等效项。
如果没有内置方法,那么 Apache PDFBox 中的 multipdf
包似乎可以胜任。但是,我需要内存中的数据,如上所示,所以我认为这需要将生成的数据写入临时文件,对临时文件执行操作,然后将数据读回内存。
My Android app is generating multi-page PDF files programmatically using PdfDocument:
请注意,PdfDocument
设计用于打印,而不是用于创建任意 PDF 文件。
The easiest workflow would be to somehow open the PDF file as data, then write it to the canvas. Is there any way to do this with the Android SDK?
不,抱歉。
CommonsWare 回答了我的具体问题(SDK 无法做到这一点),但这里有一些关于第三方工具的更多信息:
我尝试了 Apache PDFBox,然后意识到它与 Android 不兼容。然后我找到了 PdfBox-Android 并尝试安装它,但是 运行 遇到了从 "The number of Dex files cannot exceed 64,000...." 开始的一系列构建问题我花了几个小时试图让它在我感觉自己开始之前构建一场徒劳的追逐,我继续前进。
iTextG 在这种情况下经常出现,但我一直遵循的规则是,如果软件公司不在其网站上列出价格,我可以'买不起。我确实继续发送了价格请求,但他们将我的请求转发给了经销商,然后经销商的回复进入了我的垃圾邮件文件夹,直到为时已晚我才看到。它们的成本没有我担心的那么高,但考虑到 PDF 在我的应用程序中所起的作用相对较小,仍然不太可行。
我已经在我的应用程序中使用 Radaee PDF 作为 PDF 查看器,我意识到它包含一些文档编辑和合并功能。我无法让它与我使用的旧库版本一起使用,但在他们技术支持的帮助下,我能够为当前版本更新我的项目,并且成功了。这需要 Premium 许可证,但他们提供的固定费用定价结构对我的项目来说并非遥不可及。
所以,我花了一周的大部分时间来处理第三方库和解决兼容性问题,但是一旦这是 运行,只需要 14 行代码就可以获得我想要的功能。这是为什么软件开发时间如此难以估计的一个很好的例子......大声笑。
我的 Android 应用正在使用 PdfDocument 以编程方式生成多页 PDF 文件:
public byte[] buildPDF() {
int pageWidth = Math.round(8.5f * 72f);
int pageHeight = Math.round(11.0f * 72f);
int margin = Math.round(.5f * 72f);
int fontSize = 12;
TextPaint textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
textPaint.setColor(Color.BLACK);
textPaint.setTextSize(fontSize);
textPaint.setTypeface(Typeface.DEFAULT_BOLD);
PdfDocument document = new PdfDocument();
PdfDocument.Page page = null;
Canvas canvas = null;
for (int i=0; i<10; i++) {
PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(pageWidth, pageHeight, document.getPages().size()).create();
page = document.startPage(pageInfo);
canvas = page.getCanvas();
String content = "Content for page " + (i + 1);
canvas.drawText(content, margin, margin + fontSize, textPaint);
document.finishPage(page);
}
byte[] output = new byte[0];
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try {
document.writeTo(outputStream);
} catch (Exception e) {
Log.d("buildPDF", "error writing PDF output");
return output;
}
output = outputStream.toByteArray();
document.close();
return output;
}
在某些情况下,我想将本地设备中现有的PDF 文件放入这一系列页面中。最简单的工作流程是以某种方式打开 PDF 文件作为数据,然后将其写入 canvas。 Android SDK 有什么方法可以做到这一点吗?
这在 iOS 中使用 CGPDFDocumentRef
和 CGContextDrawPDFPage
很容易,但我还没有找到 Android 的等效项。
如果没有内置方法,那么 Apache PDFBox 中的 multipdf
包似乎可以胜任。但是,我需要内存中的数据,如上所示,所以我认为这需要将生成的数据写入临时文件,对临时文件执行操作,然后将数据读回内存。
My Android app is generating multi-page PDF files programmatically using PdfDocument:
请注意,PdfDocument
设计用于打印,而不是用于创建任意 PDF 文件。
The easiest workflow would be to somehow open the PDF file as data, then write it to the canvas. Is there any way to do this with the Android SDK?
不,抱歉。
CommonsWare 回答了我的具体问题(SDK 无法做到这一点),但这里有一些关于第三方工具的更多信息:
我尝试了 Apache PDFBox,然后意识到它与 Android 不兼容。然后我找到了 PdfBox-Android 并尝试安装它,但是 运行 遇到了从 "The number of Dex files cannot exceed 64,000...." 开始的一系列构建问题我花了几个小时试图让它在我感觉自己开始之前构建一场徒劳的追逐,我继续前进。
iTextG 在这种情况下经常出现,但我一直遵循的规则是,如果软件公司不在其网站上列出价格,我可以'买不起。我确实继续发送了价格请求,但他们将我的请求转发给了经销商,然后经销商的回复进入了我的垃圾邮件文件夹,直到为时已晚我才看到。它们的成本没有我担心的那么高,但考虑到 PDF 在我的应用程序中所起的作用相对较小,仍然不太可行。
我已经在我的应用程序中使用 Radaee PDF 作为 PDF 查看器,我意识到它包含一些文档编辑和合并功能。我无法让它与我使用的旧库版本一起使用,但在他们技术支持的帮助下,我能够为当前版本更新我的项目,并且成功了。这需要 Premium 许可证,但他们提供的固定费用定价结构对我的项目来说并非遥不可及。
所以,我花了一周的大部分时间来处理第三方库和解决兼容性问题,但是一旦这是 运行,只需要 14 行代码就可以获得我想要的功能。这是为什么软件开发时间如此难以估计的一个很好的例子......大声笑。