Làm cách nào để tạo tệp PDF trong ứng dụng Android? [đóng cửa]


147

Có cách nào để tạo tệp PDF từ ứng dụng Android không?


6
Sẽ không hay sao nếu mô hình hình ảnh của Android lấy cảm hứng từ Qt's? Qt đã thiết lập rằng việc tạo PDF hoặc SVG có thể đơn giản như chuyển hướng cùng một mã mà người ta sử dụng để vẽ trên màn hình. Nhìn vào đạo hàm của QPrinter, QSvgGenerator và QWidget từ QPaintDevice cho mẫu.
Calaf

1
Tương tự trong iOS. Tạo PDF được tích hợp sẵn.
Fabian Zeindl

2
Tôi tin rằng Kit Kat có một tính năng để tạo PDF, nhưng tôi không biết điều này có tương thích ngược không. Tôi đã đăng một tùy chọn bên dưới và trang web sau liệt kê một số tùy chọn từ thương mại đến miễn phí: stefan.fenz.at/creating-pdfs-on-android-an-ev Assessment
IcedDante 17/214

5
Vô lý rằng điều này đã được đóng lại là "lạc đề".
Joe Coder

2
Tại sao bài này đã đóng cửa? Stackoverflow là cách quá cầu kỳ về phạm vi của nó; Câu hỏi này có 175.000 lượt xem, vì tài nguyên mã hóa trang web này sẽ cho phép những thứ siêu phổ biến như thế này, các quy tắc cần sửa đổi, chúng ta đọc quá xa vào văn bản nghĩa đen của "ngoài chủ đề" chứ không phải là trung tâm của quy tắc. Tôi đánh dấu nó để mở lại, hy vọng những người khác cũng sẽ bỏ phiếu.
Albert Renshaw

Câu trả lời:


155

Nếu bất cứ ai muốn tạo tệp PDF trên thiết bị Android, đây là cách thực hiện:


54
Chỉ có vấn đề với iText là nó là giấy phép GPLv3, nếu không bạn phải mua giấy phép thương mại.
Tony Maro

5
và các phiên bản trước của iText có một số phụ thuộc bị thiếu như java.awt.Color wich dalvik không hỗ trợ
k-deux

3
@ kape123 khiếu hài hước tuyệt vời :-)
AZ_

10
CommonsWare chung chung thất bại trả lời ... pwned.
moonlightcheese

2
giấy phép thương mại có giá khoảng 0,5 USD (0,42 EUR) cho mỗi thiết bị Android. (11-2013)
Chris623

104

Nếu bạn đang phát triển cho các thiết bị có API cấp 19 trở lên, bạn có thể sử dụng PrintPdfDocument tích hợp: 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
Cuối cùng, một phần của Android là một phần của iOS.
lalitm

5
@ Chris623 Tôi nghĩ bạn có nghĩa là "KitKat" ... :)
nhà phát triển Android

7
@lalitm Không phải như trong ios. Pdf được tạo trong iOS có văn bản có thể chọn được viết bằng doc. Nhưng trong Android nó là một hình ảnh.
Kantesh

2
@WillThomson Liên kết GitHub của bạn có phải là liên kết này hay cái gì khác không?
jk7

3
Cảm ơn rất nhiều - liên kết hữu ích có ở đây github.com/IanDarwin/Android-Cookbook-Examples/blob/master/ mẹo
Kibi

27

Một mẹo để tạo một tệp PDF với các tính năng phức tạp là tạo một hoạt động giả với bố cục xml mong muốn. Sau đó, bạn có thể mở hoạt động giả này, chụp ảnh màn hình theo chương trình và chuyển đổi hình ảnh đó thành pdf bằng thư viện này . Tất nhiên có những hạn chế như không thể cuộn, không quá một trang, nhưng đối với một ứng dụng hạn chế thì việc này rất nhanh chóng và dễ dàng. Hy vọng điều này sẽ giúp được ai đó!


2
Nó xứng đáng ít nhất 1up.
Rahul Rastogi

đã làm cho tôi. là một thực hiện đơn giản.
TharakaNirmana

