下載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();
}
}