有没有办法从Android应用程序创建PDF文件?
答案 0 :(得分:151)
如果有人想在Android设备上生成PDF,请按以下步骤操作:
答案 1 :(得分:92)
如果您正在为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 :(得分:24)
制作具有复杂功能的PDF的技巧是使用所需的xml布局进行虚拟活动。然后,您可以打开此虚拟活动,使用screenshot programmatically并使用this library将该图像转换为pdf。当然有一些限制,例如无法滚动,不超过一页,但对于有限的应用程序,这是快速和简单的。希望这有助于某人!
答案 3 :(得分:9)
在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";
答案 4 :(得分:6)
有点晚了,我还没有测试过它,但是BSD license下的另一个库是Android PDF Writer。
更新我自己尝试过这个库。适用于简单的pdf代(它提供了添加文本,线条,矩形,位图,字体的方法)。唯一的问题是生成的PDF存储在内存中的String中,这可能会导致大型文档中的内存问题。
答案 5 :(得分:3)
PDFJet提供了他们库的开源版本,应该能够处理任何基本的PDF生成任务。它是一个纯粹的基于Java的解决方案,据称与Android兼容。有一个商业版本,其中一些附加功能似乎并不太昂贵。
答案 6 :(得分:0)
迟到,但与请求相关并希望对您有所帮助。如果使用外部服务(如CommonsWare的回复中所建议的那样),则Docmosis具有可能有用的云服务 - 将处理卸载到执行繁重处理的云服务。这种方法在某些情况下是理想的,但当然依赖于网络连接。
答案 7 :(得分:0)