compile group: ‘com.itextpdf’, name: ‘itextpdf’, version: ‘5.5.13.2’
compile group: ‘com.itextpdf’, name: ‘itext-asian’, version: ‘5.2.0’
compile group: ‘com.itextpdf’, name: ‘html2pdf’, version: ‘3.0.2’
* 下载PDF添加水印
*
* @param path 地址
* @param response response
*/
@Override
public void html2pdfDown(String path, HttpServletResponse response) {
String type = path.substring(path.lastIndexOf(".") + 1, path.length());
if (!"html".equals(type)) {
throw new SystemException("请确认文件为正确的html文件");
}
String pdfFilePath = path.substring(0, path.lastIndexOf(".")) + ".pdf";
PdfStamper pdfStamper = null;
File file = null;
File pdfFile = null;
InputStream in = null;
PdfReader pdfReader = null;
try {
pdfFile = new File(pdfFilePath);
ConverterProperties properties=new ConverterProperties();
DefaultFontProvider fontProvider = new DefaultFontProvider();
fontProvider.addSystemFonts();
properties.setFontProvider(fontProvider);
HtmlConverter.convertToPdf(new File(path), pdfFile,properties);
pdfReader = new PdfReader(pdfFilePath);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = new Date();
String dateStr = sdf.format(date);
String newFilePath = path.substring(0, path.lastIndexOf(".")) + date.getTime() + ".pdf";
pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(newFilePath));
//当前用户
RequestUserInfo userInfo = RequestStateHolder.getUserInfo();
addWatermark(pdfStamper, "CONFIDENTIAL", userInfo.getUserCode() + " " + dateStr);
pdfStamper.close();
pdfReader.close();
file = new File(newFilePath);
in = new FileInputStream(file);
//清除非常重要
response.reset();
response.setContentType("application/text;charset=GBK");
response.setHeader("Content-disposition",
"attachment;filename=" + new String(pdfFile.getName().getBytes("GBK"), "ISO8859_1"));
IOUtils.copy(in, response.getOutputStream());
IOUtils.closeQuietly(in);
pdfFile.delete();
file.delete();
} catch (IOException | com.itextpdf.text.DocumentException | DocumentException e) {
e.printStackTrace();
throw new SystemException(e.getMessage());
}
}
/**
* pdf添加水印
*
* @param pdfStamper PdfStamper对象
* @param waterMarkName 水印内容
* @param userContent 人员内容
* @throws DocumentException 异常
* @throws IOException 异常
*/
public void addWatermark(PdfStamper pdfStamper, String waterMarkName, String userContent)
throws DocumentException, IOException, com.itextpdf.text.DocumentException {
PdfContentByte content = null;
BaseFont base = null;
Rectangle pageRect = null;
PdfGState gs = new PdfGState();
// 设置字体
base = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
try {
if (null == base || null == pdfStamper) {
return;
}
// 设置透明度为0.4
gs.setFillOpacity(0.4f);
gs.setStrokeOpacity(0.4f);
int toPage = pdfStamper.getReader().getNumberOfPages();
for (int i = 1; i <= toPage; i++) {
pageRect = pdfStamper.getReader().getPageSizeWithRotation(i);
// 计算水印X,Y坐标
float x = pageRect.getWidth() / 1.8f;
float xTwo = pageRect.getWidth() / 2.2f;
float y = pageRect.getHeight() / 1.8f;
float yTwo = pageRect.getHeight() / 2.2f;
//获得PDF最顶层
content = pdfStamper.getOverContent(i);
content.saveState();
// set Transparency
content.setGState(gs);
content.beginText();
content.setColorFill(BaseColor.GRAY);
content.setFontAndSize(base, 55);
// 水印文字成45度角倾斜
content.showTextAligned(Element.ALIGN_CENTER, waterMarkName, xTwo, y, 45);
content.showTextAligned(Element.ALIGN_CENTER, userContent, x, yTwo, 45);
content.endText();
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
content = null;
base = null;
pageRect = null;
}
}