Comment créer des PDF dans une application Android?

Est-il possible de créer des fichiers PDF à partir d’une application Android?

Si quelqu’un souhaite générer des fichiers PDF sur un appareil Android, voici comment procéder:

Si vous développez pour des appareils avec API niveau 19 ou supérieur, vous pouvez utiliser le PrintedPdfDocument intégré: http://developer.android.com/reference/android/print/pdf/PrintedPdfDocument.html

// open a new document PrintedPdfDocument document = new PrintedPdfDocument(context, printAtsortingbutes); // 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(); 

Une astuce pour créer un fichier PDF avec des fonctionnalités complexes consiste à créer une activité factice avec la présentation xml souhaitée. Vous pouvez ensuite ouvrir cette activité factice, faire une capture d’écran par programmation et convertir cette image en pdf en utilisant cette bibliothèque . Bien sûr, il existe des limitations telles que le fait de ne pas pouvoir défiler, pas plus d’une page, mais pour une application limitée, c’est rapide et facile. J’espère que cela aide quelqu’un!

Il n’est pas facile de trouver une solution complète au problème de la conversion d’un HTML arbitraire en PDF avec des lettres non anglaises dans Android. Je le teste pour des lettres unicodes russes.

Nous utilisons trois bibliothèques:

(1) Jsoup (jsoup-1.7.3.jar) pour une conversion de HTML vers XHTML,

(2) iTextPDF (itextpdf-5.5.0.jar),

(3) XMLWorker (xmlworker-5.5.1.jar).

 public boolean createPDF(Ssortingng rawHTML, Ssortingng fileName, ContextWrapper context){ final Ssortingng 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 Ssortingng 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; } 

Le problème difficile consiste à afficher des lettres russes en PDF en utilisant la bibliothèque iTextPDF XMLWorker. Pour cela, nous devons créer notre propre implémentation de l’interface FontProvider:

 public class MyFont implements FontProvider{ private static final Ssortingng FONT_PATH = "/system/fonts/DroidSans.ttf"; private static final Ssortingng FONT_ALIAS = "my_font"; public MyFont(){ FontFactory.register(FONT_PATH, FONT_ALIAS); } @Override public Font getFont(Ssortingng fontname, Ssortingng 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(Ssortingng name) { return name.equals( FONT_ALIAS ); } } 

Ici, nous utilisons la police Android standard Droid Sans, qui se trouve dans le dossier système:

 private static final Ssortingng FONT_PATH = "/system/fonts/DroidSans.ttf"; 

Un peu tard et je ne l’ai pas encore testé moi-même, mais une autre bibliothèque sous licence BSD est Android PDF Writer .

Mise à jour J’ai essayé la bibliothèque moi-même. Fonctionne correctement avec les générations pdf simples (il fournit des méthodes pour append du texte, des lignes, des rectangles, des bitmaps, des fonts). Le seul problème est que le fichier PDF généré est stocké dans une chaîne en mémoire, cela peut entraîner des problèmes de mémoire dans les documents volumineux.

PDFJet propose une version open source de leur bibliothèque qui devrait être capable de gérer toute tâche de génération PDF de base. C’est une solution purement basée sur Java et il est déclaré compatible avec Android. Il existe une version commerciale avec des fonctionnalités supplémentaires qui ne semblent pas trop chères.

En retard, mais pertinent à la demande et, espérons-le, utile. Si vous utilisez un service externe (comme suggéré dans la réponse par CommonsWare ), Docmosis a un service de cloud qui peut vous aider à décharger le traitement vers un service de cloud qui effectue le traitement intensif . Cette approche est idéale dans certaines circonstances, mais repose évidemment sur le fait d’être connecté au réseau.

Vous pouvez également utiliser la bibliothèque PoDoFo . L’objective principal est qu’il soit publié sous LGPL. Comme il est écrit en C ++, vous devez le comstackr en utilisant NDK et écrire un wrapper C-side et Java. Certaines bibliothèques tierces peuvent être utilisées à partir du projet OpenCV . Toujours dans le projet OpenCV, U peut trouver le fichier android.toolchain.cmake , qui vous aidera à générer un Makefile .