如何在Android应用程序中创建PDF?

144 pdf android

有没有办法从Android应用程序创建PDF文件?

nik*_*3ro 152

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

  • iText的唯一问题是它是GPLv3许可证,否则您必须购买商业许可证. (49认同)
  • CommonsWare通用失败者的答案...... pwned. (10认同)
  • 早期版本的iText有一些缺少的依赖,比如dalvik不支持的java.awt.Color (5认同)
  • @ kape123幽默感:-) (3认同)
  • 每台 Android 设备的商业许可费用约为 0.50 美元(0.42 欧元)。(11-2013) (2认同)

teh*_*nsi 96

如果您正在为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();
Run Code Online (Sandbox Code Playgroud)

  • @lalitm它不像ios那样.在iOS中生成的Pdf具有用doc编写的可选文本.但在android中它的形象. (7认同)
  • @ Chris623我觉得你的意思是"KitKat"...... :) (5认同)
  • 非常感谢 - 有用的链接在这里 https://github.com/IanDarwin/Android-Cookbook-Examples/blob/master/PdfShare/src/main/java/com/example/pdfshare/MainActivity.java (3认同)
  • 最后它的部分Android作为iOS的一部分. (2认同)
  • @WillThomson您的GitHub链接应该是[这一个](https://github.com/IanDarwin/Android-Cookbook-Examples)还是其他什么? (2认同)

hri*_*ari 24

制作具有复杂功能的PDF的技巧是使用所需的xml布局进行虚拟活动.然后,您可以打开此虚拟活动,以编程方式截取屏幕截图并使用此库将该图像转换为pdf .当然有一些限制,例如无法滚动,不超过一页,但对于有限的应用程序,这是快速和简单的.希望这有助于某人!

  • 它值得至少1up。 (2认同)

Den*_*ath 10

在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;
    } 
Run Code Online (Sandbox Code Playgroud)

难题是使用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 ); }
}
Run Code Online (Sandbox Code Playgroud)

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

private static final String FONT_PATH = "/system/fonts/DroidSans.ttf";
Run Code Online (Sandbox Code Playgroud)


Ang*_*elo 6

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

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