Android - PdfDocument - 将LinearLayout分解为多个pdf页面

时间:2017-02-03 11:23:29

标签: android pdf

我有一个android线性布局,我想将其转换为PDF。很多时候,这个PDF将跨越多个页面。虽然我能够将内容转换为单页PDF,但在将PDF分解为多页PDF时遇到一些困难。我已经给出了下面的相关代码块,为了简单起见,硬编码了一些数字。这里,PdfDocument.PageInfo.Builder有3个参数 - 宽度,高度和页码(早先,它用于接受新的Rect(0,0,800,100),它在API 23中不再起作用)。现在,当我遍历for循环时,我不确定如何为多页PDF获取不同的内容。下面给出的当前代码片段为每个页面生成相同的内容,因为它基于宽度和高度而不是基于坐标。

    PdfDocument.PageInfo pageInfo;
    int noOfPages = (int)Math.floor(content.getHeight()/1000)+1;
    for (int i=1;i<=noOfPages;i++) {
        pageInfo = new PdfDocument.PageInfo.Builder
                (800,1000,i).create();
        PdfDocument.Page page = document.startPage(pageInfo);
        content.draw(page.getCanvas());
        document.finishPage(page);
    }

2 个答案:

答案 0 :(得分:4)

自从我上次处理PDF文档以来已经超过2年了,很抱歉我的问题没有确切的答案,但我会分享我的小知识,希望它能帮到你。

  1. 在Android PDF文档中,我们将为个人PDFPage提供视图。
  2. 在创建PDFPage时,我们将使用Width&amp; PDFPage的高度(A4尺寸为598px * 842px)。
  3. 因此,您提供的写PDFPage的大小也应与PDFPage大小相同。
  4. 因此,我认为我们有责任为具有正确尺寸(宽度和高度)的个人页面创建View,以匹配PDFPage大小(宽度和高度)。
  5. PDF文档是转储,您将为其将要编写的PDFPage提供哪些视图,因此我们有责任为单个页面创建视图&amp;把它交给PDFDocument。
  6. <强>示例

    看看我写回2年的代码,这可能会对你有帮助 - https://gist.github.com/apvasanth03/ed903535aed12c93e30b102d9596c399

    注意

    如果包含带有多行的TextView,如何将视图分成不同的页面将会很困难。我没有答案。

    请告知,如果您找到任何解决方案,请分享。

答案 1 :(得分:0)

我做了什么..所以我刚刚完成了该实现并遇到了很多坑坑洼洼的情况,我尝试只获取视图绘制缓存并将其写入pdf文档,但这有效,但是没有给我我想要的结果页面尺寸问题居中等问题,我也遇到了布局过大的问题,一次或两次,最终我要做的是以编程方式创建一个布局并计算出所有可以很好地使用的尺寸,(如果进行了大量工作)我用

getResources().getDimensionPixelSize(R.dimen.your_dimen)

为了从dp到像素获得合适的尺寸并计算出页面中可以容纳多少视图,我制作了一种看起来像这样的图表

   //                 This needs to resemble an A4 piece of paper
   //          <--------              W 2480                -------->
   //borderH   |                                                    |   |
   //       ^  |                                                    |   |
   //  59dp |  |                                                    |   |
   //  105px|  |                                                    |   |
   //       v  |                                                    |   |
   //    ^     |    vertical linear layout                          |   |
   //   DHH    |    ______________________________________________  |   |
   //   32dp   |    | Date header                                 | |   |
   //   84px   |    """"""""""""""""""""""""""""""""""""""""""""""  |   |
   //    v     |                                                    |   |
   //    ^     |                                                    |   |
   // padding  |    <Horizontal Linear layout>                      |   |
   //  16dp    |                                                    |   |
   //  42px    |                                                    |   |
   //    v     |     ______      ______      ______      ______     |   |
   //    ^     |    |      |    |      |    |      |    |      |    |    > H 3508px     // overall height
   //   CHH    |<-->| Card |<-->| Card |<-->| Card |<-->| Card |<-->|   |
   //  118dp   |40dp|      |16dp|      |16dp|      |16dp|      |40dp|   |
   //  310px   |105px------ 42px ------ 42px ------42px  ------105px|   |
   //    v     |                                                    |   |
   //borderH   |                                                    |   |
   //       ^  |                                                    |   |
   //  40dp |  |                                                    |   |
   //  105px|  |                                                    |   |
   //       v  |__________________Bottom of page____________________|  _|

使用此图,我计算出页面上可以容纳多少标题或卡片行,并在添加视图时对其进行了检查;如果太大,则添加新的父线性布局(页面),将所有这些页面添加到列表中视图,然后为每个页面启动一个新的pdf文档页面,将其添加到文档中并将其写入文件

这是我最终得到的代码,尽管它仍在进行中

https://github.com/martipello/SimpleAAC/blob/master/app/src/main/java/com/sealstudios/simpleaac/settings/PdfSettingsActivity.java