Jak tworzyć pliki PDF w aplikacji na Androida? [Zamknięte]

147

Czy istnieje sposób na tworzenie plików PDF z aplikacji na Androida?

hichris123
źródło
6
Czy nie byłoby miło, gdyby model obrazowania Androida czerpał inspirację z Qt? Qt ustalił, że generowanie plików PDF lub SVG może być tak proste, jak przekierowanie tego samego kodu, którego używa się do rysowania na ekranie. Spójrz na pochodzenie QPrinter, QSvgGenerator i QWidget z QPaintDevice dla wzorca.
Calaf
1
To samo w iOS. Generowanie plików PDF jest wbudowane.
Fabian Zeindl
2
Uważam, że Kit Kat ma funkcję generowania plików PDF, ale nie wiem, czy jest to kompatybilne wstecz. Poniżej zamieściłem opcję, a na poniższej stronie wymieniono kilka opcji, od komercyjnych do bezpłatnych: stefan.fenz.at/creating-pdfs-on-android-an-evaluation
IcedDante
5
Śmieszne, że to zostało zamknięte jako „nie na temat”.
Joe Coder
2
Dlaczego ten wpis został zamknięty? Stackoverflow jest zbyt wybredny, jeśli chodzi o zakres; to pytanie ma 175 000 odsłon, ponieważ jako źródło kodowania, ta witryna powinna umożliwiać takie hiper-powszechne rzeczy, zasady wymagają zmiany, czytamy o wiele za daleko w dosłownym tekście tego, co jest „nie na temat”, a nie w sercu reguły. Zgłosiłem to do ponownego otwarcia, mam nadzieję, że inni też będą głosować.
Albert Renshaw

Odpowiedzi:

155

Jeśli ktoś chce generować pliki PDF na urządzeniu z Androidem, oto jak to zrobić:

nikib3ro
źródło
54
Jedynym problemem z iText jest to, że jest to licencja GPLv3, w przeciwnym razie musisz kupić licencję komercyjną.
Tony Maro
5
i starsze wersje iText mają pewne brakujące zależności, takie jak java.awt.Color, których dalvik nie obsługuje
k-deux
3
@ kape123 niezłe poczucie humoru :-)
AZ_
10
CommonsWare ogólna defetystyczna odpowiedź ... pwned.
moonlightcheese
2
licencja komercyjna kosztuje około 0,50 USD (0,42 EUR) za urządzenie z systemem Android. (11-2013)
Chris623,
104

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();
teh.fonsi
źródło
2
Wreszcie jest częścią Androida jako część iOS.
lalitm
5
@ Chris623 Myślę, że miałeś na myśli „KitKat” ... :)
programista Androida
7
@lalitm To nie jest tak, jak w iOS. Plik PDF wygenerowany w iOS zawiera tekst do wyboru, zapisany w dokumencie. Ale w Androidzie jest to obraz.
Kantesh
2
@WillThomson Czy Twój link do GitHub miał być tym, czy czymś innym?
jk7
3
Dziękuję bardzo - przydatny link jest tutaj github.com/IanDarwin/Android-Cookbook-Examples/blob/master/…
Kibi
27

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!

hrishitiwari
źródło
2
Zasługiwał na co najmniej 1 up.
Rahul Rastogi
pracował dla mnie. była prostą implementacją.
TharakaNirmana
to fajne obejście
Kumar Saurabh
Ten komentarz wskazuje mi właściwy kierunek. Jednak: 1. nie musisz rozpoczynać działania, aby zrobić zrzut ekranu! możesz po prostu nadmuchać układ XML w czasie wykonywania i przekonwertować go na bitmapę, jak sugerowano tutaj ; Mając to na uwadze, możesz wygenerować wiele stron z różnymi układami. Przewijanie nie jest obsługiwane, jak powiedziano, ale możesz zaimplementować listę, używając na przykład układu liniowego.
r.pedrosa
11

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";
DenisMath
źródło
1
Dzięki za udostępnienie! Mam pytanie: czy możemy zastosować jakąkolwiek regułę CSS do HTML?
Phuong
6

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.

Angelo
źródło
Czy ktoś może mi powiedzieć, czego nie potrafi program Android PDF Writer, a może „itext”?
M. Usman Khan
1
Nie utrzymywane !! Ostatnia aktualizacja:
2015-12-14
2

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.

IcedDante
źródło
4
koniec z
0

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ą.

Paul Jowett
źródło
0

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.cmakeplik, który pomoże Ci w wygenerowaniu Makefile.

Johnny Doe
źródło