1. 程式人生 > >android下用itext修改pdf模板檔案

android下用itext修改pdf模板檔案

最近公司專案要在android端生成表單檔案並且列印,這段時間研究了一下,列印結合第三方的Printshare來實現,在使用過程中發現android生成的word文件很不穩定,經常出現不全的情況,所以就用pdf吧,於是就研究了一下itext生成pdf,果然好用,很快就能生成簡單的pdf檔案,不過由於公司的表單中表格檔案相當複雜,並且會隨時新增,那麼用程式碼實現就顯得相當麻煩。利用pdf的模板檔案來修改生成pdf檔案是一條可行的道路。其基本步驟如下:

1、採用office 2007製作PDF檔案,其他PDF工具也可以。用word的表格文字處理能力來製作表格,應該都不會有什麼問題,應該讓程式碼來完成最靈巧的工作,注意留夠表單域的空間。製作好的表格檔案輸出成為PDF檔案. 


2、使用Acrobat開啟製作好的表格PDF檔案,製作表單域。注意域名要唯一,同時,注意域的字型、格式、排列等相關屬性。 
3、使用iText的PDFreader來讀取模板PDF檔案,使用setField(fieldname,value)來填充PDF上的表格域,將完成後的PDF檔案輸出儲存即得到完美的PDF表格檔案。 

上程式碼:

這裡是設定讀取pdf檔案的路徑和輸出檔案的路徑,並對實體DataBean賦值

String ttfUrl = dirPath.toString() + "/FZSYJW.TTF";
					BaseFont baseFont = BaseFont.createFont(ttfUrl,
							BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
					
					DataBean date = new DataBean();
					date.setName("翟昆");
					date.setAddress("濟南");
					date.setPhone("15098975730");
					date.setYoubian("255000");
					date.setGx("是");
					getPdfFile(fileurl,outUrl,date,baseFont);

這裡是主要實現
/** 
	 * 根據一個databean,處理一個pdf檔案, 
	 * @param templatefile //模板檔案路徑 
	 * @param destfile     //目標檔案路徑 
	 * @param databean     //資料介面的實現  
	 */  
	public void getPdfFile(String templatefile,String destfile,DataBean databean,BaseFont baseFont)throws IOException, DocumentException{  
	    try {
			String TemplatePDF = templatefile;
			PdfReader reader = new PdfReader(TemplatePDF);
			PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(
					destfile));
			AcroFields form = stamper.getAcroFields();
			DataBean db = databean;
			List<String> fieldnames = this.getFieldName(db);
			for (int i = 0; i < fieldnames.size(); i++) {
				String tmpname = fieldnames.get(i);
				String value = this.getFieldValue(tmpname, db);
				form.setFieldProperty(tmpname, "textfont", baseFont, null);
				form.setField(tmpname, value);
			}
			stamper.setFormFlattening(true);
			stamper.close();
			reader.close();
		} catch (Exception e) {
		}          
	}   
根據實體物件的名稱進行賦值
/** 
	 * 根據資料bean得到pdf中要寫入的textfield的名字 
	 * @param db 
	 */  
	private List<String> getFieldName(DataBean db){  
	    List<String> fieldnames = new ArrayList<String>();  
	    Field[] fields = db.getClass().getDeclaredFields();  
	    for(int i=0;i<fields.length;i++) {  
	        String tmpname  = fields[i].getName();  
	        fieldnames.add(tmpname); 
	    }  
	    return fieldnames;  
	} 
	private String getFieldValue(String fieldname,DataBean db)  
	{  
	    String value="";  
	    Method[] methods = db.getClass().getDeclaredMethods();  
	    for(int i=0;i<methods.length;i++) {  
	        String methodname = methods[i].getName();  
	        if (methodname.substring(0,3).toUpperCase().equals("GET") && methodname.substring(3).toUpperCase().equals(fieldname.toUpperCase())) {  
	            Method method = methods[i];  
	            try {  
	                value = (String)method.invoke(db,new Object[] {});  
	            } catch (Exception e) { 
	                e.printStackTrace();  
	            }  
	        }  
	    }
	    return value;  
	}

以上內容就是讀取pdf模板並修改或者新增文字域中的內容的實現,在剛開始做的時候一直編輯不進值,後來找到原因,是沒有設定字型
form.setFieldProperty(tmpname, "textfont", baseFont, null);
設定了中文字型後,內容就出來了


相關推薦

androiditext修改pdf模板檔案

最近公司專案要在android端生成表單檔案並且列印,這段時間研究了一下,列印結合第三方的Printshare來實現,在使用過程中發現android生成的word文件很不穩定,經常出現不全的情況,所以就用pdf吧,於是就研究了一下itext生成pdf,果然好用,很快就能生

windowsPython把pdf檔案轉化為圖片(png格式)

最近工作中需要把pdf檔案轉化為圖片,想用python來實現,於是在網上找啊找啊找啊找,找了半天,倒是找到一些程式碼。 1、第一個找到的程式碼,我試了一下好像是反了,只能實現把圖片轉為pdf,而不能

Windows指令碼批量重新命名檔案

