2010-03-23 7 views
118

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

+4

Было бы неплохо, если бы модель имиджа Android получила некоторое вдохновение от Qt's? Qt установил, что создание PDF или SVG может быть таким же простым, как перенаправление того же кода, который используется для рисования на экране. Посмотрите на вывод QPrinter, QSvgGenerator и QWidget из QPaintDevice для шаблона. – Calaf

+1

То же самое в iOS. Встроена встроенная программа PDF. –

+2

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

ответ

147

Если кто-то хочет создать PDF-файлы на Android устройства, вот как это сделать:

+39

Только проблема с iText заключается в том, что это лицензия GPLv3, или вы должны приобрести коммерческую лицензию. –

+3

и более ранние версии iText имеют некоторые недостающие зависимости, такие как java.awt.Color, которые dalvik не поддерживает –

+3

@ kape123 приятное чувство юмора :-) –

0

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

72

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

использует API 19 (Kitikat) - поэтому в будущих устройствах вы можете легко создавать PDF-документы, рисуя на холсте. Спасибо за этот полезный пост – Chris623

+2

Наконец-то его часть Android в качестве части iOS. – lalitm

+4

@ Chris623 Я думаю, что вы имели в виду «KitKat» ... :) –

0

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

3

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

7

Нелегко найти полное решение проблемы конвертации произвольного 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 с использованием библиотеки iTWeff 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"; 
+0

Спасибо за ваша доля! У меня есть вопрос: можно ли применить любое правило CSS к HTML? – Phuong

7

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

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

+0

Может ли кто-нибудь сказать мне, что Android PDF Writer не может сделать, что «itext» может? – usman

16

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

+0

Это заслуженный atleast 1up. –

+0

работал для меня. была простой реализацией. – TharakaNirmana

+0

Это круто обходное решение –

Смежные вопросы