Bagaimana cara membuat PDF di aplikasi Android? [Tutup]

147

Apakah ada cara untuk membuat File PDF dari aplikasi Android?

hichris123
sumber
6
Bukankah lebih baik jika model pencitraan Android mengambil inspirasi dari Qt? Qt menetapkan bahwa menghasilkan PDF atau SVG dapat sesederhana mengarahkan ulang kode yang sama yang digunakan untuk menggambar di layar. Lihatlah derivasi QPrinter, QSvgGenerator, dan QWidget dari QPaintDevice untuk polanya.
Calaf
1
Sama di iOS. Pembuatan PDF sudah ada di dalamnya.
Fabian Zeindl
2
Saya percaya Kit Kat memiliki fitur untuk menghasilkan PDF, tetapi saya tidak tahu apakah ini kompatibel dengan mundur. Saya telah memposting opsi di bawah ini dan situs berikut mencantumkan beberapa opsi mulai dari komersial hingga gratis: stefan.fenz.at/creating-pdfs-on-android-an-evaluation
IcedDante
5
Konyol bahwa ini ditutup sebagai "di luar topik".
Joe Coder
2
Mengapa pos ini ditutup? Stackoverflow terlalu pilih-pilih tentang cakupannya; pertanyaan ini memiliki 175.000 tampilan, sebagai sumber pengkodean situs ini harus memungkinkan hal-hal biasa seperti ini, aturan perlu diubah, kita membaca terlalu jauh ke dalam teks literal dari apa yang "di luar topik" daripada inti dari aturan. Saya menandainya untuk membuka kembali, berharap orang lain akan memilih juga.
Albert Renshaw

Jawaban:

155

Jika ada yang ingin menghasilkan PDF di perangkat Android, berikut adalah cara melakukannya:

nikib3ro
sumber
54
Satu-satunya masalah dengan iText adalah bahwa itu adalah lisensi GPLv3, atau Anda harus membeli lisensi komersial.
Tony Maro
5
dan versi sebelumnya dari iText memiliki beberapa dependensi yang hilang seperti java.awt.Color yang dalvik tidak mendukung
k-deux
3
@ kape123 selera humor yang bagus :-)
AZ_
10
CommonsWare adalah jawaban umum untuk orang yang menyerah ... pwned.
moonlightcheese
2
biaya lisensi komersial sekitar USD 0,50 (0,42 EUR) per perangkat Android. (11-2013)
Chris623
104

Jika Anda mengembangkan untuk perangkat dengan API level 19 atau lebih tinggi, Anda dapat menggunakan built in PrintedPdfDocument: 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();
teh.fonsi
sumber
2
Akhirnya bagian dari Android sebagai bagian dari iOS.
lalitm
5
@ Chris623 Saya pikir Anda maksud "KitKat" ... :)
pengembang android
7
@lalitm Tidak seperti di ios. Pdf yang dihasilkan di iOS memiliki teks pilihan yang ditulis dalam dokumen. Namun di android ini adalah gambar.
Kantesh
2
@WillThomson Apakah tautan GitHub Anda seharusnya seperti ini atau yang lain?
jk7
3
Terima kasih banyak - tautan bermanfaat ada di sini github.com/IanDarwin/Android-Cookbook-Examples/blob/master/…
Kibi
27

Trik untuk membuat PDF dengan fitur-fitur kompleks adalah membuat aktivitas tiruan dengan tata letak xml yang diinginkan. Anda kemudian dapat membuka kegiatan boneka ini, mengambil screenshot pemrograman dan mengkonversi gambar yang ke pdf menggunakan library ini . Tentu saja ada batasan seperti tidak dapat menggulir, tidak lebih dari satu halaman, tetapi untuk aplikasi terbatas ini cepat dan mudah. Semoga ini bisa membantu seseorang!

