Como criar PDFs em um aplicativo Android? [fechadas]


147

Existe alguma maneira de criar arquivos PDF a partir de um aplicativo Android?


6
Não seria legal se o modelo de imagem do Android se inspirasse no Qt? A Qt estabeleceu que gerar PDF ou SVG pode ser tão simples quanto redirecionar o mesmo código usado para desenhar na tela. Observe a derivação de QPrinter, QSvgGenerator e QWidget de QPaintDevice para o padrão.
Calaf

1
O mesmo no iOS. A geração de PDF é incorporada.
Fabian Zeindl

2
Acredito que Kit Kat tenha um recurso para gerar PDF, mas não sei se isso é compatível com versões anteriores. Tenho postado uma opção abaixo e as seguintes listas de sites várias opções que vão desde comerciais para livre: stefan.fenz.at/creating-pdfs-on-android-an-evaluation
IcedDante

5
Ridículo que isso foi fechado como "fora de tópico".
Joe Coder

2
Por que esta postagem foi fechada? O Stackoverflow é muito exigente quanto ao seu escopo; Essa pergunta tem 175.000 visualizações. Como recurso de codificação, este site deve permitir coisas hiper-comuns como essa, as regras precisam ser alteradas. Eu o sinalizei para reabrir, espero que outros votem também.
Albert Renshaw

Respostas:


155

Se alguém quiser gerar PDFs no dispositivo Android, veja como fazê-lo:


54
O único problema com o iText é que é uma licença GPLv3, ou você deve adquirir uma licença comercial.
9788 Tony Maro

5
e versões anteriores do iText ter algumas dependências que estão faltando como java.awt.Color wich Dalvik não suporta
k-deux

3
@ kape123 bom senso de humor :-)
AZ_

10
Resposta derrotista genérica do CommonsWare ... pwned.
moonlightcheese

2
a licença comercial custa cerca de US $ 0,50 (0,42 EUR) por dispositivo Android. (11-2013)
Chris623

104

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();

2
Finalmente, faz parte do Android como parte do iOS.
Lalitm 27/03/14

5
@ Chris623 Acho que você quis dizer "KitKat" ... :)
desenvolvedor Android

7
@lalitm Não é como é no ios. O PDF gerado no iOS possui um texto selecionável escrito em doc. Mas no android é uma imagem.
Kantesh 27/11/14

2
@WillThomson Seu link do GitHub deveria ser este ou algo mais?
Jk7 #


27

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!


2
Merecia pelo menos 1up.
Rahul Rastogi

trabalhou para mim. foi uma implementação simples.
TharakaNirmana

isso é uma solução alternativa legal
Kumar Saurabh

Este comentário me aponta na direção certa. No entanto: 1. você não precisa iniciar uma atividade para tirar uma captura de tela! você pode apenas inflar um layout xml no tempo de execução e convertê-lo em um bitmap, como sugerido aqui ; Dito isto, você pode gerar várias páginas com diferentes layouts. A rolagem não é suportada como foi dito, mas você pode implementar uma lista usando, por exemplo, um layout linear.
precisa saber é o seguinte

11

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";

1
Obrigado pela sua parte! Tenho uma pergunta: podemos aplicar alguma regra CSS ao HTML?
Phuong

6

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.


Alguém pode me dizer o que o Android PDF Writer não pode fazer, que o "itext" pode?
M. Usman Khan

1
Não mantido !! Última atualização: 14/12/2015
Mahdi Alkhatib 27/03

2

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.


4
não há mais código-fonte aberto
Joshy Francis

0

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.


0

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.cmakearquivo, que o ajudará na geração Makefile.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.