import java.io.*;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletOutputStream;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;
import com.itextpdf.tool.xml.XMLWorkerHelper;
import com.megvii.itdev.mit.base.pojo.dto.EduExperienceDTO;
import com.megvii.itdev.mit.base.pojo.dto.PdfDetailDTO;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class PdfUtil {
private static String fileName =
PdfUtil.class.getClassLoader().getResource("simhei.ttf").getPath();
public static void htmlToPdf(String html, String userId, OutputStream out){
Document document = null;
ByteArrayInputStream byteArrayInputStream = null;
try {
document = new Document(PageSize.A4, 30, 30, 30, 30);
document.setMargins(30, 30, 30, 30);
byteArrayInputStream = new ByteArrayInputStream(html.getBytes("UTF-8"));
PdfWriter writer = PdfWriter.getInstance(document,out);
document.open();
FontProvider provider = new MyFontProvider();
XMLWorkerHelper.getInstance().parseXHtml(writer, document, byteArrayInputStream,XMLWorkerHelper.class.getResourceAsStream("/default.css"), Charset.forName("UTF-8"), provider);
document.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (null != byteArrayInputStream){
try {
byteArrayInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void htmlToPdf(String html, String userId, String rootPath){
Document document = null;
ByteArrayInputStream byteArrayInputStream = null;
try {
document = new Document(PageSize.A4, 30, 30, 30, 30);
document.setMargins(30, 30, 30, 30);
byteArrayInputStream = new ByteArrayInputStream(html.getBytes("UTF-8"));
String fileName = rootPath.concat(userId).concat(".pdf");
FileOutputStream outputStream = new FileOutputStream(fileName);
PdfWriter writer = PdfWriter.getInstance(document,outputStream);
document.open();
FontProvider provider = new MyFontProvider();
XMLWorkerHelper.getInstance().parseXHtml(writer, document, byteArrayInputStream,XMLWorkerHelper.class.getResourceAsStream("/default.css"), Charset.forName("UTF-8"), provider);
document.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (null != byteArrayInputStream){
try {
byteArrayInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void fillTemplate(Map<String,Object> o, PdfDetailDTO pdfDetailDTO, ServletOutputStream out, InputStream inputStream) {
PdfReader reader;
ByteArrayOutputStream bos;
PdfStamper stamper;
String filePath = "E:\Megin\ceshi.pdf";
String finalPath = "E:\Megin\ceshi2.pdf";
FileOutputStream outputStream;
try {
outputStream = new FileOutputStream(filePath);
reader = new PdfReader(inputStream);
bos = new ByteArrayOutputStream();
stamper = new PdfStamper(reader, bos);
AcroFields form = stamper.getAcroFields();
log.info("字体路径:{}",fileName);
BaseFont cnHei = BaseFont.createFont(fileName, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
form.addSubstitutionFont(cnHei);
java.util.Iterator<String> it = form.getFields().keySet().iterator();
while (it.hasNext()) {
String name = it.next();
String value = o.get(name)!=null?o.get(name).toString():null;
log.info("[name:{},value:{}]",name,value);
form.setField(name,value);
}
stamper.setFormFlattening(true);
stamper.close();
outputStream.write(bos.toByteArray());
outputStream.flush();
outputStream.close();
bos.close();
generateFinalPdf(filePath,finalPath,"create",pdfDetailDTO);
} catch (BadPdfFormatException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
private static void generateFinalPdf(String newPath, String finalPath, String baselineType, PdfDetailDTO pdfDetailDTO) throws Exception {
FileOutputStream outputStream = new FileOutputStream(finalPath);
PdfReader reader = new PdfReader(newPath);
reader.getNumberOfPages();
byte[] pageContent = reader.getPageContent(1);
log.info("当前页内容:{}",new String(pageContent));
Rectangle pageSize = reader.getPageSize(1);
Document document = new Document(pageSize);
PdfWriter writer = PdfWriter.getInstance(document, outputStream);
document.open();
PdfContentByte cbUnder = writer.getDirectContent();
PdfImportedPage pageTemplate = writer.getImportedPage(reader, 1);
cbUnder.addTemplate(pageTemplate, 0, 0);
document.newPage();
if ("create".equals(baselineType)) {
Paragraph paragraph = generateEdusTable(pdfDetailDTO.getEdus(),writer);
document.add(paragraph);
}
document.close();
reader.close();
}
private static Paragraph generateEdusTable(java.util.List<EduExperienceDTO> eduList, PdfWriter writer) throws Exception {
BaseFont cnHei = BaseFont.createFont(fileName, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
Font fontChinese = new Font(cnHei, 10.5F, Font.NORMAL);
Font fontChineseBold = new Font(cnHei, 10.5F, Font.BOLD);
Paragraph ret = new Paragraph("教育经历", fontChineseBold);
ret.setSpacingBefore(500);
PdfPTable tableBox = new PdfPTable(5);
tableBox.setWidths(new float[] { 0.3f, 0.2f, 0.2f, 0.1f, 0.1f });
tableBox.setWidthPercentage(80f);
tableBox.setTotalWidth(480f);
tableBox.addCell(getCell(new Phrase("起止时间", fontChineseBold), false, 1, 1));
tableBox.addCell(getCell(new Phrase("学校", fontChineseBold), false, 1, 1));
tableBox.addCell(getCell(new Phrase("专业", fontChineseBold), false, 1, 1));
tableBox.addCell(getCell(new Phrase("学历", fontChineseBold), false, 1, 1));
tableBox.addCell(getCell(new Phrase("学位", fontChineseBold), false, 1, 1));
for (EduExperienceDTO edu : eduList) {
tableBox.addCell(getCell(new Phrase(edu.getEduPeriod(), fontChinese), false, 1, 1));
tableBox.addCell(getCell(new Phrase(edu.getSchoolName(), fontChinese), false, 1, 1));
tableBox.addCell(getCell(new Phrase(edu.getMajor(), fontChinese), false, 1, 1));
tableBox.addCell(getCell(new Phrase(edu.getEduType(), fontChinese), false, 1, 1));
tableBox.addCell(getCell(new Phrase(edu.getDegreeName(), fontChinese), false, 1, 1));
}
ret.add(tableBox);
return ret;
}
private static PdfPCell getCell(Phrase phrase, boolean yellowFlag, int colSpan, int rowSpan) {
PdfPCell cells = new PdfPCell(phrase);
cells.setUseAscender(true);
cells.setMinimumHeight(20f);
cells.setHorizontalAlignment(1);
cells.setVerticalAlignment(5);
cells.setColspan(colSpan);
cells.setRowspan(rowSpan);
cells.setNoWrap(false);
return cells;
}
public static Map<String, String> fillTemplate(String fileName, Map<String,Object> o,String templatePath) {
Map<String, String> resultMap = new HashMap<>();
String filePath = "/static/attachments/megin/".concat(fileName);
FileOutputStream outputStream;
PdfReader reader;
ByteArrayOutputStream bos;
PdfStamper stamper;
try {
outputStream = new FileOutputStream(filePath);
reader = new PdfReader(templatePath);
bos = new ByteArrayOutputStream();
stamper = new PdfStamper(reader, bos);
AcroFields form = stamper.getAcroFields();
java.util.Iterator<String> it = form.getFields().keySet().iterator();
while (it.hasNext()) {
String name = it.next();
System.out.println(name);
String value = o.get(name)!=null?o.get(name).toString():null;
form.setField(name,value);
}
stamper.setFormFlattening(true);
stamper.close();
Document doc = new Document();
PdfCopy copy = new PdfCopy(doc, outputStream);
doc.open();
PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);
copy.addPage(importPage);
doc.close();
} catch (IOException e) {
System.out.println(e);
} catch (DocumentException e) {
System.out.println(e);
}
resultMap.put("fileName",fileName);
resultMap.put("filePath",filePath);
return resultMap;
}
}
class MyFontProvider extends XMLWorkerFontProvider {
private static String fontPath = "/simhei.ttf";
@Override
public Font getFont(final String fontname, final String encoding,
final boolean embedded, final float size, final int style,
final BaseColor color) {
BaseFont bf = null;
try {
bf = BaseFont.createFont(fontPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Font font = new Font(bf, size, style, color);
font.setColor(color);
return font;
}
}