Чи є спосіб створити 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. Я тестую його на російські букви унікоду.
Ми використовуємо три бібліотеки:
(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 та обгортці Java. Деякі сторонні бібліотеки можуть бути використані з проекту OpenCV . Також у проекті OpenCV U можна знайти android.toolchain.cmake
файл, який допоможе вам створити Makefile
.