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

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

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

4b9b3361

Ответ 2

Если вы разрабатываете устройства с уровнем 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();

Ответ 3

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

Ответ 4

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

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

Ответ 5

Нелегко найти полное решение проблемы конвертации произвольного 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, используя библиотеку XMLWorker iTextPDF. Для этого мы должны создать собственную реализацию интерфейса 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";

Ответ 6

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

Ответ 7

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

Ответ 8

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