itext5填充PDF表單

下載Adobe Acrobat DC 準備表單
下載 Adobe Acrobat DC  工具  準備表單  準備表單字段  順便可以設置各種格式
官網 https://itextpdf.com/en/products/itext-5-legacy
相關包

<!-- pdf處理 -->
		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>2.4</version>
		</dependency>

		<dependency>
			<groupId>commons-codec</groupId>
			<artifactId>commons-codec</artifactId>
		</dependency>

		<dependency>
			<groupId>com.itextpdf</groupId>
			<artifactId>itextpdf</artifactId>
			<version>5.5.9</version>
		</dependency>

		<dependency>
			<groupId>com.itextpdf</groupId>
			<artifactId>itext-asian</artifactId>
			<version>5.2.0</version>
		</dependency>
		
		<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcpkix-jdk15on -->
		<dependency>
		    <groupId>org.bouncycastle</groupId>
		    <artifactId>bcpkix-jdk15on</artifactId>
		    <version>1.49</version>
		</dependency>
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;

import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.BaseField;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.PdfWriter;
import com.response.ResponseEnums;

import lombok.extern.slf4j.Slf4j;

/**
 * @author created by ChenFangYa
 * @date 2020年3月24日---下午4:14:23
 * @action
 */
@Slf4j
public class PDFUtils {
	private static final byte[] OWNERPASSWORD = "hello_world".getBytes();//編輯密碼

	/**
	 * 
	 * @param map
	 * @param sourceFile
	 * @throws Exception
	 */
	public static byte[] genPdf(Map<String, String> map, String sourceFile) throws Exception {
		return fillParam(map, FileUtils.readFileToByteArray(new File(sourceFile)));
	}
	
	/**
	 * Description: 使用map中的參數填充pdf,map中的key和pdf表單中的field對應 <br>
	 * 
	 * @Param
	 * @return
	 */
	public static byte[] fillParam(Map<String, String> fieldValueMap, byte[] file) {
		ByteArrayOutputStream baos = null;
		PdfReader reader = null;
		PdfStamper stamper = null;
		try {
			baos = new ByteArrayOutputStream();
			reader = new PdfReader(file);
			stamper = new PdfStamper(reader, baos);
			BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
			AcroFields acroFields = stamper.getAcroFields();
			acroFields.getFields().forEach((k, v) -> {
				acroFields.setFieldProperty(k, "textfont", base, null);
				acroFields.setFieldProperty(k, "textsize", Float.valueOf("14"), null);
				acroFields.setFieldProperty("text1", "setfflags", BaseField.READ_ONLY, null);//好像沒起作用。。
			});
			if (fieldValueMap != null) {
				fieldValueMap.forEach((k, v) -> {
					try {
						if ("class_name".equals(k) && v != null && v.length() > 10) {
							String vStr = new StringBuilder(v).insert(10, System.lineSeparator()).toString();
							acroFields.setField(k, vStr);
							return;
						} 
						acroFields.setField(k, v);
					} catch (IOException | DocumentException e) {
						log.error("PDF填充參數失敗", e);
					}
				});
			}
			stamper.getWriter().setEncryption(null, OWNERPASSWORD, PdfWriter.ALLOW_PRINTING, PdfWriter.STANDARD_ENCRYPTION_128);
			stamper.setFormFlattening(true);
			stamper.close();
			return baos.toByteArray();
		} catch (Exception e) {
			log.error("PDF填充參數失敗", e);
		} finally {
			if (stamper != null) {
				try {
					stamper.close();
				} catch (Exception e) {
					log.error("PDF stamper 關閉失敗 ", e);
				}
			}
			if (reader != null) {
				reader.close();
			}
			IOUtils.closeQuietly(baos);
		}
	}


	public static void main(String[] args) throws Exception {
		HashMap<String, String> map = new HashMap<>();
		map.put("name", "二狗子");
		map.put("sex", "男");
		map.put("age", "27");
		String sourceFile = "D:/20200324140433.pdf";
		String filePath = "C:\\Users\\Desktop";
		String fileName = "微信圖片_20200324140433.pdf";
		byte[] genPdf = genPdf(map, sourceFile);
		File dir = new File(filePath);
        if(!dir.exists() && !dir.isDirectory()){//判斷文件目錄是否存在
            dir.mkdirs();
        }
        File file = new File(filePath + File.separator + fileName);
        FileOutputStream fos = new FileOutputStream(file);
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        bos.write(genPdf);
        bos.close();
        fos.close();
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章