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

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

225603 次浏览

如果有人想在 Android 设备上生成 PDF 文件,以下是方法:

迟到了,但是符合要求,希望能帮上忙。如果使用外部服务(正如 CommonsWare 在答复中所建议的那样) ,那么 睡眠就有一个可能有所帮助的云服务——将处理任务卸载到执行繁重处理任务的云服务上。这种方法在某些情况下是理想的,但当然依赖于网络连接。

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

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

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

在 Android 中,要找到一个完整的解决方案来解决任意的 HTML 到 PDF 与非英文字母之间的转换问题并不容易。我测试了俄罗斯的 Unicode 字母。

我们使用三个图书馆:

(1)用于从 HTML 到 XHTML 的转换的 (jsoup1.7.3. jar) ,

(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;
}

难点在于如何使用 iTextPDFXMLWorker 库以 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";

有点晚,我还没有测试它自己,但另一个库是在 BSD 执照Android PDF 书写软件

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

创建具有复杂特性的 PDF 的一个技巧是使用所需的 xml 布局创建一个虚拟活动。然后,您可以打开这个虚拟活动,获取一个 程序化截图并使用 这个图书馆将该图像转换为 pdf。当然也有一些限制,比如不能滚动,不能滚动多个页面,但是对于有限的应用程序来说,这是快速而简单的。希望这对谁有帮助!