¿Hay alguna forma de crear archivos PDF desde una aplicación de Android?
¿Hay alguna forma de crear archivos PDF desde una aplicación de Android?
Respuestas:
Si alguien quiere generar archivos PDF en un dispositivo Android, aquí está cómo hacerlo:
Si está desarrollando dispositivos con un nivel de API 19 o superior, puede usar el documento impreso PrintedPdf: 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 truco para hacer un PDF con características complejas es hacer una actividad ficticia con el diseño xml deseado. Luego puede abrir esta actividad ficticia, tomar una captura de pantalla mediante programación y convertir esa imagen a pdf usando esta biblioteca . Por supuesto, hay limitaciones, como no poder desplazarse, no más de una página, pero para una aplicación limitada, esto es rápido y fácil. ¡Espero que esto ayude a alguien!
No es fácil encontrar una solución completa del problema de la conversión de un HTML arbitrario a PDF con letras que no están en inglés en Android. Lo pruebo para las letras Unicode rusas.
Utilizamos tres bibliotecas:
(1) Jsoup (jsoup-1.7.3.jar) para una conversión de 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;
}
El problema difícil es mostrar letras rusas en PDF utilizando la biblioteca iTextPDF XMLWorker. Para esto debemos crear nuestra propia implementación de la interfaz 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 ); }
}
Aquí usamos la fuente estándar de Android Droid Sans, que se encuentra en la carpeta del sistema:
private static final String FONT_PATH = "/system/fonts/DroidSans.ttf";
Un poco tarde y todavía no lo he probado, pero otra biblioteca que está bajo la licencia BSD es Android PDF Writer .
Actualización He probado la biblioteca yo mismo. Funciona bien con generaciones de PDF simples (proporciona métodos para agregar texto, líneas, rectángulos, mapas de bits, fuentes). El único problema es que el PDF generado se almacena en una Cadena en la memoria, esto puede causar problemas de memoria en documentos de gran tamaño.
PDFJet ofrece una versión de código abierto de su biblioteca que debería ser capaz de manejar cualquier tarea básica de generación de PDF. Es una solución puramente basada en Java y se afirma que es compatible con Android. Existe una versión comercial con algunas características adicionales que no parece ser demasiado costosa.
Tarde, pero relevante para solicitar y con suerte útil. Si utiliza un servicio externo (como se sugiere en la respuesta de CommonsWare), Docmosis tiene un servicio en la nube que podría ayudar: descargar el procesamiento a un servicio en la nube que realiza el procesamiento pesado. Ese enfoque es ideal en algunas circunstancias, pero por supuesto depende de estar conectado a la red.
U también puede usar la biblioteca PoDoFo . El objetivo principal es que se publique bajo LGPL. Dado que está escrito en C ++, debe realizar una compilación cruzada con NDK y escribir C-side y Java wrapper. Algunas bibliotecas de terceros se pueden usar desde el proyecto OpenCV . También en OpenCV el proyecto U puede encontrar un android.toolchain.cmake
archivo, que lo ayudará a generar Makefile
.