Come creare PDF in un'app Android? [chiuso]


147

Esiste un modo per creare file PDF da un'applicazione Android?


6
Non sarebbe bello se il modello di imaging di Android si ispirasse a quello di Qt? Qt ha stabilito che generare PDF o SVG può essere semplice come reindirizzare lo stesso codice che si usa per disegnare sullo schermo. Guarda la derivazione di QPrinter, QSvgGenerator e QWidget da QPaintDevice per il modello.
Calaf,

1
Lo stesso in iOS. La generazione di PDF è integrata.
Fabian Zeindl,

2
Credo che Kit Kat abbia una funzione per generare PDF, ma non so se sia compatibile con le versioni precedenti. Ho pubblicato un'opzione di seguito e il seguente sito elenca diverse opzioni che vanno dal commerciale al gratuito: stefan.fenz.at/creating-pdfs-on-android-an-evaluation
IcedDante

5
Ridicolo che questo sia stato chiuso come "off-topic".
Joe Coder,

2
Perché questo post è stato chiuso? Stackoverflow è troppo esigente riguardo al suo ambito; questa domanda ha 175.000 visualizzazioni, come risorsa di codifica questo sito dovrebbe consentire cose iper-comuni come questa, le regole devono essere modificate, leggiamo troppo lontano nel testo letterale di ciò che è "off-topic" piuttosto che il cuore della regola. L'ho segnalato per la riapertura, spero che anche altri votino.
Albert Renshaw,

Risposte:


155

Se qualcuno vuole generare PDF su un dispositivo Android, ecco come farlo:


54
L'unico problema con iText è che si tratta di una licenza GPLv3, altrimenti è necessario acquistare una licenza commerciale.
Tony Maro,

5
e le versioni precedenti di iText hanno alcune dipendenze mancanti come java.awt.Color che dalvik non supporta
k-deux,

3
@ kape123 bel senso dell'umorismo :-)
AZ_

10
CommonsWare risposta disfattista generico ... inventata.
moonlightcheese

2
la licenza commerciale costa circa 0,50 USD (0,42 EUR) per dispositivo Android. (11-2013)
Chris623

104

Se stai sviluppando per dispositivi con livello API 19 o superiore, puoi utilizzare il documento PrintedPdf incorporato: 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
Finalmente fa parte di Android come parte di iOS.
lalitm,

5
@ Chris623 Penso che volevi dire "KitKat" ... :)
sviluppatore Android il

7
@lalitm Non è come in iOS. Pdf generato in iOS ha testo selezionabile scritto nel doc. Ma in Android è un'immagine.
Kantesh,

2
@WillThomson Il tuo link GitHub doveva essere questo o qualcos'altro?
jk7


27

Un trucco per creare un PDF con funzionalità complesse è quello di fare un'attività fittizia con il layout XML desiderato. È quindi possibile aprire questa attività fittizia, acquisire uno screenshot a livello di codice e convertire quell'immagine in pdf utilizzando questa libreria . Ovviamente ci sono limitazioni come non poter scorrere, non più di una pagina, ma per un'applicazione limitata è semplice e veloce. Spero che questo aiuti qualcuno!


2
Meritava almeno 1up.
Rahul Rastogi,

ha funzionato per me. era una semplice implementazione.
Tharaka Nirmana,

è una bella soluzione
Kumar Saurabh,

Questo commento mi indica la giusta direzione. Tuttavia: 1. non è necessario avviare un'attività per acquisire una schermata! puoi semplicemente gonfiare un layout XML in fase di runtime e convertirlo in una bitmap come suggerito qui ; Detto questo, è possibile generare più pagine con layout diversi. Scroll non è supportato come detto, ma è possibile implementare un elenco utilizzando, ad esempio, un layout lineare.
r.pedrosa,

11

Non è facile trovare una soluzione completa al problema della conversione di un HTML arbitrario in PDF con lettere non inglesi in Android. Lo provo per le lettere unicode russe.

Utilizziamo tre librerie:

(1) Jsoup (jsoup-1.7.3.jar) per una conversione da HTML a 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;
    } 

Il difficile problema è visualizzare le lettere russe in PDF utilizzando la libreria XMLWorker iTextPDF. Per questo dovremmo creare la nostra implementazione dell'interfaccia 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 ); }
}

Qui usiamo il carattere standard Android Droid Sans, che si trova nella cartella di sistema:

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

1
Grazie per la tua condivisione! Ho una domanda: potremmo applicare qualche regola CSS all'HTML?
Phuong

6

Un po 'in ritardo e non l'ho ancora testato da solo, ma un'altra libreria sotto licenza BSD è Android PDF Writer .

Aggiornamento Ho provato la libreria da solo. Funziona bene con semplici generazioni di pdf (fornisce metodi per aggiungere testo, linee, rettangoli, bitmap, caratteri). L'unico problema è che il PDF generato è archiviato in una stringa in memoria, ciò può causare problemi di memoria in documenti di grandi dimensioni.


Qualcuno può dirmi cosa non può fare Android PDF Writer, che "itext" può fare?
M. Usman Khan,

1
Non mantenuto !! Ultimo aggiornamento: 14-12-2015
Mahdi Alkhatib,

2

PDFJet offre una versione open source della loro libreria che dovrebbe essere in grado di gestire qualsiasi attività di generazione di PDF di base. È una soluzione puramente basata su Java ed è dichiarata compatibile con Android. Esiste una versione commerciale con alcune funzionalità aggiuntive che non sembrano essere troppo costose.


4
non più open-source
Joshy Francis,

0

In ritardo, ma pertinente da richiedere e speriamo utile. Se si utilizza un servizio esterno (come suggerito nella risposta di CommonsWare), Docmosis dispone di un servizio cloud che può essere d'aiuto: scaricare l'elaborazione su un servizio cloud che esegue l'elaborazione pesante. Tale approccio è ideale in alcune circostanze, ma ovviamente si basa sull'essere connesso in rete.


0

Puoi anche usare la libreria PoDoFo . L'obiettivo principale è che sia stato pubblicato sotto LGPL. Dato che è scritto in C ++, dovresti compilarlo in modo incrociato usando NDK e scrivere C-side e Java wrapper. Alcune delle librerie di terze parti possono essere utilizzate dal progetto OpenCV . Anche nel progetto OpenCV U puoi trovare il android.toolchain.cmakefile, che ti aiuterà a generare Makefile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.