Files
SIPAIIS_WMS_JSSW/src/com/sipai/controller/base/PDFFileUtil.java
2026-01-16 14:13:44 +08:00

397 lines
12 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.sipai.controller.base;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontProvider;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerHelper;
import com.sipai.tools.CommUtil;
import java.io.ByteArrayInputStream;
import java.net.MalformedURLException;
import java.nio.charset.Charset;
import javax.servlet.http.HttpServletRequest;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;
public class PDFFileUtil {
Document document = null;// 建立一个Document对象
/* private static Font headFont ;
private static Font keyFont ;
private static Font nbspFont;
private static Font textfont_H ;
private static Font textfont_B ;
private static Font textfont_13;
private static Font textfont_12;
private static Font textfont_11;
private static Font textfont_10;
private static Font textfont_9;
private static Font textfont_8;
private static Font textfont_7;
private static Font textfont_6;
int maxWidth = 520;*/
public void createPDF(String outputPath, String xmlStr) {
try {
Document document = new Document();
document.setPageSize(PageSize.A4);// 设置页面大小
PdfWriter mPdfWriter = PdfWriter. getInstance(document, new FileOutputStream(outputPath));
document.open();
ByteArrayInputStream bin = new ByteArrayInputStream(xmlStr.getBytes());
XMLWorkerHelper.getInstance().parseXHtml(mPdfWriter, document, bin, Charset.forName("UTF-8"), new ChinaFontProvide());
/*BaseFont baseFont = BaseFont.createFont("C:/Windows/Fonts/SIMYOU.TTF",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
Font font = new Font(baseFont);
document.add(new Paragraph("解决中文问题了!",font)); */
document.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}
/*Document document = new Document();
try {
// 建立一个Document对象
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font keyfont = new Font(bfChinese, 11, Font.BOLD);// 设置字体大小
Font textfont = new Font(bfChinese, 9, Font.NORMAL);// 设置字体大小
document.setPageSize(PageSize.A4);// 设置页面大小
PdfWriter.getInstance(document, new FileOutputStream(outputPath));
document.open();
PdfPTable table = createTable(new float[]{1f, 4f, 2f, 2f, 2.5f, 2.5f, 2f});
table.addCell(createCell("编号", keyfont, Element.ALIGN_CENTER));
table.addCell(createCell("文件名", keyfont, Element.ALIGN_CENTER));
table.addCell(createCell("广告类型", keyfont, Element.ALIGN_CENTER));
table.addCell(createCell("频道包", keyfont, Element.ALIGN_CENTER));
table.addCell(createCell("开始日期", keyfont, Element.ALIGN_CENTER));
table.addCell(createCell("结束日期", keyfont, Element.ALIGN_CENTER));
table.addCell(createCell("缩略图", keyfont, Element.ALIGN_CENTER));
//设置单元格
document.add(table);
document.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
}*/
}
public synchronized static boolean html2Pdf(String outputPath, String xmlStr) {
OutputStream os = null;
try {
//xmlStr = HtmlGenerator.generate("D:/Workspaces/SSMBootstrap/resources/freemaker/template/maintenanceViewTemplate.ftl", new HashMap<String, Object>());
os = new FileOutputStream(outputPath);
ITextRenderer renderer = new ITextRenderer();
// DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
// org.w3c.dom.Document doc = builder.parse(new ByteArrayInputStream(xmlStr.getBytes("utf-8")));
// renderer.setDocument(doc,null);
renderer.setDocumentFromString(xmlStr);
// 解决中文支持问题
ITextFontResolver fontResolver = renderer.getFontResolver();
try {
fontResolver.addFont("C:/Windows/fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 解决图片的相对路径问题
/*String basePath="D:/Tomcat 7.0/webapps/UploadFile";
renderer.getSharedContext().setBaseURL("file:/" + basePath + "/MaintenanceBill");
renderer.getSharedContext().setReplacedElementFactory(new Base64ImgReplacedElementFactory());
renderer.getSharedContext().getTextRenderer().setSmoothingThreshold(0);*/
renderer.layout();
try {
renderer.createPDF(os);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
/*ByteArrayOutputStream baos=new ByteArrayOutputStream();
baos=(ByteArrayOutputStream) os;
Hibernate.createBlob();
ByteArrayInputStream swapStream = new ByteArrayInputStream(baos.toByteArray());*/
if (os!=null) {
os.flush();
os.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return true;
}
/**
*
* 提供中文
*
*/
public class ChinaFontProvide implements FontProvider{
@Override
public Font getFont(String arg0, String arg1, boolean arg2, float arg3,
int arg4, BaseColor arg5) {
BaseFont bfChinese =null;
try {
// bfChinese=BaseFont.createFont("STSong-Light", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
bfChinese=BaseFont.createFont("C:/Windows/Fonts/SIMYOU.TTF,1",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
} catch (Exception e) {
e.printStackTrace();
}
Font FontChinese = new Font(bfChinese);
return FontChinese;
}
@Override
public boolean isRegistered(String arg0) {
return false;
}
}
@RequestMapping("/exportMaintenanceDetailPDF.do")
public ModelAndView exportMaintenanceDetailPDF(HttpServletRequest request,Model model){
String htmlStr = request.getParameter("htmlStr");
PDFFileUtil pdfFileUtil= new PDFFileUtil();
String realPath = request.getSession().getServletContext().getRealPath("/");
String pjName = request.getContextPath().substring(1, request.getContextPath().length());
realPath = realPath.replace(pjName,"UploadFile");
String fileName =CommUtil.getUUID()+".pdf";
realPath+="MaintenanceBill\\"+fileName;
pdfFileUtil.html2Pdf(realPath, htmlStr);
String result="{\"res\":\""+realPath.substring(realPath.indexOf("UploadFile"),realPath.length()).replace("\\", "/")+"\"}";
model.addAttribute("result",result);
return new ModelAndView("result");
}
/* static{
BaseFont bfChinese_H;
try {
*//**
* 新建一个字体,iText的方法 STSongStd-Light 是字体在iTextAsian.jar 中以property为后缀
* UniGB-UCS2-H 是编码在iTextAsian.jar 中以cmap为后缀 H 代表文字版式是 横版, 相应的 V 代表竖版
*//*
bfChinese_H = BaseFont.createFont("STSong-Light","UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
headFont = new Font(bfChinese_H, 14, Font.NORMAL);
keyFont = new Font(bfChinese_H, 26, Font.BOLD);
nbspFont = new Font(bfChinese_H, 13, Font.NORMAL);
textfont_H = new Font(bfChinese_H, 10, Font.NORMAL);
textfont_B = new Font(bfChinese_H, 12, Font.NORMAL);
textfont_13 = new Font(bfChinese_H, 13, Font.NORMAL);
textfont_12 = new Font(bfChinese_H, 12, Font.NORMAL);
textfont_11 = new Font(bfChinese_H, 11, Font.NORMAL);
textfont_10 = new Font(bfChinese_H, 10, Font.NORMAL);
textfont_9 = new Font(bfChinese_H, 9, Font.NORMAL);
textfont_8 = new Font(bfChinese_H, 8, Font.NORMAL);
textfont_7 = new Font(bfChinese_H, 7, Font.NORMAL);
textfont_6 = new Font(bfChinese_H, 6, Font.NORMAL);
} catch (Exception e) {
e.printStackTrace();
}
}*/
/**
* 设置页面属性
* @param file
*/
public void setPageProperties(File file) {
//自定义纸张
Rectangle rectPageSize = new Rectangle(350, 620);
// 定义A4页面大小
//Rectangle rectPageSize = new Rectangle(PageSize.A4);
rectPageSize = rectPageSize.rotate();// 加上这句可以实现页面的横置
document = new Document(rectPageSize,10, 150, 10, 40);
try {
PdfWriter.getInstance(document,new FileOutputStream(file));
document.open();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 建表格(以列的数量建)
* @param colNumber
* @return
*/
public PdfPTable createTable(int colNumber){
PdfPTable table = new PdfPTable(colNumber);
try{
//table.setTotalWidth(maxWidth);
//table.setLockedWidth(true);
table.setHorizontalAlignment(Element.ALIGN_CENTER);
table.getDefaultCell().setBorder(1);
table.setSpacingBefore(10);
table.setWidthPercentage(100);
}catch(Exception e){
e.printStackTrace();
}
return table;
}
/**
* 建表格(以列的宽度比建)
* @param widths
* @return
*/
public PdfPTable createTable(float[] widths){
PdfPTable table = new PdfPTable(widths);
try{
//table.setTotalWidth(maxWidth);
//table.setLockedWidth(true);
table.setHorizontalAlignment(Element.ALIGN_CENTER);
table.getDefaultCell().setBorder(1);
table.setSpacingBefore(10);
table.setWidthPercentage(100);
}catch(Exception e){
e.printStackTrace();
}
return table;
}
/**
* 表格中单元格
* @param value
* @param font
* @param align
* @return
*/
public PdfPCell createCell(String value,Font font,int align){
PdfPCell cell = new PdfPCell();
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(align);
cell.setPhrase(new Phrase(value,font));
return cell;
}
/**
* 表格中单元格
* @param value
* @param font
* @param align
* @param colspan
* @param rowspan
* @return
*/
public PdfPCell createCell(String value,Font font,int align_v,int align_h,int colspan,int rowspan){
PdfPCell cell = new PdfPCell();
cell.setVerticalAlignment(align_v);
cell.setHorizontalAlignment(align_h);
cell.setColspan(colspan);
cell.setRowspan(rowspan);
cell.setPhrase(new Phrase(value,font));
return cell;
}
/**
* 创建无边框表格
* @param value
* @param font
* @param align
* @param colspan
* @param rowspan
* @return
*/
public PdfPCell createCellNotBorder(String value,Font font,int align_v,int align_h,int colspan,int rowspan){
PdfPCell cell = new PdfPCell();
cell.setVerticalAlignment(align_v);
cell.setHorizontalAlignment(align_h);
cell.setColspan(colspan);
cell.setRowspan(rowspan);
cell.setPhrase(new Phrase(value,font));
cell.setBorderWidth(0f);
return cell;
}
/**
* 建短语
* @param value
* @param font
* @return
*/
public Phrase createPhrase(String value,Font font){
Phrase phrase = new Phrase();
phrase.add(value);
phrase.setFont(font);
return phrase;
}
/**
* 建段落
* @param value
* @param font
* @param align
* @return
*/
public Paragraph createParagraph(String value,Font font,int align){
Paragraph paragraph = new Paragraph();
paragraph.add(new Phrase(value,font));
paragraph.setAlignment(align);
return paragraph;
}
}