Existe alguma maneira de criar arquivos PDF a partir de um aplicativo Android?
Existe alguma maneira de criar arquivos PDF a partir de um aplicativo Android?
Respostas:
Se alguém quiser gerar PDFs no dispositivo Android, veja como fazê-lo:
Se você estiver desenvolvendo para dispositivos com API nível 19 ou superior, poderá usar o PrintedPdfDocument incorporado: 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();
Um truque para criar um PDF com recursos complexos é criar uma atividade fictícia com o layout xml desejado. Em seguida, você pode abrir essa atividade fictícia, tirar uma captura de tela programaticamente e converter essa imagem em pdf usando esta biblioteca . Obviamente, existem limitações como não poder rolar, não mais que uma página, mas para um aplicativo limitado isso é rápido e fácil. Espero que isso ajude alguém!
Não é fácil encontrar uma solução completa do problema de uma conversão arbitrária de HTML para PDF com letras em inglês no Android. Eu testo-o para letras unicode russas.
Usamos três bibliotecas:
(1) Jsoup (jsoup-1.7.3.jar) para uma conversão de HTML para 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;
}
O difícil problema é exibir letras russas em PDF usando a biblioteca iTextPDF XMLWorker. Para isso, devemos criar nossa própria implementação da 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 ); }
}
Aqui, usamos a fonte padrão do Android Droid Sans, localizada na pasta do sistema:
private static final String FONT_PATH = "/system/fonts/DroidSans.ttf";
Um pouco atrasado e eu ainda não o testei, mas outra biblioteca que está sob a licença BSD é o Android PDF Writer .
Atualização Eu tentei a biblioteca. Funciona bem com gerações simples de pdf (fornece métodos para adicionar texto, linhas, retângulos, bitmaps, fontes). O único problema é que o PDF gerado é armazenado em uma String na memória, isso pode causar problemas de memória em documentos grandes.
O PDFJet oferece uma versão de código aberto de sua biblioteca que deve ser capaz de lidar com qualquer tarefa básica de geração de PDF. É uma solução puramente baseada em Java e é considerada compatível com o Android. Existe uma versão comercial com alguns recursos adicionais que não parecem muito caros.
Tarde, mas relevante para solicitar e espero que útil. Se você estiver usando um serviço externo (como sugerido na resposta do CommonsWare), o Docmosis possui um serviço em nuvem que pode ajudar - transferindo o processamento para um serviço em nuvem que realiza o processamento pesado. Essa abordagem é ideal em algumas circunstâncias, mas é claro que depende de estar conectado à rede.
Você também pode usar a biblioteca PoDoFo . O objetivo principal é que seja publicado sob LGPL. Como está escrito em C ++, você deve compilá-lo usando o NDK e escrever o lado C e o wrapper Java. Algumas bibliotecas de terceiros podem ser usadas no projeto OpenCV . Também no projeto OpenCV, você pode encontrar o android.toolchain.cmake
arquivo, que o ajudará na geração Makefile
.