Wie erstelle ich PDFs in einer Android App? [geschlossen]

147

Gibt es eine Möglichkeit, PDF-Dateien aus einer Android-Anwendung zu erstellen?

hichris123
quelle
6
Wäre es nicht schön, wenn sich das Imaging-Modell von Android von Qt inspirieren lassen würde? Qt stellte fest, dass das Generieren von PDF oder SVG so einfach sein kann wie das Umleiten des gleichen Codes, den man zum Zeichnen auf dem Bildschirm verwendet. Schauen Sie sich die Ableitung von QPrinter, QSvgGenerator und QWidget von QPaintDevice für das Muster an.
Calaf
1
Gleiches gilt für iOS. Die PDF-Generierung ist integriert.
Fabian Zeindl
2
Ich glaube, Kit Kat hat eine Funktion zum Generieren von PDF, aber ich weiß nicht, ob dies abwärtskompatibel ist. Ich habe eine Option unten gepostet und die folgende Seite listet verschiedene Optionen auf, die von kommerziell bis kostenlos reichen: stefan.fenz.at/creating-pdfs-on-android-an-evaluation
IcedDante
5
Lächerlich, dass dies als "Off-Topic" geschlossen wurde.
Joe Coder
2
Warum wurde dieser Beitrag geschlossen? Stackoverflow ist in Bezug auf den Umfang viel zu wählerisch. Diese Frage hat 175.000 Aufrufe. Als Codierungsressource sollte diese Site häufig vorkommende Dinge wie diese zulassen. Die Regeln müssen geändert werden. Wir lesen viel zu weit in den wörtlichen Text dessen, was "nicht zum Thema" gehört, und nicht in das Herzstück der Regel. Ich habe es für die Wiedereröffnung markiert, hoffe, dass auch andere abstimmen werden.
Albert Renshaw

Antworten:

155

Wenn jemand PDFs auf einem Android-Gerät erstellen möchte, gehen Sie wie folgt vor:

nikib3ro
quelle
54
Das einzige Problem mit iText ist, dass es sich um eine GPLv3-Lizenz handelt. Andernfalls müssen Sie eine kommerzielle Lizenz erwerben.
Tony Maro
5
und frühere Versionen von iText haben einige fehlende Abhängigkeiten wie java.awt.Color, die Dalvik nicht unterstützt
k-deux
3
@ kape123 netter Sinn für Humor :-)
AZ_
10
CommonsWare generische defätistische Antwort ... pwned.
Moonlightcheese
2
Die kommerzielle Lizenz kostet ca. USD 0,50 (0,42 EUR) pro Android-Gerät. (11-2013)
Chris623
104

Wenn Sie für Geräte mit API-Level 19 oder höher entwickeln, können Sie das integrierte PrintedPdfDocument verwenden: 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
quelle
2
Schließlich ist es Teil von Android als Teil von iOS.
Lalitm
5
@ Chris623 Ich denke du meintest "KitKat" ... :)
Android Entwickler
7
@lalitm Es ist nicht so wie es in ios ist. In iOS generiertes PDF enthält auswählbaren Text, der in doc geschrieben ist. Aber in Android ist es ein Bild.
Kantesh
2
@ WillThomson Sollte dein GitHub-Link dieser oder etwas anderes sein?
jk7
3
Vielen Dank - der nützliche Link ist hier github.com/IanDarwin/Android-Cookbook-Examples/blob/master/…
Kibi
26

Ein Trick, um ein PDF mit komplexen Funktionen zu erstellen, besteht darin, eine Dummy-Aktivität mit dem gewünschten XML-Layout zu erstellen. Sie können diese Dummy-Aktivität dann öffnen, programmgesteuert einen Screenshot erstellen und dieses Bild mithilfe dieser Bibliothek in PDF konvertieren . Natürlich gibt es Einschränkungen, z. B. nicht mehr als eine Seite scrollen zu können, aber für eine eingeschränkte Anwendung ist dies schnell und einfach. Hoffe das hilft jemandem!