1. 我的效果: 2. reference reference:https://blog.csdn.net/txz317/article/details/52326041 在Windows下可以用指令碼批量重新命名檔案,且可以將檔名按指定的字串格式命名,並按序號遞

Linux Shell環境jq命令處理json檔案

安裝 CentOS下可以直接通過yum安裝: yum install jq -y 使用方法 假設有一個名為test.json的檔案,內容如下: { "Summary": { "Version": "1.0", "Comment

Linux查詢及修改PHP配置檔案ini的路徑[轉載]

##原本地址:http://www.findme.wang/blog/detail/id/278.html 一、查詢PHP配置檔案 說到查詢,當然首先想到的是find命令。執行如下命令,即可查詢到php.ini檔案 find / -name php.ini 可是,找到三個

修改Xcode模板檔案

步驟如下: 1、進入Xcode目錄,找到模板資料夾: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templat

Java iText使用PDF模板生成PDF文件

我們系統需要生成一個可以列印的PDF文件,老闆給了我一個Word文件,按照這個Word文件的格式生成PDF文件。 第一步:下載AdobeAcrobat DC,必須使用這個來製作from域。 第二步:使用AdobeAcrobat DC將Word導成PDF文件。 第三步:由於還要加水

Linux和android測試鍵盤和觸控式螢幕 && .kl檔案中的WAKE和WAKE_DROPPED

       在Linux或者Android-x86系統下,會用到測試鍵盤、滑鼠、觸控式螢幕等各種輸入裝置的功能,那麼下面的這段程式碼是個好的選擇。首先編寫了個Linux輸入裝置的測試小程式來檢測問題所在,總算也小有成就。具體輸入裝置的路徑,大家可以用cat /proc/b

windows命令列執行class檔案提示“找不到或者無法載入主類”

我的jdk是jdk1.8.0_121這個版本的,配置好環境變數之後,使用javac進行沒問題,但是java 檔名的時候就提示找不到或者無法載入主類 百度搜了好久,很多人都是告訴說需要配置好classpath環境變數,但是之前看到的教程上說的是6.0以上的版本不需要配置cla

iText 根據PDF模板 替換生成新的PDF問題

public static void test2() throws Exception { /*開啟已經定義好欄位以後的pdf模板*/ PdfReader reader = new PdfReader("c://chapter5InvestTemplate.pdf");

eclipseAnt編譯大量java檔案時出Java heap space異常解決方法

問題:Try to increase heap size. Can be done by defining ANT_OPTS=-Xmx640m 問題截圖 解決辦法: 當使用Ant編譯大量的Java原始檔時,會出現java.lang.OutOfMemoryEr

java 通過itext操作pdf模板文字域填寫內容

1.pdf模板我這邊用的是福昕高階PDF編輯器(臨時使用14天)直接生成,通過工具的編輯表單新增文字域 2.pdf模板生成後,接著就是程式碼部分了: (1)新增jar <d

在後臺修改前臺模板檔案

<textarea cols= '80' rows='20'>${data['content']}</textarea> <button onclick='change()' >修改</button>

vs2008MFC讀寫excel檔案

CApplication app1; CWorkbooks books; CWorkbook book; CWorksheets sheets; CWorksheet sheet; CRange range; CRange iCell; LPDISPATCH lpDisp; COleVariant vResu

【java】 iText使用PDF模板生成輸出PDF 這個比較清晰

本文所要用到的工具或jar主要有: Adobe Acrobat 這個主要用來製作PDF模板、eclipse、 itext.jar、 解決中文的輸出問題,需要多下載一個名為iTextAsian.jar的JAR包。這個包裡面定義了與中文輸出相關的一些檔案。  pdf模

IText更改pdf模板資料並匯出

1.匯入maven相關依賴<dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <ver

window命令符建立新檔案,類似於其他系統touch 的用法

開啟命令視窗, 輸入如下,就會建立index.html檔案同時寫入你好,以此類推,可以建立js,txt,php等各中檔案,>符號前為寫入的內容,不能為空 echo 你好>index.html    ps:window想在那個目錄開啟cmd視窗(命令視窗), 按住s

在Linux進入目錄,目錄建立、修改、刪除檔案所需許可權

首先,我們用root許可權建立一個目錄名為dir, 此時檔案擁有者對改目錄具有讀、寫和執行許可權,所屬組和other對改目錄具有讀和執行許可權。現在去除dir的所以許可權, 此時dir目錄的

Ubuntu命令列開啟pdf doc等檔案

對Linux命令不熟悉的可以參考 小白學習Linux命令 用了幾天Ubuntu,感覺linux的終端使用起來非常的方便。但是怎麼在linux下用命令的方式開啟pdf檔案呢?開啟pdf的命令: evince [filename] & 如果不在當前資料夾則需要使用cd命令或者把路

Android修改hosts檔案

由於某些原因,可能需要指定域名對應的IP地址。Android是基於Linux的系統,與Linux類似,通過hosts檔案來設定。 在Android下,/etc是link到/system/etc的,我們需要修改/system/etc/hosts來實現。但是這個檔案是隻讀,不能通