如果一页不够,可分多页打印 pdf

问题描述 投票:0回答:1

我正在尝试从布局创建 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;


    }`
java android pdf bitmap android-viewpager
1个回答
0
投票

这实际上取决于您如何生成布局(您在问题中没有显示)以及布局显示的内容以及您希望跨多个页面的拆分效果如何。

有 2 个主要策略:-

  1. 只需将位图拆分为多个位图并将每个新位图放在新页面上即可。这不会产生很好的结果,因为很难在逻辑位置分割位图(即不在一行文本的中间)

  2. 使用 PDF 的视图 Just 将视图直接绘制到 PDF 画布上,该视图永远不会显示在屏幕上(此视图永远不会显示在屏幕上的原因是 A4 页面宽 595 像素,高 842 像素)并且与设备显示屏的尺寸不匹配)。这样做的优点是 PDF 是可编辑的,因为文本是文本而不是文本的图片,PDF 在屏幕上缩放得更好并且尺寸更小。它还允许您重新格式化每个页面。

我的应用程序实际上混合使用了两种策略,因为它还想为每个 PDF 页面生成 facebook 的 png,但主要策略是 2.“直接绘制”

所以总结一下“直接画”的方法。

  1. 您可以在 LinearLayout 中将布局生成为多个视图(使拆分更容易)

  2. 创建您想要在 LinearLayout 中添加为行的

    ArrayList
    视图,并以编程方式创建每个视图并将它们添加到 ArrayList

  3. 将所有视图添加到 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. 再次迭代数组列表,将视图添加回线性布局,直到累积高度小于 A4 页面的最大高度(842 像素)。

然后重新测量和布局以再次定位所有内容,以使所有内容都显示在屏幕上。

将此布局绘制到 PDF 页面(或位图)的画布上

  1. 对每个 PDF 页面重复步骤 4 和 5(删除所有视图,然后将下一页行集添加到 LinearLayout。然后测量/布局此页面并绘制到画布。

执行此操作,直到所有行都绘制到多个 PDF 页面。


关键是测量所有视图元素的高度,这样您就可以计划可以添加到布局中的数量以适合 PDF 页面。

这就是我在 PDF 的多个页面上显示视图的方式(实际上,我将视图的宽度调整为换行内容,并计算出一个比例,将其调整为 A4 宽度,并计算该比例下的高度使单页并添加足够的元素来填充该页面,然后创建该页面的位图并通过设置 pdf 画布上的比例将位图添加到 pdf 页面的画布中。我采用这种混合方法的原因是,以及分页的 pdf我还希望将每个页面的 Png 放在 Facebook 上)

关键实际上是将视图生成分成多个视图

© www.soinside.com 2019 - 2024. All rights reserved.