Esiste un modo per creare file PDF da un'applicazione Android?
Esiste un modo per creare file PDF da un'applicazione Android?
Risposte:
Se qualcuno vuole generare PDF su un dispositivo Android, ecco come farlo:
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();
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!
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";
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.
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.
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.
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.cmake
file, che ti aiuterà a generare Makefile
.