web-dev-qa-db-fra.com

Comment créer des fichiers PDF dans une application Android?

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

140
user299908

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

152
nikib3ro

Si vous développez pour des périphériques avec une API de 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,
     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();
95
teh.fonsi

Une astuce pour créer un PDF avec des fonctionnalités complexes consiste à créer une activité fictive avec la mise en page XML souhaitée. Vous pouvez ensuite ouvrir cette activité fictive, prendre une capture d'écran par programme et convertir cette image en pdf à l'aide de cette bibliothèque . Bien sûr, il existe des limitations telles que l'impossibilité de faire défiler, pas plus d'une page, mais pour une application limitée, cela est rapide et facile. J'espère que ça aide quelqu'un!

24
hrishitiwari

Il n’est pas facile de trouver une solution complète au problème de la conversion d’un code 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 à 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 consiste à afficher les lettres russes dans PDF à l'aide de la bibliothèque iTextPDF XMLWorker. Pour cela, nous devrions 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 ); }
}

Nous utilisons ici la police standard Android, Droid Sans, située dans le dossier système:

private static final String FONT_PATH = "/system/fonts/DroidSans.ttf";
10
DenisMath

Un peu en retard et je ne l'ai pas encore testé, mais une autre bibliothèque qui se trouve sous le licence BSD est Android PDF Writer .

Mise à jour J'ai essayé la bibliothèque moi-même. Fonctionne bien avec les générations de 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 entraîner des problèmes de mémoire dans les documents volumineux.

6
Angelo

PDFJet propose une version open-source de leur bibliothèque qui devrait être capable de gérer toute tâche de génération de base PDF. Il s’agit d’une solution purement Java, compatible avec Android. Il existe une version commerciale avec quelques fonctionnalités supplémentaires qui ne semble pas trop chère.

3
IcedDante

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 en utilisant NDK et écrire C-side et Java wrapper. Certaines bibliothèques tierces peuvent être utilisées à partir du projet OpenCV . Toujours dans le projet OpenCV, vous pouvez trouver le fichier Android.toolchain.cmake, qui vous aidera à générer Makefile.

0
Johnny Doe

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), alors Docmosis dispose d'un service cloud qui pourrait vous aider - décharger le traitement sur un service cloud qui effectue le traitement lourd. Cette approche est idéale dans certaines circonstances, mais elle repose bien entendu sur une connexion Internet.

0
Paul Jowett