hrishitiwari
quelle
2
Es hat mindestens 1up verdient.
Rahul Rastogi
arbeitete für mich. war eine einfache Implementierung.
TharakaNirmana
das ist eine coole Problemumgehung
Kumar Saurabh
Dieser Kommentar weist mich in die richtige Richtung. Allerdings: 1. Sie müssen keine Aktivität starten, um einen Screenshot zu machen! Sie können einfach ein XML-Layout zur Laufzeit aufblasen und es in eine Bitmap konvertieren, wie hier vorgeschlagen . Sie können jedoch mehrere Seiten mit unterschiedlichen Layouts erstellen. Scrollen wird nicht wie gesagt unterstützt, aber Sie können eine Liste implementieren, indem Sie beispielsweise ein lineares Layout verwenden.
r.pedrosa
11

Es ist nicht einfach, eine vollständige Lösung für das Problem der Konvertierung eines beliebigen HTML-Codes in PDF mit nicht englischen Buchstaben in Android zu finden. Ich teste es auf russische Unicode-Buchstaben.

Wir verwenden drei Bibliotheken:

(1) Jsoup (jsoup-1.7.3.jar) für eine Konvertierung von HTML nach 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;
    } 

Das schwierige Problem besteht darin, russische Buchstaben mithilfe der iTextPDF XMLWorker-Bibliothek in PDF anzuzeigen. Dazu sollten wir unsere eigene Implementierung der FontProvider-Schnittstelle erstellen:

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

Hier verwenden wir die Standard-Android-Schriftart Droid Sans, die sich im Systemordner befindet:

private static final String FONT_PATH = "/system/fonts/DroidSans.ttf";
DenisMath
quelle
1
Vielen Dank für Ihren Anteil! Ich habe eine Frage: Können wir eine CSS-Regel auf HTML anwenden?
Phuong
6

Ein bisschen spät und ich habe es noch nicht selbst getestet, aber eine andere Bibliothek, die unter der BSD-Lizenz steht, ist Android PDF Writer .

Update Ich habe die Bibliothek selbst ausprobiert. Funktioniert gut mit einfachen PDF-Generationen (es bietet Methoden zum Hinzufügen von Text, Linien, Rechtecken, Bitmaps, Schriftarten). Das einzige Problem besteht darin, dass die generierte PDF-Datei in einem String im Speicher gespeichert wird. Dies kann bei großen Dokumenten zu Speicherproblemen führen.

Angelo
quelle
Kann mir jemand sagen, was Android PDF Writer nicht kann, was "itext" kann?
M. Usman Khan
1
Nicht gepflegt !! Letzte Aktualisierung: 2015-12-14
Mahdi Alkhatib
2

PDFJet bietet eine Open-Source-Version ihrer Bibliothek, die alle grundlegenden Aufgaben zur PDF-Generierung ausführen kann. Es handelt sich um eine rein Java-basierte Lösung, die mit Android kompatibel sein soll. Es gibt eine kommerzielle Version mit einigen zusätzlichen Funktionen, die nicht zu teuer erscheinen.

IcedDante
quelle
4
kein Open Source mehr
Joshy Francis
0

Spät, aber relevant auf Anfrage und hoffentlich hilfreich. Wenn Sie einen externen Dienst verwenden (wie in der Antwort von CommonsWare vorgeschlagen), verfügt Docmosis über einen Cloud-Dienst, der möglicherweise hilfreich ist - das Auslagern der Verarbeitung auf einen Cloud-Dienst, der die umfangreiche Verarbeitung ausführt . Dieser Ansatz ist unter bestimmten Umständen ideal, hängt jedoch natürlich von einer Netzverbindung ab.

Paul Jowett
quelle
0

Sie können auch die PoDoFo- Bibliothek verwenden. Das Hauptziel ist, dass es unter LGPL veröffentlicht wird. Da es in C ++ geschrieben ist, sollten Sie es mit NDK überkompilieren und C-seitigen und Java-Wrapper schreiben. Einige Bibliotheken von Drittanbietern können aus dem OpenCV- Projekt verwendet werden. Auch im OpenCV-Projekt U finden Sie android.toolchain.cmakeDateien, die Ihnen beim Generieren helfen Makefile.

Johnny Doe
quelle