Есть ли способ создать PDF-файлы из приложения Android?
Есть ли способ создать PDF-файлы из приложения Android?
Ответы:
Если кто-то хочет создавать PDF-файлы на устройстве Android, вот как это сделать:
Если вы разрабатываете для устройств с уровнем 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();
Хитрость в создании PDF со сложными функциями заключается в создании фиктивной операции с желаемым макетом XML. Затем вы можете открыть это фиктивное упражнение, программно сделать снимок экрана и преобразовать это изображение в pdf с помощью этой библиотеки . Конечно, существуют ограничения, такие как невозможность прокрутки, не более одной страницы, но для ограниченного приложения это быстро и просто. Надеюсь, это кому-нибудь поможет!
Нелегко найти полное решение проблемы преобразования произвольного HTML в PDF с неанглийскими буквами в Android. Я проверяю это для русских букв 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;
}
Сложной проблемой является отображение русских букв в PDF с помощью библиотеки iTextPDF XMLWorker. Для этого нам нужно создать собственную реализацию интерфейса 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 Writer .
Обновление Я сам попробовал библиотеку. Работает нормально с простыми поколениями pdf (предоставляет методы для добавления текста, линий, прямоугольников, растровых изображений, шрифтов). Единственная проблема заключается в том, что созданный PDF-файл хранится в строке в памяти, это может вызвать проблемы с памятью в больших документах.
PDFJet предлагает версию своей библиотеки с открытым исходным кодом, которая должна быть в состоянии справиться с любой базовой задачей создания PDF. Это чисто Java-решение, и оно заявлено совместимым с Android. Существует коммерческая версия с некоторыми дополнительными функциями, которая не кажется слишком дорогой.
Поздно, но актуально для запроса и, надеюсь, полезно. Если вы используете внешнюю службу (как предложено в ответе CommonsWare), то у Docmosis есть облачная служба, которая может помочь - перенести обработку в облачную службу, которая выполняет тяжелую обработку. Такой подход идеален в некоторых обстоятельствах, но, конечно, полагается на подключение к сети.
Вы также можете использовать библиотеку PoDoFo . Основная цель заключается в том, чтобы оно публиковалось под LGPL. Поскольку он написан на C ++, вы должны кросс-компилировать его, используя NDK, и написать C-side и Java-оболочку. Некоторые из сторонних библиотек могут быть использованы из проекта OpenCV . Также в проекте OpenCV U можно найти android.toolchain.cmake
файл, который поможет вам с генерацией Makefile
.