Android環境下生成PDF檔案
一、應用場景
從本地選擇圖片生成pdf檔案,由於Android本身並沒有對pdf的支援,這裡選擇使用一個第三方的庫來達成需求。
二、庫的選擇
2.1 當前主流的庫
在眾多Java語言編寫的PDf庫中,對Android有支援且有一定使用者量的的有:iText、Qoppa qPDF工具包、PDFJet。
2.2 三個庫的對比如下:
~ | iText | Qoppa | PDFJet |
---|---|---|---|
應用檔案大小 | 1.52MB | 0.93MB | 0.67MB |
時間消耗 | 3.7ms | 39ms | 51.3ms |
平均CPU利用率 | 29% | 77.9% | 86.8% |
修改PDF | 是 | 是 | 沒有 |
加密 | 是 | 是 | 沒有 |
形式欄位函式 | 是 | 是 | 沒有 |
文字提取 | 是 | 是 | 沒有 |
將PDF轉換為影像 | 沒有 | 是 | 沒有 |
開源 | 是 | 沒有 | 是 |
書可用 | 是 | 沒有 | 沒有 |
論壇,郵件列表 | 是 | 沒有 | 沒有 |
2.3 選型
鑑於效能和開源,決定選擇iText作為此次接入的PDF庫。
三、iText庫接入
3.1 資源說明
3.1.1 下載連結
https://github.com/itext/itextpdf/tree/itextg
3.1.2 下載說明
If you want to use iText on Android or the Google App Engine, you need to use iTextG. iTextG is almost identical to iText, except that it only uses classes that are white-listed by Google. All references to java.awt, javax.nio and other "forbidden" packages have been removed.(在Android上使用iText,需要使用iTextG。iTextG與iText基本相同,只是替換掉了java.awt,javax.nio等Android上不支援的包。)
3.1.3 混淆說明
# itext
-dontwarn com.itextpdf.**
-keep class com.itextpdf.** {*;}
3.2 圖片生成pdf方法
3.2.1 設定pdf每頁的背景
public class PdfBackground extends PdfPageEventHelper {
@Override
public void onEndPage(PdfWriter writer, Document document) {
//設定pdf背景色為白色
PdfContentByte canvas = writer.getDirectContentUnder();
Rectangle rect = document.getPageSize();
canvas.setColorFill(BaseColor.WHITE);
canvas.rectangle(rect.getLeft(), rect.getBottom(), rect.getWidth(), rect.getHeight());
canvas.fill();
//設定pdf頁面內間距
PdfContentByte canvasBorder = writer.getDirectContent();
Rectangle rectBorder = document.getPageSize();
rectBorder.setBorder(Rectangle.BOX);
rectBorder.setBorderWidth(BORDER_WIDTH);
rectBorder.setBorderColor(BaseColor.WHITE);
rectBorder.setUseVariableBorders(true);
canvasBorder.rectangle(rectBorder);
}
}
3.2.2 根據圖片Uri生成pdf
/**
* 根據圖片生成PDF
*
* @param pdfPath 生成的PDF檔案的路徑
* @param imagePathList 待生成PDF檔案的圖片集合
* @throws IOException 可能出現的IO操作異常
* @throws DocumentException PDF生成異常
*/
private void createPdf(String pdfPath, List<String> imagePathList) throws IOException, DocumentException {
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(pdfPath));
//設定pdf背景
PdfBackground event = new PdfBackground();
writer.setPageEvent(event);
document.open();
for (int i = 0; i < imagePathList.size(); i++) {
document.newPage();
Image img = Image.getInstance(imagePathList.get(i));
//設定圖片縮放到A4紙的大小
img.scaleToFit(PageSize.A4.getWidth() - BORDER_WIDTH * 2, PageSize.A4.getHeight() - BORDER_WIDTH * 2);
//設定圖片的顯示位置(居中)
img.setAbsolutePosition((PageSize.A4.getWidth() - img.getScaledWidth()) / 2, (PageSize.A4.getHeight() - img.getScaledHeight()) / 2);
document.add(img);
}
document.close();
}
四、參考文獻
4.1 iText官方網站:
4.2 iText5圖片處理相關examples:
http://developers.itextpdf.com/examples/image-examples-itext5
4.3 Stefan Fenz的部落格地址:
http://stefan.fenz.at/creating-pdfs-on-android-an-evaluation/
五、DEMO下載
相關文章
- java生成PDF檔案【Z】Java
- 教你利用PHP生成PDF檔案PHP
- 巧用ASP生成PDF檔案 (轉)
- Unix環境和Windows環境下Oracle引數檔案位置:WindowsOracle
- 開發環境下PP檔案的建立開發環境
- Java 根據模板生成 PDF 檔案 以及 excel 檔案JavaExcel
- Lua環境搭建luavs.bat檔案不能生成exeBAT
- 使用dompdf/dompdf實現生成pdf檔案
- Linux環境下sqlldr一個csv檔案LinuxSQL
- Android下載網路pdf檔案儲存至本地Android
- Oracle 11g Dataguard環境下資料檔案、日誌檔案管理(下)Oracle
- Android so檔案生成Android
- Spring原始碼:使用Thymeleaf生成PDF檔案Spring原始碼
- 【Vue 實踐】頁面生成 pdf 檔案-01Vue
- Java 渲染 docx 檔案,並生成 pdf 加水印Java
- 在exadata環境下配置dbfs檔案系統
- Laravel5.4 不同環境下 env 檔案設定Laravel
- Windows環境下無縫切換Listener log檔案Windows
- linux環境下使用XFS檔案系統(轉)Linux
- vscode 配置c/c++環境,無法生成 *.exe檔案VSCodeC++
- 配置開發環境、生成環境、測試環境開發環境
- Gradle環境下匯出Swagger為PDFGradleSwagger
- RAC環境重建控制檔案
- spring boot itextPdf根據模板生成pdf檔案Spring Boot
- 如何在伺服器環境中上傳下載檔案伺服器
- Oracle 11g Dataguard環境下資料檔案、日誌檔案管理(上)Oracle
- RAC 環境下修改歸檔模式模式
- mac下搭建android 開發環境MacAndroid開發環境
- Mac環境下opencv for android筆記MacOpenCVAndroid筆記
- Windows下Android開發環境配置WindowsAndroid開發環境
- Laravel 配置多環境env檔案Laravel
- RAC環境中的TNSNAMES檔案
- Windows環境下實現批量執行Sql檔案勒鴛WindowsSQL
- 【RAC】Oracle RAC叢集環境下日誌檔案結構Oracle
- Linux 環境下 Makefile 檔案製作淺談(一)(轉)Linux
- Linux 環境下 Makefile 檔案製作淺談(二)(轉)Linux
- 自己編寫JAVA環境下的檔案上傳元件 (轉)Java元件
- 在Linux系統環境下使用GFS檔案系統Linux