【问题标题】:How to create PDFs in an Android app? [closed]如何在 Android 应用程序中创建 PDF? [关闭]
【发布时间】:2011-01-30 19:03:24
【问题描述】:

有什么方法可以从 Android 应用程序创建 PDF 文件?

【问题讨论】:

  • 如果 Android 的成像模型从 Qt 中获得一些灵感不是很好吗? Qt 确定生成 PDF 或 SVG 可以像重定向用于在屏幕上绘制的相同代码一样简单。查看 QPrinter、QSvgGenerator 和 QWidget 从 QPaintDevice 的派生模式。
  • iOS 中相同。 PDF 生成是内置的。
  • 我相信奇巧有生成PDF的功能,但不知道这是否向后兼容。我在下面发布了一个选项,以下站点列出了从商业到免费的几个选项:stefan.fenz.at/creating-pdfs-on-android-an-evaluation
  • 可笑的是,这被关闭为“离题”。
  • 这篇文章为什么被关闭了? Stackoverflow 对其范围过于挑剔。这个问题有 175,000 次浏览,作为一个编码资源,这个网站应该允许这样的超级常见的事情,规则需要修改,我们对“离题”的文字文本读得太远了,而不是规则的核心。我已将其标记为重新开放,希望其他人也能投票。

标签: android pdf


【解决方案1】:

如果有人想在 Android 设备上生成 PDF,请执行以下操作:

【讨论】:

  • iText 唯一的问题是它是 GPLv3 许可证,否则您必须购买商业许可证。
  • 和早期版本的 iText 缺少一些依赖项,例如 dalvik 不支持的 java.awt.Color
  • @kape123 好幽默 :-)
  • CommonsWare 通用失败主义答案... pwned。
  • 每台 Android 设备的商业许可费用约为 0.50 美元(0.42 欧元)。 (11-2013)
【解决方案2】:

迟到,但与请求相关,希望对您有所帮助。如果使用外部服务(如 CommonsWare 的回复中所建议),那么 Docmosis 有一个云服务可能会有所帮助 - 将处理卸载到执行繁重处理的云服务。这种方法在某些情况下是理想的,但当然依赖于网络连接。

