Có cách nào để tạo tệp PDF từ ứng dụng Android không?
Có cách nào để tạo tệp PDF từ ứng dụng Android không?
Câu trả lời:
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:
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();
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 đó!
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";
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 BSD là Android 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.
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.
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.
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.cmake
tệp, nó sẽ giúp bạn tạo Makefile
.