我正在尝试从布局创建 PDF; 我将布局转换为位图,然后打印到 pdf 页面中。 该应用程序将输出转换为一个长 PDF 页面,但我想将位图分成几个部分,然后打印在多个 PDF 页面中,每个页面为 A4 尺寸, 如果第一页不够,请创建第二页并打印剩余部分..
我该怎么做?
` private voidgeneratePdfFromView(视图视图){
Bitmap bitmap = getBitmapFromView(view);
document = new PdfDocument();
PdfDocument.PageInfo myPageInfo = new PdfDocument.PageInfo.Builder(view.getWidth(),view.getHeight(),1).create();
PdfDocument.Page myPage = document.startPage(myPageInfo);
Canvas canvas = myPage.getCanvas();
canvas.drawBitmap(bitmap,0,0,null);
document.finishPage(myPage);
PdfDocument.PageInfo myPageInfo1 = new PdfDocument.PageInfo.Builder(view.getWidth(),view.getHeight(),2).create();
PdfDocument.Page myPage1 = document.startPage(myPageInfo1);
Canvas canvas1 = myPage1.getCanvas();
canvas1.drawBitmap(bitmap,0,0,null);
document.finishPage(myPage1);
createFile();
}
private Bitmap getBitmapFromView(View view) {
Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(),view.getHeight(),Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(returnedBitmap);
Drawable bgDrawable = view.getBackground();
if (bgDrawable != null){
bgDrawable.draw(canvas);
} else {
canvas.drawColor(Color.WHITE);
}
view.draw(canvas);
return returnedBitmap;
}`
这实际上取决于您如何生成布局(您在问题中没有显示)以及布局显示的内容以及您希望跨多个页面的拆分效果如何。
有 2 个主要策略:-
只需将位图拆分为多个位图并将每个新位图放在新页面上即可。这不会产生很好的结果,因为很难在逻辑位置分割位图(即不在一行文本的中间)
使用 PDF 的视图 Just 将视图直接绘制到 PDF 画布上,该视图永远不会显示在屏幕上(此视图永远不会显示在屏幕上的原因是 A4 页面宽 595 像素,高 842 像素)并且与设备显示屏的尺寸不匹配)。这样做的优点是 PDF 是可编辑的,因为文本是文本而不是文本的图片,PDF 在屏幕上缩放得更好并且尺寸更小。它还允许您重新格式化每个页面。
我的应用程序实际上混合使用了两种策略,因为它还想为每个 PDF 页面生成 facebook 的 png,但主要策略是 2.“直接绘制”
所以总结一下“直接画”的方法。
您可以在 LinearLayout 中将布局生成为多个视图(使拆分更容易)
创建您想要在 LinearLayout 中添加为行的
ArrayList
视图,并以编程方式创建每个视图并将它们添加到 ArrayList
将所有视图添加到 LinearLayout,然后测量并布局 LinearLayout
for ( int c = 0; c < viewArrayList.size(); c++){
linearLayout.addView(classTables.get(c));
}
linearLayout.measure(
// Measure to A4 width
View.MeasureSpec.makeMeasureSpec(595, View.MeasureSpec.EXACTLY
),
// Measure to as high as the view needs
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
)
)
// Layout the view out to the measure dimensions
linearLayout.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight())
这将调整所有视图的大小
linearLayout.removeAllViews();
然后重新测量和布局以再次定位所有内容,以使所有内容都显示在屏幕上。
将此布局绘制到 PDF 页面(或位图)的画布上
执行此操作,直到所有行都绘制到多个 PDF 页面。
关键是测量所有视图元素的高度,这样您就可以计划可以添加到布局中的数量以适合 PDF 页面。
这就是我在 PDF 的多个页面上显示视图的方式(实际上,我将视图的宽度调整为换行内容,并计算出一个比例,将其调整为 A4 宽度,并计算该比例下的高度使单页并添加足够的元素来填充该页面,然后创建该页面的位图并通过设置 pdf 画布上的比例将位图添加到 pdf 页面的画布中。我采用这种混合方法的原因是,以及分页的 pdf我还希望将每个页面的 Png 放在 Facebook 上)
关键实际上是将视图生成分成多个视图