đó là một cách giải quyết tuyệt vời
Kumar Saurabh

Nhận xét này chỉ cho tôi đi đúng hướng. Tuy nhiên: 1. bạn không cần phải bắt đầu một hoạt động để chụp ảnh màn hình! bạn chỉ có thể tăng bố cục xml trong thời gian chạy và chuyển đổi nó thành bitmap như được đề xuất ở đây ; Điều đó đang được nói, bạn có thể tạo nhiều trang với bố cục khác nhau. Cuộn không được hỗ trợ như đã nói nhưng bạn có thể thực hiện một danh sách bằng cách sử dụng, ví dụ, bố cục tuyến tính.
r.pedrosa

11

Thật không dễ dàng để tìm ra một giải pháp đầy đủ cho vấn đề hội tụ một HTML tùy ý sang PDF bằng các chữ cái không phải tiếng Anh trong Android. Tôi kiểm tra nó cho các chữ cái unicode Nga.

Chúng tôi sử dụng ba thư viện:

(1) Jsoup (jsoup-1.7.3.jar) để chuyển đổi từ HTML sang 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;
    } 

Vấn đề khó khăn là hiển thị các chữ cái tiếng Nga trong PDF bằng cách sử dụng thư viện iTextPDF XMLWorker. Để làm điều này, chúng ta nên tạo giao diện FontProvider của riêng mình:

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

Ở đây chúng tôi sử dụng phông chữ Droid Sans tiêu chuẩn của Android, được đặt trong thư mục hệ thống:

private static final String FONT_PATH = "/system/fonts/DroidSans.ttf";

1
Cảm ơn bạn đã chia sẻ! Tôi có một câu hỏi: Chúng ta có thể áp dụng bất kỳ quy tắc CSS nào cho HTML không?
Phương

6

Một chút muộn và tôi chưa tự mình kiểm tra nó nhưng một thư viện khác có giấy phép BSDAndroid PDF Writer .

Cập nhật tôi đã thử thư viện mình. Hoạt động tốt với các thế hệ pdf đơn giản (nó cung cấp các phương thức để thêm văn bản, dòng, hình chữ nhật, bitmap, phông chữ). Vấn đề duy nhất là PDF được tạo được lưu trữ trong Chuỗi trong bộ nhớ, điều này có thể gây ra sự cố bộ nhớ trong các tài liệu lớn.


Bất cứ ai cũng có thể cho tôi biết Android PDF Writer không thể làm gì, "itext" có thể không?
M. Usman Khan

1
Không được bảo trì !! Cập nhật lần cuối: 2015-12-14
Mahdi Alkhatib 27/03/18

2

PDFJet cung cấp một phiên bản mã nguồn mở của thư viện của họ để có thể xử lý mọi tác vụ tạo PDF cơ bản. Đây là một giải pháp hoàn toàn dựa trên Java và được tuyên bố là tương thích với Android. Có một phiên bản thương mại với một số tính năng bổ sung dường như không quá đắt.


4
không còn mã nguồn mở
Joshy Francis

0

Muộn, nhưng có liên quan để yêu cầu và hy vọng hữu ích. Nếu sử dụng dịch vụ bên ngoài (như được đề xuất trong thư trả lời của CommonsWare) thì Docmosis có dịch vụ đám mây có thể giúp - giảm tải xử lý cho dịch vụ đám mây xử lý nặng. Cách tiếp cận đó là lý tưởng trong một số trường hợp nhưng tất nhiên dựa vào việc được kết nối mạng.


0

Bạn cũng có thể sử dụng thư viện PoDoFo . Mục tiêu chính là nó được xuất bản theo LGPL. Vì nó được viết bằng C ++, bạn nên biên dịch chéo nó bằng NDK và viết trình bao bọc C và Java. Một số thư viện của bên thứ ba có thể được sử dụng từ dự án OpenCV . Ngoài ra trong dự án OpenCV U có thể tìm thấy android.toolchain.cmaketệp, nó sẽ giúp bạn tạo Makefile.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.