有没有办法从 Android 应用程序中创建 PDF 文件?
有没有办法从 Android 应用程序中创建 PDF 文件?
如果有人想在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();
在 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";
PDFJet提供了一个开源版本的库,可以处理任何基本的PDF生成任务。这是一个纯Java解决方案,据称与Android兼容。还有一个商业版,具有一些额外的功能,价格似乎不太昂贵。