最近公司有需求,希望生成pdf文档并打印。最近研究了一下itext生成pdf方面的东西。
首先我是用的maven,配置好依赖,我准备使用JFREECHART生成图表,ITEXT生成pdf
生成的pdf:
程序生成了几个矩形作为几个区域,用jfreechart生成了图表,最后讲每个区域拼合形成整个pdf。
首先生成一个pdf文档
Document document = new Document(PageSize.A4); PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest)); document.open();
由于某些服务器没有中文字体,需要自行安装中文字体。
我是这样解决的。
public final String CHINESE_FONT; public final BaseFont BASE_FONT; public final Font fontBigTitle; public final Font fontSmallTitle; public final Font fontText; public final Font fontTextUnderLine; public final Font fontTextBold; public final java.text.DecimalFormat decimalFormat = new java.text.DecimalFormat("0.00"); public final SimpleDateFormat yyyyMMDDFormat = new SimpleDateFormat("yyyy-MM-dd"); public final SimpleDateFormat yyyyMMDDHHmmssFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public final SimpleDateFormat HHmmssFormat = new SimpleDateFormat("HH:mm:ss"); public PDFUtils(String font) throws DocumentException, IOException { CHINESE_FONT = font; BASE_FONT = BaseFont.createFont(CHINESE_FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED); fontBigTitle = new Font(BASE_FONT, 22, Font.BOLD); fontSmallTitle = new Font(BASE_FONT, 10, Font.BOLD); fontText = new Font(BASE_FONT, 8, Font.NORMAL); fontTextUnderLine = new Font(BASE_FONT, 8, Font.UNDERLINE | Font.NORMAL); fontTextBold = new Font(BASE_FONT, 8, Font.BOLD); }
调用的时候
String font = servletRailPath + "fonts/NotoSansCJKsc-Regular.otf"; new PDFUtils(font)
设置好标题和字体并增加到pdf
Paragraph t = new Paragraph("标题", new com.itextpdf.text.Font.Font(BASE_FONT, 22, Font.BOLD);); t.setAlignment(Element.ALIGN_CENTER); document.add(t);
计算位置并画出一个方块,这部分代码可以封装成几个方法自动画出每一块。
Rectangle rectangle = drawAndSetRetangle(700, 760, writer); public Rectangle drawAndSetRetangle(int startY, int endY, PdfWriter writer) { drawRectangle(startY, endY, writer); return setRectangle(startY, endY, writer); }
将文字限定在刚画的矩形内
ColumnText ct = new ColumnText(writer.getDirectContent()); ct.setSimpleColumn(rectangle);
之后就可以新建段落,并添加文字,增加到矩形内了
Paragraph paragraph = new Paragraph(); paragraph.setLeading(12f); paragraph.setFont(fontSmallTitle); paragraph.add("xxxx \n"); paragraph.add("xxxx"); ct.addElement(paragraph); ct.go();
按照如上步骤增加几个区域,之后pdf就生成好了。
最后不要忘了
document.close();
然后就可以去查看pdf的效果了。
以下是我封装的几个常用方法
/** * @param paragraph */ public void addDefaultSpace(Paragraph paragraph) { addSpace(paragraph, 5); } public void addTextAndSpaceWithUnderLine(Paragraph paragraph, String text, int length) { int textLength = 0; try { for (int i = 0; i < text.length(); i++) { char temp = text.charAt(i); if ((temp >= '0' && temp <= '9') || (temp >= 'a' && temp <= 'z') || (temp >= 'A' && temp <= 'Z')) { textLength += 2; } else { textLength += 4; } } length -= textLength; addUnderLineText(paragraph, text); addSpaceWithUnderLine(paragraph, length); } catch (Exception e) { addSpaceWithUnderLine(paragraph, length); } } public void addBoldText(Paragraph paragraph, String text) { paragraph.setFont(fontTextBold); paragraph.add(text); paragraph.setFont(fontText); } public void addNormalText(Paragraph paragraph, String text) { paragraph.setFont(fontText); paragraph.add(text); paragraph.setFont(fontText); } public void addUnderLineText(Paragraph paragraph, String text) { paragraph.setFont(fontTextUnderLine); paragraph.add(text); paragraph.setFont(fontText); } public void addSpaceWithUnderLine(Paragraph paragraph, int amonut) { paragraph.setFont(fontTextUnderLine); for (int i = 0; i < amonut; i++) { paragraph.add("\u00a0"); } paragraph.setFont(fontText); } public void addSpace(Paragraph paragraph, int amonut) { paragraph.setFont(fontText); for (int i = 0; i < amonut; i++) { paragraph.add("\u00a0"); } paragraph.setFont(fontText); } public void drawRectangle(int startY, int endY, PdfWriter writer) { PdfContentByte canvas = writer.getDirectContent(); canvas.setColorFill(BaseColor.BLACK); canvas.moveTo(20, startY); canvas.lineTo(20, endY); canvas.lineTo(575, endY); canvas.lineTo(575, startY); canvas.lineTo(20, startY); canvas.closePathStroke(); } public Rectangle setRectangle(int startY, int endY, PdfWriter writer) { Rectangle r = new Rectangle(25, startY, 575, endY); PdfContentByte canvas = writer.getDirectContent(); canvas.setColorFill(BaseColor.BLACK); canvas.rectangle(r); canvas.stroke(); return r; } public Rectangle drawAndSetRetangle(int startY, int endY, PdfWriter writer) { drawRectangle(startY, endY, writer); return setRectangle(startY, endY, writer); }
maven配置如下:
com.itextpdf itextpdf 5.5.8 com.itextpdf itext-pdfa 5.5.8 com.itextpdf itext-xtra 5.5.8 com.itextpdf.tool xmlworker 5.5.8 com.itextpdf itext-asian 5.2.0 org.jfree jfreechart 1.0.19