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


147

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


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ć:


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

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!


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";

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.


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.



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


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.