【问题标题】:Android - PdfDocument - breaking a LinearLayout into multiple pdf pagesAndroid - PdfDocument - 将 LinearLayout 分解为多个 pdf 页面
【发布时间】:2017-02-03 11:23:29
【问题描述】:

我有一个想要转换为 PDF 的 android 线性布局。很多时候,这个 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);
    }

【问题讨论】:

  • 找到解决办法了吗?

标签: android pdf


【解决方案1】:

自从我上次从事 PDFDocument 的工作以来,已经有 2 年多了,所以很抱歉我对您的问题没有确切的答案,但我会分享我对此的一些了解,希望对您有所帮助。

  1. 在 Android PDFDocument 中,我们将为单个 PDFPage 提供 View。
  2. 在创建 PDFPage 时,我们将为 PDFPage 设置宽度和高度(A4 尺寸为 598px * 842px)。
  3. 因此,您为编写 PDFPage 提供的 View 也应与 PDFPage 大小相同。
  4. 所以,我认为我们有责任为单个页面创建具有正确大小(宽度和高度)匹配 PDFPage 大小(宽度和高度)的视图。
  5. PDFDocument 是转储文件,您为 PDFPage 提供的任何视图都会写入,因此我们有责任为单个页面创建视图并将其提供给 PDFDocument。

示例

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

注意

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

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

【讨论】:

  • 非常感谢 Vasanth 的即时回复。我一直在这个问题上打破我的头,但到目前为止,我也在考虑与你的方法相同的路线。再次感谢,感谢您的帮助。
  • 我正在努力解决类似的问题。只是为了检查一下,在 dox 中它说宽度和高度以点(1/72 英寸)而不是像素给出。这是错的吗?
  • a4的宽高为2480 x 3508
  • 嗨@SankararamanSanthanaraman,您找到任何解决方案来破坏布局了吗?
【解决方案2】:

我做了什么.. 所以我刚刚完成了我的实现并遇到了很多坑,我尝试获取视图绘图缓存并将其写入 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 2011-05-01
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多