57 votes

Comment créer des PDF dans une application Android ?

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

0voto

DenisMath Points 439

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 l'ai testé pour les lettres russes unicode.

Nous utilisons trois bibliothèques :

(1) Jsoup (jsoup-1.7.3.jar) pour une conversion de HTML en 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 des lettres russes dans le 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 ); }
}

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

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

0voto

Angelo Points 2650

C'est un peu tard et je ne l'ai pas encore testé moi-même mais une autre bibliothèque qui se trouve sous l'onglet Licence BSD es Rédacteur de PDF pour Android .

0voto

hrishitiwari Points 119

Une astuce pour créer un PDF avec des caractéristiques complexes consiste à créer une activité fictive avec la mise en page xml souhaitée. Vous pouvez ensuite ouvrir cette activité fictive, prendre une photo de l'activité en question et l'imprimer. capture d'écran de manière programmée et convertir cette image en pdf en utilisant cette bibliothèque . Bien sûr, il y a des limitations, comme l'impossibilité de faire défiler les pages, le fait qu'il n'y ait pas plus d'une page, mais pour une application limitée, c'est rapide et facile. J'espère que cela aidera quelqu'un !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X