Bir Android uygulamasında nasıl PDF oluşturulur? [kapalı]


148

Bir Android uygulamasından PDF Dosyaları oluşturmanın herhangi bir yolu var mı?


6
Android'in görüntüleme modelinin Qt'lardan biraz ilham alması hoş olmaz mıydı? Qt, PDF veya SVG oluşturmanın, ekranda çizmek için kullanılan aynı kodu yeniden yönlendirmek kadar basit olabileceğini tespit etti. Desen için QPaintDevice'den QPrinter, QSvgGenerator ve QWidget türetilmesine bakın.
Calaf

1
İOS'ta aynı. PDF oluşturma yerleşiktir.
Fabian Zeindl

2
Kit Kat'ın PDF oluşturma özelliğine sahip olduğuna inanıyorum, ancak bunun geriye dönük olarak uyumlu olup olmadığını bilmiyorum. Aşağıda bir seçenek yayınladım ve aşağıdaki site reklamdan ücretsiz olana
IcedDante

5
Bunun "konu dışı" olarak kapatılması gülünç.
Joe Coder

2
Bu gönderi neden kapatıldı? Stackoverflow, kapsamı konusunda çok seçici; Bu soru 175.000 görüşe sahip, bir kodlama kaynağı olarak bu site bunun gibi hiper-yaygın şeylere izin vermeli, kuralların değiştirilmesi gerekiyor, kuralın özünden ziyade "konu dışı" neyin gerçek metnini çok fazla okuyoruz. Yeniden açılması için işaretledim, umarım başkaları da oy kullanır.
Albert Renshaw

Yanıtlar:


154

Biri Android cihazında PDF oluşturmak isterse, bunu şu şekilde yapabilirsiniz:


56
İText ile ilgili tek sorun, bunun bir GPLv3 lisansı olmasıdır, yoksa ticari bir lisans satın almanız gerekir.
Tony Maro

5
ve iText'in önceki sürümlerinde dalvik'in desteklemediği java.awt.Color gibi bazı eksik bağımlılıklar var
k-deux

3
@ kape123 güzel mizah duygusu :-)
AZ_

10
CommonsWare genel bozguncu cevap ... şaşkın.
moonlightcheese

2
ticari lisans, Android cihaz başına yaklaşık 0,50 USD (0,42 EUR) tutarındadır. (11-2013)
Chris623

107

API seviyesi 19 veya daha yüksek olan cihazlar için geliştirme yapıyorsanız, yerleşik PrintedPdfDocument'i kullanabilirsiniz: 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
Sonunda iOS'un parçası olarak Android'in bir parçası.
lalitm

5
@ Chris623 Sanırım "KitKat" demek istedin ... :)
android geliştiricisi

7
@lalitm ios'ta olduğu gibi değil. İOS'ta oluşturulan pdf, doc'ta yazılmış seçilebilir metne sahiptir. Ama androidde bu bir görüntü.
Kantesh

2
@WillThomson GitHub bağlantınız bu muydu yoksa başka bir şey miydi?
jk7

3
Çok teşekkürler - kullanışlı bağlantı burada github.com/IanDarwin/Android-Cookbook-Examples/blob/master/...
Kibi

28

Karmaşık özelliklere sahip bir PDF oluşturmanın püf noktası, istenen xml düzeniyle sahte bir etkinlik yapmaktır. Daha sonra bu kukla etkinliği açabilir, programlı olarak bir ekran görüntüsü alabilir ve bu kütüphaneyi kullanarak bu görüntüyü pdf'ye dönüştürebilirsiniz . Elbette kaydırma yapamama, birden fazla sayfa olmaması gibi sınırlamalar var, ancak sınırlı bir uygulama için bu hızlı ve kolaydır. Umarım bu birine yardımcı olur!


2
En az 1up hak etti.
Rahul Rastogi

benim için çalıştı. basit bir uygulamaydı.
TharakaNirmana

bu harika bir çözüm
Kumar Saurabh

Bu yorum beni doğru yönü gösteriyor. Ancak: 1. Ekran görüntüsü almak için bir aktivite başlatmanıza gerek yoktur! sadece çalışma zamanında bir xml düzenini şişirebilir ve burada önerildiği gibi bir bitmap'e dönüştürebilirsiniz ; Bununla birlikte, farklı düzenlere sahip birden çok sayfa oluşturabilirsiniz. Kaydırma söylendiği gibi desteklenmiyor, ancak örneğin doğrusal bir düzen kullanarak bir liste uygulayabilirsiniz.
r.pedrosa

11

Android'de rastgele bir HTML'nin İngilizce olmayan harflerle PDF'ye dönüştürülmesi sorununa tam bir çözüm bulmak kolay değildir. Rus unicode harfleri için test ediyorum.

Üç kitaplık kullanıyoruz:

(1) Jsoup XHTML’ye dönüştürme için (jsoup-1.7.3.jar),

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

Zor sorun, iTextPDF XMLWorker kitaplığını kullanarak Rusça harfleri PDF'de görüntülemektir. Bunun için kendi FontProvider arayüzü uygulamamızı oluşturmalıyız:

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

Burada, sistem klasöründe bulunan standart Android yazı tipi Droid Sans'ı kullanıyoruz:

private static final String FONT_PATH = "/system/fonts/DroidSans.ttf";

1
Payınız için teşekkürler! Bir sorum var: HTML'ye herhangi bir CSS kuralı uygulayabilir miyiz?
Phuong

6

Biraz geç ve henüz kendimi henüz test etmedim ama altında başka kütüphane BSD lisansı olan Android PDF Writer .

Güncelleme Kütüphaneyi kendim denedim. Basit pdf nesilleriyle sorunsuz çalışır (metin, çizgi, dikdörtgen, bitmap, yazı tipi eklemek için yöntemler sağlar). Tek sorun, oluşturulan PDF'nin bellekteki bir Dizede saklanmasıdır, bu büyük belgelerde bellek sorunlarına neden olabilir.


Biri bana Android PDF Writer'ın yapamayacağını, "itext" in yapabileceğini söyleyebilir mi?
M. Usman Khan

1
Bakım yapılmadı !! Son Güncelleme: 2015-12-14
Mahdi Alkhatib

2

PDFJet , herhangi bir temel PDF oluşturma görevini yerine getirebilecek kütüphanelerinin açık kaynaklı bir sürümünü sunar. Tamamen Java tabanlı bir çözümdür ve Android ile uyumlu olduğu belirtilmektedir. Çok pahalı görünmeyen bazı ek özelliklere sahip ticari bir sürüm var.


5
artık açık kaynak yok
Joshy Francis

0

Geç, ancak taleple alakalı ve umarım yardımcı olur. Harici bir hizmet kullanıyorsanız (CommonsWare tarafından verilen yanıtta önerildiği gibi), Docmosis'in yardımcı olabilecek bir bulut hizmeti vardır - işlemi ağır işlemleri gerçekleştiren bir bulut hizmetine aktarır . Bu yaklaşım bazı durumlarda idealdir, ancak elbette ağ bağlantılı olmaya dayanır.


0

Ayrıca PoDoFo kitaplığını da kullanabilirsiniz . Temel amaç, LGPL altında yayınlanmasıdır. C ++ ile yazıldığından, NDK kullanarak çapraz derlemelisiniz ve C-tarafı ve Java sarmalayıcısı yazmalısınız. Bazı üçüncü taraf kitaplıkları OpenCV projesinden kullanılabilir . Ayrıca OpenCV projesinde U android.toolchain.cmake, oluşturmanıza yardımcı olacak dosyayı bulabilir Makefile.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.