android使用Itext库生成PDF文件
android生成PDF文件之itext7
- 概述
- 導包
- 使用介紹
- 初始化
- 基礎控件使用
- Text使用方式
- Table的使用
- 經驗總結
概述
關于android端動態生成PDF文檔的方案我也找了很多第三方的庫,其中很多庫對于安卓的支持都不是很好,最后還是只能選擇Java中牛逼的itext庫,這個庫是開源免費,商業收費的,意思是你要使用開源版本則需要將你的源代碼也開源,如果不開源,則需要購買商業版本,具體費用則需要跟對方聯系。這是家外國企業,國內有代理商,很多大廠都是用的他們的解決方案,可謂是行業頂流解決方案了。
導包
itext5的就不介紹了,官方已經全面切換到7了。
implementation ‘com.itextpdf:itext7-core:7.1.13’
使用介紹
初始化
首先需要設置相關的屬性:
/*** 初始化pdf*/private void initPDF(String saveFilePath) {try {PdfWriter pdfWriter = new PdfWriter(new FileOutputStream(saveFilePath));pdfDocument = new PdfDocument(pdfWriter);//創建字體,自帶的TIMES_ROMANpdfFont = PdfFontFactory.createFont(StandardFonts.TIMES_ROMAN);//設置頁面大小這里設置A4紙大小PageSize ps = PageSize.A4;//獲取頁面的寬度像素pageWidth = ps.getWidth();document = new Document(pdfDocument, ps, true);//設置字體document.setFont(pdfFont);//設置字體大小(都要自己設置常量)document.setFontSize(mValueFontSize);//設置字體顏色document.setFontColor(mColorBlack);// 分割線lineSeparator = new LineSeparator(new DashedLine());lineSeparator.setStrokeColor(DeviceRgb.BLUE);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}基礎控件使用
Text使用方式
//基本的文本創建Text shopName = new Text(getString(R.string.pdf_shop_name));Text shopNameValue = new Text(workShopInfo.getShopName());//創建一個段落Paragraph shopNamePar = new Paragraph();//將文本添加到段落中,可以添加多個文本,文本也可以設置不同的顏色字體,設置方式同初始化中的一樣。shopNamePar.add(shopName);shopNamePar.add(shopNameValue);//最后將段落添加到文檔中就可以了。document.add(shopNamePar);Table的使用
首先要設置寬占比:
//設置表格寬占比UnitValue[] resultArray = new UnitValue[3];resultArray[0] = UnitValue.createPercentValue(20f);resultArray[1] = UnitValue.createPercentValue(60f);resultArray[2] = UnitValue.createPercentValue(20f);然后創建Table:
//創建表格Table table = new Table(resultArray).useAllAvailableWidth();然后創建單元格:
Cell leftCell = new Cell();之后可以將上面創建的段落添加到單元格中:
//注意必須是Paragraph,Text不能直接添加 leftcell.add(shopNamePar);最后將cell添加到表格中就行了:
table.addCell(leftcell);注意:單元格從左至右依次排列,所以想通過循環依次賦值的話,也要遵循這個原則準備數據源,不是以列為繪制方向的。
技巧:單元格內容默認是左對齊的如果需要居中對齊,則需要設置:
掌握Text和table的用法,基本能夠處理大部分的需求了。也能夠繪制出整齊的文檔了。
經驗總結
本文的文本類型不包括中文,中午需要對應能顯示中文的字庫,這里就沒有延展了,本文的主旨是能解決大部分的問題,其他方面的問題需要自己去探索,自己去發現,才能掌握的更透徹。
此外我在開發過程中,發現,有些字符,字庫中沒有,如℃,沒有的話,生成的文檔會顯示不出來。解決辦法是替換掉對應的字符:
public static String replaceSpecialCharacters(String str){return str.replace("℃","°C").replace("℉","°F");}另外在table中,如果遇到純數字,沒有分開的字符,這個框架不會自動換行,這是他們框架的一個缺失點。解決方案的話,需要自己根據表格寬度,計算到那個字符后面加個空格,系統會根據空格自動換行。解決方案如下:
/*** 處理表格中沒有空格分開的文本會導致表格超寬不換行顯示導致錯亂的問題* 第三方庫存在連串數字不會觸發換行的問題,只能手動加空格** @param text 表格中的文本* @param table 表格類* @param column 那一列*/public String processTabularSuperWideText(String text, Table table, int column) {//文本寬度double contentWidth = pdfFont.getContentWidth(new PdfString(text)) * pdfFont.getFontMatrix()[0] * mValueFontSize;//表格的總寬度float tableWidth = pageWidth - document.getLeftMargin() - document.getRightMargin();//當前對應顯示的列的寬度float columnWidth = tableWidth * (table.getColumnWidth(column).getValue() / 100f);//如果表格中的文本寬度計算值大于列的寬度,則需要做處理,反之不做處理if (contentWidth > columnWidth) {//由于是根據空格來換行的,所以用空格切割字符串String[] contentSplits = text.split(" ");//切割完的還要再拼接StringBuffer contentBuff = new StringBuffer();//遍歷數組,對比每個切割后的字符串是否超過了列的寬度,如果超過了列的寬度,則需要添加空格for (int i = 0; i < contentSplits.length; i++) {//這里必須用框架中計算內容寬度的方法才能準確計算出文本所占的寬度double itemWidth = pdfFont.getContentWidth(new PdfString(contentSplits[i])) * pdfFont.getFontMatrix()[0] * mValueFontSize;//如果切割的單個字符串還大于列寬,則需要切割if (itemWidth > columnWidth) {//超過列寬,則計算每個字符的寬度,然后累加字符寬度,直到達到列寬StringBuffer stringBuff = new StringBuffer();String itemStr = contentSplits[i];char[] chars = itemStr.toCharArray();//累加字符寬度double addCharsWidth = 0;//保留一定的間隔,使其不充滿整個列double interval = 18;//遍歷字符數組for (int a = 0; a < chars.length; a++) {double charWidth = pdfFont.getContentWidth(new PdfString(String.valueOf(chars[a]))) * pdfFont.getFontMatrix()[0] * mValueFontSize;addCharsWidth = addCharsWidth + charWidth;//達到列寬則加空格,使其能自動換行if (!(addCharsWidth < columnWidth - interval)) {stringBuff.append(" ");addCharsWidth = 0;}//合并字符為字符串stringBuff.append(chars[a]);}stringBuff.append(" ");contentBuff.append(stringBuff);} else {contentBuff.append(contentSplits[i]).append(" ");}}return contentBuff.toString();} else {return text;}}如果此上方案解決了您的問題,請點贊加收藏關注一下,謝謝支持。
總結
以上是生活随笔為你收集整理的android使用Itext库生成PDF文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 李宏毅机器学习——课后作业1
- 下一篇: 外贸受用,如何跟进那些报过价又不回复的客