如何在Android应用中创建PDF?[关闭]


147

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


6
如果Android的成像模型从Qt那里得到一些启发,那会不会很好?Qt证实,生成PDF或SVG就像重定向一个用来在屏幕上绘制的代码一样简单。看一下从QPaintDevice派生的QPrinter,QSvgGenerator和QWidget。
卡拉夫

1
在iOS中也一样。PDF生成是内置的。
Fabian Zeindl

2
我相信Kit Kat具有生成PDF的功能,但是我不知道它是否向后兼容。我在下面发布了一个选项,下面的网站列出了从商业到免费的几种选项:stefan.fenz.at/creating-pdfs-on-android-an-evaluation
IcedD​​ante

5
荒谬的是,这被关闭为“离题”。
Joe Coder

2
为什么关闭此帖子?Stackoverflow对其范围过于挑剔。这个问题有175,000个视图,作为该站点的编码资源,应允许像这样的超常见内容,规则需要修改,我们对“离题”的文字文本的理解程度过高,而不是规则的核心。我已将其标记为重新开放,希望其他人也能投票。
艾伯特·伦肖

Answers:


155

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


54
iText的唯一问题是它是GPLv3许可证,否则您必须购买商业许可证。
Tony Maro

5
和较早版本的iText缺少一些依赖项,例如java.awt.Color,而dalvik不支持
k-deux

3
@ kape123很幽默:-)
AZ_

10
CommonsWare通用失败主义者的答案。
moonlightcheese

2
每台Android设备的商业许可费用约为0.50美元(0.42欧元)。(11-2013)
Chris623

104

如果您正在开发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();

2
最后,它是Android的一部分,也是iOS的一部分。
lalitm

5
@ Chris623我认为您的意思是“ KitKat” ... :)
android开发人员

7
@lalitm它不是ios中的样子。在iOS中生成的PDF具有以doc格式编写的可选文本。但是在android中,它是一个图像。
坎图什2014年

2
@WillThomson您的GitHub链接应该是这个链接还是其他链接?
jk7


27

制作具有复杂功能的PDF的一个技巧是使用所需的xml布局进行虚拟活动。然后,您可以打开此虚拟活动,以编程方式截取屏幕截图,然后使用该库将该图像转换为pdf 。当然存在局限性,例如不能滚动,最多只能滚动一页,但是对于有限的应用程序来说,这是快速且容易的。希望这对某人有帮助!


2
它值得至少1up。
Rahul Rastogi 2015年

为我工作。是一个简单的实现。
TharakaNirmana '16

多数民众赞成在一个很酷的解决方法
Kumar Saurabh 17-4-3

这句话为我指明了正确的方向。但是:1.您无需启动活动即可截屏!您可以在运行时膨胀xml布局并将其转换为位图,如这里所建议 ; 话虽如此,您可以生成具有不同布局的多个页面。据说不支持Scroll,但是您可以使用例如线性布局来实现列表。
r.pedrosa 17-4-26的

11

要在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,它位于system文件夹中:

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

1
感谢您的分享!我有一个问题:我们可以将任何CSS规则应用于HTML吗?
Phuong 2015年

6

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

更新我自己尝试了图书馆。可以与简单的pdf生成一起使用(它提供了添加文本,线条,矩形,位图,字体的方法)。唯一的问题是,生成的PDF存储在内存中的字符串中,这可能会导致大型文档出现内存问题。


谁能告诉我“ itext”可以做什么,Android PDF Writer不能做什么?
M. Usman Khan

1
不维护!最后更新:2015-12-14
Mahdi Alkhatib

2

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


4
没有更多的开源
Joshy弗朗西斯

0

较晚,但与要求有关,希望对您有所帮助。如果使用外部服务(如CommonsWare答复中所建议),则Docmosis可能会提供云服务,这可能会有所帮助-将处理工作卸载到进行繁重处理工作的云服务中。这种方法在某些情况下是理想的,但是当然依赖于网络连接。


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.