一、单个PDF导出到浏览器
java
/**
*
* @param templatePath 模板路径
* @param fileName 文件名称
* @param data 填充文本
* @param images 填充图片
* @param response
* @throws IOException
*/
public static void generateTempPDF(String templatePath, String fileName, Map<String, String> data , Map<String, String> images, HttpServletResponse response) throws IOException {
fileName = URLEncoder.encode(fileName, "UTF-8");
// 设置响应头
response.setContentType("application/force-download");
response.setHeader("Content-Disposition",
"attachment;fileName=" + fileName);
PdfReader reader = null;
PdfStamper ps = null;
OutputStream fos = null;
ByteArrayOutputStream bos = null;
try {
//模板路径templatePath
reader = new PdfReader(templatePath);
bos = new ByteArrayOutputStream();
ps = new PdfStamper(reader, bos);
// 使用中文字体
BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
ArrayList<BaseFont> fontList = new ArrayList<>();
fontList.add(bf);
AcroFields fields = ps.getAcroFields();
fields.setSubstitutionFonts(fontList);
fillData(fields, data);//渲染
//插入图片
if (EmptyUtils.isNotEmpty(images)) {
fillImage(fields, ps,images);
}
//必须要调用这个,否则文档不会生成的
ps.setFormFlattening(true);
if(ps != null){
ps.close();
}
// 保存到本地
// fos = new FileOutputStream(exportPath);
// 输出到浏览器端
fos = response.getOutputStream();
fos.write(bos.toByteArray());
}catch (Exception e){
e.printStackTrace();
}finally {
if(fos!=null){
fos.flush();
fos.close();
}
if (bos != null){
bos.close();
}
if(reader != null){
reader.close();
}
}
}
二、多个PDF文件压缩ZIP输出浏览器
java
@Override
public void exportZip(List<Long> ids, HttpServletResponse response) throws IOException {
response.setContentType("application/zip");
response.setHeader("Content-Disposition", "attachment; filename=weighbridge_records.zip");
try (ZipOutputStream zos = new ZipOutputStream(response.getOutputStream())) {
for (Long id: ids) {
// 业务代码
String fileName = aaa.pdf;
Map<String, String> data = new HashMap<>();
// 生成 PDF 文件到 ByteArrayOutputStream
ByteArrayOutputStream bos = new ByteArrayOutputStream();
//模板路径
String templatePath = templateProperties.getPath() + "\\weighbridge_record.pdf";
generateTempPDF(templatePath, fileName, data, null, bos);
// 将生成的 PDF 文件写入 ZIP
ZipEntry zipEntry = new ZipEntry(fileName);
zos.putNextEntry(zipEntry);
zos.write(bos.toByteArray());
zos.closeEntry();
bos.close();
}
} catch (IOException e) {
e.printStackTrace();
} catch (DocumentException e) {
throw new RuntimeException(e);
}
}
java
public static void generateTempPDF(String templatePath, String fileName, Map<String, String> data, Map<String, String> images, ByteArrayOutputStream bos) throws IOException, DocumentException {
PdfReader reader = null;
PdfStamper ps = null;
try {
reader = new PdfReader(templatePath);
ps = new PdfStamper(reader, bos);
BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
ArrayList<BaseFont> fontList = new ArrayList<>();
fontList.add(bf);
AcroFields fields = ps.getAcroFields();
fields.setSubstitutionFonts(fontList);
fillData(fields, data); // 渲染
// 插入图片
if (EmptyUtils.isNotEmpty(images)) {
fillImage(fields, ps, images);
}
ps.setFormFlattening(true);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ps != null) {
ps.close();
}
if (reader != null) {
reader.close();
}
}
}