Comment créer des PDF dans une application Android? [fermé]


147

Existe-t-il un moyen de créer des fichiers PDF à partir d'une application Android?


6
Ne serait-il pas agréable que le modèle d'imagerie d'Android s'inspire de celui de Qt? Qt a établi que la génération de PDF ou SVG peut être aussi simple que de rediriger le même code que celui utilisé pour dessiner sur l'écran. Regardez la dérivation de QPrinter, QSvgGenerator et QWidget de QPaintDevice pour le modèle.
Calaf

1
Idem sous iOS. La génération PDF est intégrée.
Fabian Zeindl

2
Je pense que Kit Kat a une fonctionnalité pour générer des PDF, mais je ne sais pas si cela est rétrocompatible. J'ai publié une option ci-dessous et le site suivant répertorie plusieurs options allant du commercial au gratuit: stefan.fenz.at/creating-pdfs-on-android-an-evaluation
IcedDante

5
Ridicule que cela ait été fermé comme "hors sujet".
Joe Coder

2
Pourquoi ce message a-t-il été fermé? Stackoverflow est beaucoup trop pointilleux sur sa portée; cette question a 175 000 vues, en tant que ressource de codage ce site devrait permettre des choses hyper-courantes comme celle-ci, les règles doivent être modifiées, nous lisons beaucoup trop loin dans le texte littéral de ce qui est "hors sujet" plutôt que le cœur de la règle. Je l'ai signalé pour sa réouverture, j'espère que d'autres voteront également.
Albert Renshaw

Réponses:


155

Si quelqu'un souhaite générer des PDF sur un appareil Android, voici comment le faire:


54
Le seul problème avec iText est qu'il s'agit d'une licence GPLv3, sinon vous devez acheter une licence commerciale.
Tony Maro le

5
et les versions antérieures d'iText ont des dépendances manquantes comme java.awt.Color que dalvik ne prend pas en charge
k-deux

3
@ kape123 bon sens de l'humour :-)
AZ_

10
Réponse défaitiste générique de CommonsWare ... pwned.
moonlightcheese

2
la licence commerciale coûte environ 0,50 USD (0,42 EUR) par appareil Android. (11-2013)
Chris623

104

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();

2
Enfin sa partie d'Android comme sa partie d'iOS.
lalitm

5
@ Chris623 Je pense que vous vouliez dire "KitKat" ... :)
développeur android

7
@lalitm Ce n'est pas comme dans iOS. Le PDF généré sous iOS a un texte sélectionnable écrit dans le doc. Mais dans Android, c'est une image.
Kantesh

2
@WillThomson Votre lien GitHub était-il censé être celui-ci ou autre chose?
jk7

3
Merci beaucoup - le lien utile est ici github.com/IanDarwin/Android-Cookbook-Examples/blob/master
Kibi

27

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!


2
Il méritait au moins 1up.
Rahul Rastogi le

travaillé pour moi. était une mise en œuvre simple.
TharakaNirmana

c'est une solution de contournement cool
Kumar Saurabh

Ce commentaire m'indique dans la bonne direction. Cependant: 1. vous n'avez pas besoin de démarrer une activité pour prendre une capture d'écran! vous pouvez simplement gonfler une mise en page XML lors de l'exécution et la convertir en une image bitmap comme suggéré ici ; Cela étant dit, vous pouvez générer plusieurs pages avec des mises en page différentes. Le défilement n'est pas pris en charge comme dit mais vous pouvez implémenter une liste en utilisant, par exemple, une mise en page linéaire.
r.pedrosa

11

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";

1
Merci pour votre part! J'ai une question: pourrions-nous appliquer une règle CSS au HTML?
Phuong

6

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.


Quelqu'un peut-il me dire ce que Android PDF Writer ne peut pas faire, que "itext" peut?
M. Usman Khan

1
Non entretenu !! Dernière mise à jour: 14/12/2015
Mahdi Alkhatib

2

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.


4
plus open-source
Joshy Francis

0

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.


0

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.cmakefichier, qui vous aidera à générer Makefile.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.