android 如果一页不够,可以多页打印PDF

f45qwnt8  于 2023-08-01  发布在  Android
关注(0)|答案(1)|浏览(159)

我试图从布局创建一个PDF;我将布局转换为位图,然后打印到PDF页面。应用程序将输出转换为一个长的PDF页面,但我想将位图分成几个部分,然后在多个PDF页面中打印每个A4大小,如果第一页不够,请创建第二页并在其上打印剩余部分。
我该怎么做?

private void generatePdfFromView(View view) {

    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;
}

字符串

muk1a3rh

muk1a3rh1#

这实际上取决于你如何生成你的布局(你没有在你的问题中显示),你的布局显示什么,以及你希望在多个页面之间的分割有多好。
主要有两种策略:
1.只需将位图拆分为多个位图,并将每个新位图放在新页面上即可。这不会产生很好的结果,因为很难在逻辑位置分割位图(即不在文本行的一半)
1.使用PDF的视图Just将视图直接绘制到PDF画布,该视图从不显示在屏幕上(此视图从不显示在屏幕上的原因是A4页面的宽度为595像素,高度为842像素,与设备显示屏的大小不匹配)。这样做的优点是PDF是可编辑的,因为文本是文本而不是文本的图片,PDF在屏幕上的缩放效果更好,尺寸也更小)。它还允许您重新设置每个页面的格式。
我的应用程序实际上使用了这两种策略的混合,因为它也想为每个PDF页面的facebook产生png的,但主要的策略是2.“直接绘制”
所以总结一下“画直”的方法。
1.您可以在LinearLayout中以多个视图的形式生成布局(便于拆分)
1.创建一个ArrayList个视图,将其作为行添加到LinearLayout中,并以编程方式创建每个视图,然后将其添加到ArrayList中
1.将所有视图添加到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())

字符串
这将调整所有视图的大小
1.从线性布局中删除所有视图

linearLayout.removeAllViews();


1.再次迭代arraylist,将视图添加回linearLayout,直到累积高度不足一行,超过A4页面的最大高度(842像素)。
然后重新测量和布局,再次定位一切,使一切在屏幕上。
将此布局绘制到PDF页面(或位图)的画布上
1.对每个PDF页面重复步骤4和5(删除所有视图,然后将下一个页面行集添加到LinearLayout)。然后测量/布局此页面并绘制到画布上。
执行此操作,直到所有行都绘制到多个PDF页面。
关键是测量所有视图元素的高度,这样您就可以计划您可以添加多少布局,以适应PDF页面。
这就是我在PDF的多个页面上显示视图的方式(我实际上将视图的宽度调整为“Wrap Content”,并计算出一个比例,将其调整为A4宽度,计算出在该比例下构成一个页面的高度,并添加足够的元素来填充该页面,然后创建该页面的位图,并通过在PDF的画布上设置比例将位图添加到PDF页面的画布上。我之所以采用这种混合方法,是因为除了将视图的PDF分页外,我还希望将每个页面的Png放在Facebook上)
实际上,关键是要将视图生成拆分为多个视图

相关问题