Як створити PDF-файли в додатку для Android? [зачинено]


147

Чи є спосіб створити PDF-файли з програми Android?


6
Не було б непогано, якби модель зображень Android взяла натхнення у Qt? Qt встановив, що генерування PDF або SVG може бути таким же простим, як перенаправлення того ж коду, який використовується для малювання на екрані. Подивіться на виведення QPrinter, QSvgGenerator та QWidget від QPaintDevice для викрійки.
Калаф

1
Те саме в iOS. Генерація PDF вбудована.
Фабіан Зейндл

2
Я вважаю, що у Kit Kat є функція для створення PDF-файлів, але я не знаю, чи сумісна вона назад. Я розмістив варіант нижче, і наступний сайт перелічує кілька варіантів, починаючи від комерційних до безкоштовних: stefan.fenz.at/creating-pdfs-on-android-an-evaluation
IcedDante

5
Смішно, що це було закрито як "поза темою".
Джо Кодер

2
Чому цю посаду закрили? Stackoverflow занадто вибагливий щодо своєї сфери; це запитання має 175 000 переглядів, оскільки ресурс кодування на цьому веб-сайті повинен містити такі звичайні речі, як правила, які потребують внесення змін, ми читаємо занадто далеко в прямому тексті того, що "поза темою", а не в основі правила. Я позначив це на повторне відкриття, сподіваюся, що і інші проголосують.
Альберт Реншо

Відповіді:


155

Якщо хтось хоче створити PDF-файли на пристрої Android, ось як це зробити:


54
Єдина проблема з iText полягає в тому, що це ліцензія GPLv3, інакше потрібно придбати комерційну ліцензію.
Тоні Маро

5
і більш ранні версії iText мають деякі відсутні зразки, такі як java.awt.Color, який dalvik не підтримує
k-deux

3
@ kape123 приємне почуття гумору :-)
AZ_

10
CommonsОтримуйте загальну відповідь про поразки ... pwned.
місячний

2
комерційна ліцензія коштує приблизно 0,50 USD (0,42 EUR) за пристрій Android. (11-2013)
Chris623

104

Якщо ви розробляєте пристрої з рівнем 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
Нарешті, його частина Android як частина iOS.
лаліт

5
@ Chris623 Я думаю, ти мав на увазі "KitKat" ... :)
андроїд розробник

7
@lalitm Це не так, як це в ios. Pdf, створений в iOS, має текст, який вибирається, написаний в doc. Але в android його зображення.
Кантеш

2
@WillThomson Чи повинен був ваш посилання на GitHub бути цим чи іншим?
jk7

3
Велике спасибі - корисне посилання тут github.com/IanDarwin/Android-Cookbook-Examples/blob/master/…
Кібі

27

Трюк, щоб створити PDF зі складними функціями, - це зробити фіктивну діяльність з потрібним форматом XML. Потім ви можете відкрити цю фіктивну діяльність, зробити скріншот програмно і перетворити це зображення в pdf за допомогою цієї бібліотеки . Звичайно, існують обмеження, такі як неможливість прокрутки не більше однієї сторінки, але для обмеженого застосування це швидко і легко. Сподіваюся, це комусь допоможе!


2
Він заслужив принаймні 1уп.
Рахул Растогі

працював на мене. була простою реалізацією.
TharakaNirmana

ось класний спосіб вирішення
Kumar Saurabh

Цей коментар спрямовує мене в правильному напрямку. Однак: 1. Вам не потрібно починати діяльність, щоб зробити знімок екрана! ви можете просто надути макет xml під час виконання та перетворити його в растрову карту, як тут пропонується ; При цьому, ви можете генерувати кілька сторінок з різними макетами. Прокрутка не підтримується, як сказано, але ви можете реалізувати список, використовуючи, наприклад, лінійний макет.
r.pedrosa

11

Непросто знайти повне вирішення проблеми перетворення довільного 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";

1
Дякуємо за вашу частку! У мене питання: Чи можемо ми застосувати будь-яке правило CSS до HTML?
Пхуонг

6

Трохи пізно, і я ще не перевірив цього ще, але ще одна бібліотека, яка має ліцензію BSD, - це Android PDF Writer .

Оновлення Я сам спробував бібліотеку. Працює нормально з простими поколіннями файлів у форматі PDF (надає методи для додавання тексту, ліній, прямокутників, растрових зображень, шрифтів). Єдина проблема полягає в тому, що згенерований PDF зберігається в рядку пам'яті, це може спричинити проблеми з пам'яттю у великих документах.


Хто-небудь може сказати мені, що Android PDF Writer не може зробити, що "itext" може?
М. Усман Хан

1
Не підтримується !! Останнє оновлення: 2015-12-14
Махді Алхатіб

2

PDFJet пропонує відкриту версію своєї бібліотеки з відкритим кодом, яка повинна мати можливість виконувати будь-які основні завдання з генерації PDF. Це суто Java-рішення, і воно, як стверджується, сумісне з Android. Існує комерційна версія з деякими додатковими функціями, яка, здається, не надто дорога.


4
більше не з відкритим кодом
Джоші Френсіс

0

Пізно, але релевантно для запиту і, сподіваємось, корисно. Якщо ви користуєтесь зовнішньою службою (як це запропоновано у відповіді CommonsWare), то Docmosis має хмарний сервіс, який може допомогти - перевантажити обробку на хмарний сервіс, який робить важку обробку. Такий підхід є ідеальним в деяких обставинах, але, звичайно, покладається на те, що вони пов'язані мережею.


0

Ви також можете використовувати бібліотеку PoDoFo . Основна мета - це публікація під LGPL. Оскільки він написаний на C ++, ви повинні перехресно компілювати його за допомогою NDK і писати на стороні C та обгортці Java. Деякі сторонні бібліотеки можуть бути використані з проекту OpenCV . Також у проекті OpenCV U можна знайти android.toolchain.cmakeфайл, який допоможе вам створити Makefile.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.