Existe-t-il un moyen de créer des fichiers PDF à partir d'une application Android ?
Réponses
Trop de publicités?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";
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 .
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 !
- Réponses précédentes
- Plus de réponses