Existe-t-il un moyen de créer des fichiers PDF à partir d'une application Android?
Existe-t-il un moyen de créer des fichiers PDF à partir d'une application Android?
Réponses:
Si quelqu'un souhaite générer des PDF sur un appareil Android, voici comment le faire:
Si vous développez pour des appareils avec le niveau d'API 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,
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();
Une astuce pour créer un PDF avec des fonctionnalités complexes consiste à créer une activité factice avec la mise en page XML souhaitée. Vous pouvez ensuite ouvrir cette activité factice, prendre une capture d'écran par programme et convertir cette image en pdf à l'aide de cette bibliothèque . Bien sûr, il y a des limitations telles que ne pas pouvoir faire 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 sous Android. Je le teste pour les lettres unicode 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(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;
}
Le problème difficile est d'afficher les lettres russes au format 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 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 ); }
}
Ici, nous utilisons la police Android standard Droid Sans, qui se trouve dans le dossier système:
private static final String 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 moi-même essayé la bibliothèque. Fonctionne bien avec les générations PDF simples (il fournit des méthodes pour ajouter du texte, des lignes, des rectangles, des bitmaps, des polices). Le seul problème est que le PDF généré est stocké dans une chaîne en mémoire, cela peut provoquer des problèmes de mémoire dans les documents volumineux.
PDFJet propose une version open source de sa bibliothèque qui devrait être capable de gérer n'importe quelle tâche de base de génération de PDF. C'est une solution purement basée sur Java et il est déclaré compatible avec Android. Il existe une version commerciale avec quelques 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 de CommonsWare ), Docmosis dispose d'un service cloud qui pourrait vous aider - en déchargeant le traitement vers un service cloud qui effectue le traitement intensif . Cette approche est idéale dans certaines circonstances, mais repose bien sûr sur la connexion au réseau.
Vous pouvez également utiliser la bibliothèque PoDoFo . L'objectif principal est qu'il soit publié sous LGPL. Comme il est écrit en C ++, vous devez le compiler de manière croisée en utilisant NDK et écrire un wrapper côté C et Java. Certaines bibliothèques tierces peuvent être utilisées à partir d'un projet OpenCV . Également dans le projet OpenCV, vous pouvez trouver un android.toolchain.cmake
fichier, qui vous aidera à générer Makefile
.