Czy istnieje sposób na tworzenie plików PDF z aplikacji na Androida?
Czy istnieje sposób na tworzenie plików PDF z aplikacji na Androida?
Odpowiedzi:
Jeśli ktoś chce generować pliki PDF na urządzeniu z Androidem, oto jak to zrobić:
Jeśli tworzysz dla urządzeń z poziomem API 19 lub wyższym, możesz skorzystać z wbudowanego 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();
Sztuczka tworzenia pliku PDF ze złożonymi funkcjami polega na wykonaniu fikcyjnej czynności z pożądanym układem XML. Następnie możesz otworzyć tę fikcyjną czynność, zrobić zrzut ekranu programowo i przekonwertować ten obraz do formatu PDF za pomocą tej biblioteki . Oczywiście istnieją ograniczenia, takie jak brak możliwości przewijania, nie więcej niż jedna strona, ale w przypadku ograniczonej aplikacji jest to szybkie i łatwe. Mam nadzieję, że to komuś pomoże!
Nie jest łatwo znaleźć pełne rozwiązanie problemu konwersji dowolnego kodu HTML na PDF z nieanglojęzycznymi literami w systemie Android. Testuję go pod kątem rosyjskich liter Unicode.
Korzystamy z trzech bibliotek:
(1) Jsoup (jsoup-1.7.3.jar) do konwersji z HTML do 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;
}
Trudnym problemem jest wyświetlanie rosyjskich liter w formacie PDF przy użyciu biblioteki iTextPDF XMLWorker. W tym celu powinniśmy stworzyć własną implementację interfejsu 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 ); }
}
Tutaj używamy standardowej czcionki Android Droid Sans, która znajduje się w folderze systemowym:
private static final String FONT_PATH = "/system/fonts/DroidSans.ttf";
Trochę późno i jeszcze tego nie testowałem, ale inną biblioteką, która jest na licencji BSD, jest Android PDF Writer .
Aktualizacja Sam wypróbowałem bibliotekę. Działa dobrze z prostymi generacjami PDF (zapewnia metody dodawania tekstu, linii, prostokątów, bitmap, czcionek). Jedynym problemem jest to, że wygenerowany plik PDF jest przechowywany w pamięci w postaci ciągu, co może powodować problemy z pamięcią w dużych dokumentach.
PDFJet oferuje otwartą wersję swojej biblioteki, która powinna być w stanie obsłużyć każde podstawowe zadanie generowania plików PDF. Jest to rozwiązanie oparte wyłącznie na Javie i jest zgodne z systemem Android. Dostępna jest wersja komercyjna z kilkoma dodatkowymi funkcjami, która nie wydaje się być zbyt droga.
Spóźniony, ale odpowiedni do prośby i mam nadzieję, że pomocny. Jeśli korzystasz z usługi zewnętrznej (jak sugeruje odpowiedź CommonsWare), Docmosis ma usługę w chmurze, która może pomóc - przeniesienie przetwarzania do usługi w chmurze, która wykonuje ciężkie przetwarzanie. Takie podejście jest idealne w niektórych okolicznościach, ale oczywiście polega na połączeniu z siecią.
Możesz również skorzystać z biblioteki PoDoFo . Głównym celem jest opublikowanie go na licencji LGPL. Ponieważ jest napisany w C ++, powinieneś skompilować go krzyżowo przy użyciu NDK i napisać opakowanie po stronie C i Java. Niektóre biblioteki innych firm mogą być używane z projektu OpenCV . Również w projekcie OpenCV U możesz znaleźć android.toolchain.cmake
plik, który pomoże Ci w wygenerowaniu Makefile
.