【讨论】:

    【解决方案3】:

    如果您正在为 API 级别 19 或更高级别的设备进行开发,您可以使用内置的 PrintedPdfDocument:http://developer.android.com/reference/android/print/pdf/PrintedPdfDocument.html

    // open a new document
    PrintedPdfDocument document = new PrintedPdfDocument(context,
         printAttributes);
    
    // start a page
    Page page = document.startPage(0);
    
    // draw something on the page
    View content = getContentView();
    content.draw(page.getCanvas());
    
    // finish the page
    document.finishPage(page);
    . . .
    // add more pages
    . . .
    // write the document content
    document.writeTo(getOutputStream());
    
    //close the document
    document.close();
    

    【讨论】:

    • 最终将其作为 Android 的一部分作为 iOS 的一部分。
    • @Chris623 我想你的意思是“KitKat”... :)
    • @lalitm 与 ios 中的情况不同。在 iOS 中生成的 Pdf 具有用 doc 编写的可选文本。但在 android 中它是一个图像。
    • @WillThomson 你的 GitHub 链接应该是 this one 还是其他?
    【解决方案4】:

    你也可以使用PoDoFo 库。主要目标是它在 LGPL 下发布。由于它是用 C++ 编写的,因此您应该使用 NDK 交叉编译它并编写 C 端和 Java 包装器。一些第三方库可以从OpenCV 项目中使用。同样在 OpenCV 项目中你可以找到android.toolchain.cmake 文件,这将帮助你生成Makefile

    【讨论】:

      【解决方案5】:

      PDFJet 提供了一个开源版本的库,应该能够处理任何基本的 PDF 生成任务。这是一个纯粹基于 Java 的解决方案,据称与 Android 兼容。有一个带有一些附加功能的商业版本,看起来并不太贵。

      【讨论】:

      • 不再开源
      【解决方案6】:

      在 Android 中找到将任意 HTML 转换为带有非英文字母的 PDF 问题的完整解决方案并不容易。我测试它的俄语 unicode 字母。

      我们使用三个库:

      (1) Jsoup (jsoup-1.7.3.jar) 用于从 HTML 到 XHTML 的转换,

      (2)iTextPDF(itextpdf-5.5.0.jar),

      (3)XMLWorker (xmlworker-5.5.1.jar)。

      public boolean createPDF(String rawHTML, String fileName, ContextWrapper context){
          final String APPLICATION_PACKAGE_NAME = context.getBaseContext().getPackageName();
          File path = new File( Environment.getExternalStorageDirectory(), APPLICATION_PACKAGE_NAME );
          if ( !path.exists() ){ path.mkdir(); }
          File file = new File(path, fileName);
      
          try{
      
          Document document = new Document();
          PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));
          document.open();
      
          // Подготавливаем HTML
          String htmlText = Jsoup.clean( rawHTML, Whitelist.relaxed() );
          InputStream inputStream = new ByteArrayInputStream( htmlText.getBytes() );
      
          // Печатаем документ PDF
          XMLWorkerHelper.getInstance().parseXHtml(writer, document,
              inputStream, null, Charset.defaultCharset(), new MyFont());
      
          document.close();
          return true;
      
          } catch (FileNotFoundException e) {
              e.printStackTrace();
              return false;
          } catch (DocumentException e) {
              e.printStackTrace();
              return false;
          } catch (IOException e) {
              e.printStackTrace();
              return false;
          } 
      

      困难的问题是使用 iTextPDF XMLWorker 库在 PDF 中显示俄文字母。为此,我们应该创建自己的 FontProvider 接口实现:

      public class MyFont implements FontProvider{
          private static final String FONT_PATH = "/system/fonts/DroidSans.ttf";
          private static final String FONT_ALIAS = "my_font";
      
          public MyFont(){ FontFactory.register(FONT_PATH, FONT_ALIAS); }
      
          @Override
          public Font getFont(String fontname, String encoding, boolean embedded,
              float size, int style, BaseColor color){
      
              return FontFactory.getFont(FONT_ALIAS, BaseFont.IDENTITY_H, 
                  BaseFont.EMBEDDED, size, style, color);
          }
      
          @Override
          public boolean isRegistered(String name) { return name.equals( FONT_ALIAS ); }
      }
      

      这里我们使用标准的Android字体Droid Sans,它位于系统文件夹中:

      private static final String FONT_PATH = "/system/fonts/DroidSans.ttf";
      

      【讨论】:

      • 感谢您的分享!我有一个问题:我们可以对 HTML 应用任何 CSS 规则吗?
      【解决方案7】:

      有点晚了,我自己还没有测试过,但是BSD license 下的另一个库是Android PDF Writer

      更新我自己试过这个库。适用于简单的 pdf 生成(它提供了添加文本、线条、矩形、位图、字体的方法)。唯一的问题是生成的PDF存储在内存中的String中,这可能会导致大文档的内存问题。

      【讨论】:

      • 谁能告诉我Android PDF Writer不能做什么,而“itext”可以?
      • 未维护!!最后更新:2015-12-14
      【解决方案8】:

      制作具有复杂功能的 PDF 的一个技巧是制作具有所需 xml 布局的虚拟活动。然后您可以打开这个虚拟活动,获取screenshot programmatically 并使用this library 将该图像转换为pdf。当然有一些限制,比如不能滚动,不能超过一页,但对于有限的应用程序来说,这又快又容易。希望这对某人有帮助!

      【讨论】:

      • 它应该得到至少 1up。
      • 为我工作。是一个简单的实现。
      • 这是一个很酷的解决方法
      • 这条评论为我指明了正确的方向。然而: 1. 你不需要启动一个活动来截屏!您可以在运行时扩展 xml 布局并将其转换为位图like suggested here;话虽如此,您可以生成具有不同布局的多个页面。不支持滚动,但您可以使用例如线性布局来实现列表。
      猜你喜欢
      • 2018-04-26
      • 2013-07-05
      • 1970-01-01
      • 1970-01-01
      • 2013-09-25
      • 2012-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多