Gibt es eine Möglichkeit, PDF-Dateien aus einer Android-Anwendung zu erstellen?
Gibt es eine Möglichkeit, PDF-Dateien aus einer Android-Anwendung zu erstellen?
Antworten:
Wenn jemand PDFs auf einem Android-Gerät erstellen möchte, gehen Sie wie folgt vor:
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();
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!
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";
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.
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.
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.
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.cmake
Dateien, die Ihnen beim Generieren helfen Makefile
.