如何在Android应用程序中创buildPDF?
有什么办法从Android应用程序创buildPDF文件?
如果有人想在Android设备上生成PDF,请按照以下步骤操作:
如果您正在开发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();
制作具有复杂function的PDF的技巧是使用所需的xml布局进行虚拟活动。 然后,您可以打开这个虚拟活动,以编程方式截图并使用此库将该图像转换为pdf。 当然有限制,如不能滚动,不超过一页,但对于有限的应用程序,这是快速和容易的。 希望这可以帮助别人!
有点迟了,我还没有自己testing,但另一个在BSD许可证下的图书馆是Android PDF Writer 。
更新我已经尝试过自己的图书馆。 适用于简单的pdf世代(它提供了添加文本,线条,矩形,位图,字体的方法)。 唯一的问题是生成的PDF存储在内存中的string中,这可能会导致大文档中的内存问题。
在Android中find完全解决将任意HTML转换为带有非英文字母的PDF的问题并不容易。 我testing它的俄文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中显示俄文字母。 为此,我们应该创build我们自己的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";
PDFJet提供了一个openSource版本的库,应该能够处理任何基本的PDF生成任务。 这是一个纯粹的基于Java的解决scheme,据说与Android兼容。 有一个商业版本的一些额外的function,似乎并不太昂贵。
晚了,但与请求有关,希望有所帮助。 如果使用外部服务(如CommonsWare的回复中所build议的那样),则Docmosis有一个云服务可以帮助 – 将处理卸载到执行繁重处理的云服务。 这种方法在某些情况下是理想的,但当然依赖于networking连接。
U也可以使用PoDoFo库。 主要目标是在LGPL下发布。 由于它是用C ++编写的,所以你应该使用NDK交叉编译并编写C端和Java包装器。 一些第三方库可以在OpenCV项目中使用。 在OpenCV项目中,U也可以findandroid.toolchain.cmake
文件,它可以帮助你生成Makefile
。
- 如何解决“等待debugging器”消息?
- 在片段和活动之间进行沟通 – 最佳实践
- 如何实现RecyclerView的ItemAnimator来禁用notifyItemChanged的animation
- 如何阅读Android 2.0上的联系人
- Android应用程序中TextView的字体大小会根据本地设置更改字体大小而发生变化
- “自动激活bundle com.android.ide.eclipse.adt时发生错误”
- Jack(Java Android编译器套件)如何影响Scala开发人员
- Android资源转换为stringTypedValue警告
- iScroll 4不支持表单<select>元素iPhone Safari和Android浏览器