Как создать PDF-файл в приложении для Android? [закрыто]

147

Есть ли способ создать PDF-файлы из приложения Android?

hichris123
источник
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, вот как это сделать:

nikib3ro
источник
54
Единственная проблема с iText заключается в том, что это лицензия GPLv3, иначе вы должны приобрести коммерческую лицензию.
Тони Маро
5
и более ранние версии iText имеют некоторые отсутствующие зависимости, такие как java.awt. Цвет, который dalvik не поддерживает
k-deux
3
@ kape123 хорошее чувство юмора :-)
AZ_
10
Общий ответ пораженческого сообщества ... pwned.
Moonlightcheese
2
коммерческая лицензия стоит около 0,50 доллара США (0,42 евро) на устройство 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();
teh.fonsi
источник
2
Наконец его часть Android как часть iOS.
Lalitm
5
@ Chris623 Я думаю, что вы имели в виду "KitKat" ... :)
Android-разработчик
7
@lalitm Это не так, как в IOS. PDF, созданный в iOS, имеет выбираемый текст, написанный в doc. Но в Android его изображение.
Кантеш
2
@WillThomson Была ли ваша ссылка на GitHub этой или чем-то еще?
jk7
3
Большое спасибо - полезная ссылка здесь github.com/IanDarwin/Android-Cookbook-Examples/blob/master/…
Киби,
27

Хитрость в создании PDF со сложными функциями заключается в создании фиктивной операции с желаемым макетом XML. Затем вы можете открыть это фиктивное упражнение, программно сделать снимок экрана и преобразовать это изображение в pdf с помощью этой библиотеки . Конечно, существуют ограничения, такие как невозможность прокрутки, не более одной страницы, но для ограниченного приложения это быстро и просто. Надеюсь, это кому-нибудь поможет!

hrishitiwari
источник
2
Это заслуживало по крайней мере 1up.
Рахул Растоги
работал на меня. была простая реализация.
TharakaNirmana
это крутой обходной путь
Кумар
Этот комментарий указывает мне правильное направление. Однако: 1. Вам не нужно начинать действие, чтобы сделать снимок экрана! вы можете просто накачать макет xml во время выполнения и преобразовать его в растровое изображение, как предложено здесь ; При этом вы можете создать несколько страниц с разным макетом. Прокрутка не поддерживается, как говорится, но вы можете реализовать список, используя, например, линейный макет.
р.педроса
11

Нелегко найти полное решение проблемы преобразования произвольного 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";
DenisMath
источник
1
Спасибо за вашу долю! У меня есть вопрос: можем ли мы применить какое-либо правило CSS к HTML?
Phuong
6

Немного опоздал, и я еще не тестировал его сам, но другая библиотека под лицензией BSD - Android PDF Writer .

Обновление Я сам попробовал библиотеку. Работает нормально с простыми поколениями pdf (предоставляет методы для добавления текста, линий, прямоугольников, растровых изображений, шрифтов). Единственная проблема заключается в том, что созданный PDF-файл хранится в строке в памяти, это может вызвать проблемы с памятью в больших документах.

Angelo
источник
Может кто-нибудь сказать мне, что Android PDF Writer не может сделать, что может "itext"?
М. Усман Хан
1
Не поддерживается! Последнее обновление: 2015-12-14
Махди Алхатиб,
2

PDFJet предлагает версию своей библиотеки с открытым исходным кодом, которая должна быть в состоянии справиться с любой базовой задачей создания PDF. Это чисто Java-решение, и оно заявлено совместимым с Android. Существует коммерческая версия с некоторыми дополнительными функциями, которая не кажется слишком дорогой.

IcedDante
источник
4
больше не с открытым исходным кодом
Джоши Фрэнсис
0

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

Пол Джоветт
источник
0

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

Джонни Доу
источник