java生成pdf并下载(添加图片及水印)
首先pom文件需要导入下面两个包
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
controller加入以下方法就可以实现功能了
@RequestMapping(value = "/downLoadPdf")
public void download(HttpServletResponse response, HttpServletRequest request) throws Exception{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
/* 解决中文无法显示:使用iTextAsian.jar包中的字体 */
BaseFont baseFont = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font font_normal = new Font(baseFont, 18, Font.NORMAL);
Font font_normal2 = new Font(baseFont, 14, Font.NORMAL);
Font font_bold = new Font(baseFont, 12, Font.BOLD);
/*时间*/
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy日MM月dd日");
String format = simpleDateFormat.format(date);
/* 第一步 创建文档实例 自定义页面大小使用 */
com.itextpdf.text.Document document = new com.itextpdf.text.Document(PageSize.A4);
/* 第二步 获取PdfWriter实例 */
PdfWriter writer = PdfWriter.getInstance(document, baos);
//PdfWriter.getInstance(document, baos);
document.setMargins(64, 64, 36, 36);
/* 第三步 打开文档 */
document.open();
/* 第四步 添加段落内容 */
Paragraph paragraph = new Paragraph("你想写的标题\n" + "", new Font(baseFont, 25, Font.BOLD));
paragraph.setAlignment(Element.ALIGN_CENTER);
paragraph.setSpacingAfter(10);
document.add(paragraph);
paragraph = new Paragraph(" 兹证明_XXX_(身份证号码 XXXXX)系我司员工,其工号_XXXX_,所属单位_XXXX_,特此证明,用于申请优惠购车。", font_normal);
document.add(paragraph);
paragraph = new Paragraph(" \n"+" 有效期1个月", font_normal2);
document.add(paragraph);
String kg = " ";
paragraph = new Paragraph(" \n"+kg +"XXXX有限公司工会委员会", font_normal2);
document.add(paragraph);
paragraph = new Paragraph(kg +"下载日期:"+format, font_normal2);
document.add(paragraph);
//创建一个image对象.
Image image = Image.getInstance("你想导入的图片路径"); //图片
//设置image对象的输出位置pa.getAsNumber(pa.size()-1).floatValue() 是该页pdf坐标轴的y轴的最大值
image.setAbsolutePosition(400, 430);//图片的X轴和Y轴
image.scaleAbsolute(120,120);//图片大小
document.add(image);
OutputStream out = null;
try {
float pageWidth = document.right()+document.left();//获取pdf内容正文页面宽度
float pageHeight = document.top()+document.bottom();//获取pdf内容正文页面高度
//设置水印字体格式
BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
Font waterMarkFont = new Font(base, 15, Font.BOLD, BaseColor.LIGHT_GRAY);
PdfContentByte waterMarkPdfContent = writer.getDirectContentUnder();
Phrase phrase = new Phrase("我是水印", waterMarkFont);
//5行6列
for (double i=0;i<1;i+=0.2){
float f = (float) (0.1+i);
for (double j=0;j<1d;j+=0.15){
float h = (float) (0.2+j);
ColumnText.showTextAligned(waterMarkPdfContent,Element.ALIGN_CENTER,phrase,
pageWidth*f,pageHeight*h,45);
}
}
/*//两行三列
ColumnText.showTextAligned(waterMarkPdfContent,Element.ALIGN_CENTER,phrase,
pageWidth*0.25f,pageHeight*0.2f,45);
ColumnText.showTextAligned(waterMarkPdfContent,Element.ALIGN_CENTER,phrase,
pageWidth*0.25f,pageHeight*0.5f,45);
ColumnText.showTextAligned(waterMarkPdfContent, Element.ALIGN_CENTER,phrase,
pageWidth*0.25f,pageHeight*0.8f,45);
ColumnText.showTextAligned(waterMarkPdfContent,Element.ALIGN_CENTER,phrase,
pageWidth*0.65f,pageHeight*0.2f,45);
ColumnText.showTextAligned(waterMarkPdfContent,Element.ALIGN_CENTER,phrase,
pageWidth*0.65f,pageHeight*0.5f,45);
ColumnText.showTextAligned(waterMarkPdfContent,Element.ALIGN_CENTER,phrase,
pageWidth*0.65f,pageHeight*0.8f,45);*/
document.close();
//设置请求返回类型
response.setHeader("Content-Disposition", "attachment; filename=" + new String("我是你想要的.pdf".getBytes(), StandardCharsets.ISO_8859_1));
response.setContentLength(baos.size());
out = response.getOutputStream();
baos.writeTo(out);
} catch (Exception e) {
e.printStackTrace();
} finally {
out.flush();
out.close();
}
}
前端这样写
function downloadFile() {
window.location.href = "填写你的地址";
}
自己也是折腾了很久,在网上找了很多例子,都是读取已有的pdf,在已有的pdf上添加图片或者是添加水印的。实在没办法,自己研究了几天,终于是实现了。
加上这些就能生成,绝对没有问题,祝各位用的开心。
转载请标明出处。