hrishitiwari
sumber
2
Layak minimal 1up.
Rahul Rastogi
bekerja untukku. adalah implementasi sederhana.
TharakaNirmana
itu solusi keren
Kumar Saurabh
Komentar ini mengarahkan saya ke arah yang benar. Namun: 1. Anda tidak perlu memulai aktivitas untuk mengambil screenshot! Anda bisa saja mengembang tata letak xml pada saat runtime dan mengubahnya menjadi bitmap seperti yang disarankan di sini ; Yang sedang berkata, Anda dapat menghasilkan beberapa halaman dengan tata letak yang berbeda. Gulir tidak didukung seperti yang dikatakan tetapi Anda dapat mengimplementasikan daftar menggunakan, misalnya, tata letak linier.
r.pedrosa
11

Tidak mudah untuk menemukan solusi lengkap dari masalah konversi HTML ke PDF sewenang-wenang dengan huruf non-Inggris di Android. Saya mengujinya untuk huruf unicode Rusia.

Kami menggunakan tiga perpustakaan:

(1) Jsoup (jsoup-1.7.3.jar) untuk konversi dari HTML ke 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;
    } 

Masalah yang sulit adalah menampilkan huruf Rusia dalam PDF dengan menggunakan pustaka XMLWorker iTextPDF. Untuk ini, kita harus membuat implementasi antarmuka FontProvider kita sendiri:

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

Di sini kita menggunakan font Android standar Droid Sans, yang terletak di folder sistem:

private static final String FONT_PATH = "/system/fonts/DroidSans.ttf";
DenisMath
sumber
1
Terima kasih untuk bagianmu! Saya punya pertanyaan: Bisakah kita menerapkan aturan CSS ke HTML?
Phuong
6

Sedikit terlambat dan saya belum mengujinya sendiri tetapi perpustakaan lain yang berada di bawah lisensi BSD adalah Android PDF Writer .

Pembaruan Saya telah mencoba perpustakaan sendiri. Bekerja ok dengan generasi pdf sederhana (ini menyediakan metode untuk menambahkan teks, garis, persegi panjang, bitmap, font). Satu-satunya masalah adalah bahwa PDF yang dihasilkan disimpan dalam String di memori, ini dapat menyebabkan masalah memori dalam dokumen besar.

Angelo
sumber
Adakah yang bisa memberi tahu saya apa yang tidak bisa dilakukan oleh Android PDF Writer, yang bisa "itext"?
M. Usman Khan
1
Tidak terawat!! Pembaruan Terakhir: 2015-12-14
Mahdi Alkhatib
2

PDFJet menawarkan versi open-source perpustakaan mereka yang harus dapat menangani tugas pembuatan PDF dasar. Ini adalah solusi murni berbasis Java dan dinyatakan kompatibel dengan Android. Ada versi komersial dengan beberapa fitur tambahan yang tampaknya tidak terlalu mahal.

IcedDante
sumber
4
tidak ada lagi open-source
Joshy Francis
0

Terlambat, tetapi relevan untuk meminta dan semoga bermanfaat. Jika menggunakan layanan eksternal (seperti yang disarankan dalam balasan oleh CommonsWare) maka Docmosis memiliki layanan cloud yang mungkin membantu - membongkar pemrosesan ke layanan cloud yang melakukan pemrosesan berat. Pendekatan itu ideal dalam beberapa keadaan tetapi tentu saja bergantung pada koneksi internet.

Paul Jowett
sumber
0

Anda juga dapat menggunakan perpustakaan PoDoFo . Tujuan utamanya adalah bahwa itu diterbitkan di bawah LGPL. Karena ini ditulis dalam C ++ Anda harus mengkompilasi silang menggunakan NDK dan menulis C-side dan Java wrapper. Beberapa perpustakaan pihak ketiga dapat digunakan dari proyek OpenCV . Juga di proyek OpenCV Anda dapat menemukan android.toolchain.cmakefile, yang akan membantu Anda menghasilkan Makefile.

Johnny Doe
sumber