package com.ruoyi.web.controller.api;/*** Project Name:report* File Name:PdfReportM1HeaderFooter.java* Package Name:com.riambsoft.report.pdf* Date:2013-9-16上午08:59:00* Copyright (c) 2013, riambsoft All Rights Reserved.**/import java.io.IOException;import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPageEventHelper;
import com.itextpdf.text.pdf.PdfTemplate;
import com.itextpdf.text.pdf.PdfWriter;/*** ClassName:PdfReportM1HeaderFooter <br/> Function: TODO ADD FUNCTION. <br/> Reason: TODO ADD REASON. <br/> Date: 2013-9-13 上午08:59:00 <br/>** @author 落雨* @version 394263788(QQ)* @since JDK 1.5*/
public class PdfReportM1HeaderFooter extends PdfPageEventHelper {/*** 页眉*/public String header = "";/*** 文档字体大小,页脚页眉最好和文本大小一致*/public int presentFontSize = 12;/*** 文档页面大小,最好前面传入,否则默认为A4纸张*/public Rectangle pageSize = PageSize.A4;// 模板public PdfTemplate total;// 基础字体对象public BaseFont bf = null;// 利用基础字体生成的字体对象,一般用于生成中文文字public Font fontDetail = null;/**** Creates a new instance of PdfReportM1HeaderFooter 无参构造方法.**/public PdfReportM1HeaderFooter() {}/**** Creates a new instance of PdfReportM1HeaderFooter 构造方法.** @param yeMei*            页眉字符串* @param presentFontSize*            数据体字体大小* @param pageSize*            页面文档大小,A4,A5,A6横转翻转等Rectangle对象*/public PdfReportM1HeaderFooter(String yeMei, int presentFontSize, Rectangle pageSize) {this.header = yeMei;this.presentFontSize = presentFontSize;this.pageSize = pageSize;}public void setHeader(String header) {this.header = header;}public void setPresentFontSize(int presentFontSize) {this.presentFontSize = presentFontSize;}/**** TODO 文档打开时创建模板** @see com.itextpdf.text.pdf.PdfPageEventHelper#onOpenDocument(com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document)*/public void onOpenDocument(PdfWriter writer, Document document) {total = writer.getDirectContent().createTemplate(50, 50);// 共 页 的矩形的长宽高}/**** TODO 关闭每页的时候,写入页眉,写入'第几页共'这几个字。** @see com.itextpdf.text.pdf.PdfPageEventHelper#onEndPage(com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document)*/public void onEndPage(PdfWriter writer, Document document) {try {if (bf == null) {bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);}if (fontDetail == null) {fontDetail = new Font(bf, presentFontSize, Font.NORMAL);// 数据体字体}} catch (DocumentException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}// 1.写入页眉ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_LEFT, new Phrase(header, fontDetail), document.left(), document.top() + 20, 0);// 2.写入前半部分的 第 X页/共int pageS = writer.getPageNumber();String foot1 = "第 " + pageS + " 页 /共";Phrase footer = new Phrase(foot1, fontDetail);// 3.计算前半部分的foot1的长度,后面好定位最后一部分的'Y页'这俩字的x轴坐标,字体长度也要计算进去 = lenfloat len = bf.getWidthPoint(foot1, presentFontSize);// 4.拿到当前的PdfContentBytePdfContentByte cb = writer.getDirectContent();//自己增加的if(pageS==1){Phrase footerLeft = new Phrase("978-1-4799-0530-031.00 ©2013 IEEE", fontDetail);ColumnText.showTextAligned(cb, Element.ALIGN_LEFT, footerLeft, document.left(), document.bottom() - 20, 0);}// 5.写入页脚1,x轴就是(右margin+左margin + right() -left()- len)/2.0F 再给偏移20F适合人类视觉感受,否则肉眼看上去就太偏左了 ,y轴就是底边界-20,否则就贴边重叠到数据体里了就不是页脚了;注意Y轴是从下往上累加的,最上方的Top值是大于Bottom好几百开外的。ColumnText.showTextAligned(cb, Element.ALIGN_CENTER, footer, (document.rightMargin() + document.right() + document.leftMargin() - document.left() - len) / 2.0F + 20F, document.bottom() - 20, 0);// 6.写入页脚2的模板(就是页脚的Y页这俩字)添加到文档中,计算模板的和Y轴,X=(右边界-左边界 - 前半部分的len值)/2.0F + len , y 轴和之前的保持一致,底边界-20cb.addTemplate(total, (document.rightMargin() + document.right() + document.leftMargin() - document.left()) / 2.0F + 20F, document.bottom() - 20); // 调节模版显示的位置}/**** TODO 关闭文档时,替换模板,完成整个页眉页脚组件** @see com.itextpdf.text.pdf.PdfPageEventHelper#onCloseDocument(com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document)*/public void onCloseDocument(PdfWriter writer, Document document) {// 7.最后一步了,就是关闭文档的时候,将模板替换成实际的 Y 值,至此,page x of y 制作完毕,完美兼容各种文档size。total.beginText();total.setFontAndSize(bf, presentFontSize);// 生成的模版的字体、颜色String foot2 = " " + (writer.getPageNumber() - 1) + " 页";total.showText(foot2);// 模版显示的内容total.endText();total.closePath();}
}
package com.ruoyi.web.controller.api;import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfName;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.codec.Base64;
import com.itextpdf.tool.xml.XMLWorker;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;
import com.itextpdf.tool.xml.css.StyleAttrCSSResolver;
import com.itextpdf.tool.xml.html.CssAppliers;
import com.itextpdf.tool.xml.html.CssAppliersImpl;
import com.itextpdf.tool.xml.html.Tags;
import com.itextpdf.tool.xml.parser.XMLParser;
import com.itextpdf.tool.xml.pipeline.css.CSSResolver;
import com.itextpdf.tool.xml.pipeline.css.CssResolverPipeline;
import com.itextpdf.tool.xml.pipeline.end.PdfWriterPipeline;
import com.itextpdf.tool.xml.pipeline.html.AbstractImageProvider;
import com.itextpdf.tool.xml.pipeline.html.HtmlPipeline;
import com.itextpdf.tool.xml.pipeline.html.HtmlPipelineContext;import java.io.*;public class Test {
//    生成hellowlodpublic void hellowPdf() throws IOException, DocumentException {Document document = new Document(PageSize.A4);//第二步,创建Writer实例PdfWriter.getInstance(document, new FileOutputStream("hello.pdf"));//创建中文字体BaseFont bfchinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);Font fontChinese = new Font(bfchinese, 12, Font.NORMAL);//第三步,打开文档document.open();//第四步,写入内容Paragraph paragraph = new Paragraph("hello world", fontChinese);document.add(paragraph);//第五步,关闭文档document.close();}//    ----------------------讲html生成pdf---------------------------------/*** 创建PDF文件* @param htmlStr* @throws Exception*/private static void writeToOutputStreamAsPDF(String htmlStr) throws Exception {String targetFile = "pdfDemo1.pdf";File targeFile = new File(targetFile);if(targeFile.exists()) {targeFile.delete();}//定义pdf文件尺寸,采用A4横切Document document = new Document(PageSize.A4, 25, 25, 15, 40);// 左、右、上、下间距//定义输出路径PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(targetFile));PdfReportM1HeaderFooter header = new PdfReportM1HeaderFooter("", 8, PageSize.A4);writer.setPageEvent(header);writer.addViewerPreference(PdfName.PRINTSCALING, PdfName.NONE);document.open();// CSSCSSResolver cssResolver = new StyleAttrCSSResolver();CssAppliers cssAppliers = new CssAppliersImpl(new XMLWorkerFontProvider(){@Overridepublic Font getFont(String fontname, String encoding, boolean embedded, float size, int style, BaseColor color) {try {//用于中文显示的ProviderBaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);return new Font(bfChinese, size, style);} catch (Exception e) {return super.getFont(fontname, encoding, size, style);}}});//htmlHtmlPipelineContext htmlContext = new HtmlPipelineContext(cssAppliers);htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());htmlContext.setImageProvider(new AbstractImageProvider() {@Overridepublic Image retrieve(String src) {//支持图片显示int pos = src.indexOf("base64,");try {if (src.startsWith("data") && pos > 0) {byte[] img = Base64.decode(src.substring(pos + 7));return Image.getInstance(img);} else if (src.startsWith("http")) {return Image.getInstance(src);}} catch (BadElementException ex) {return null;} catch (IOException ex) {return null;}return null;}@Overridepublic String getImageRootPath() {return null;}});// PipelinesPdfWriterPipeline pdf = new PdfWriterPipeline(document, writer);HtmlPipeline html = new HtmlPipeline(htmlContext, pdf);CssResolverPipeline css = new CssResolverPipeline(cssResolver, html);// XML WorkerXMLWorker worker = new XMLWorker(css, true);XMLParser p = new XMLParser(worker);p.parse(new ByteArrayInputStream(htmlStr.getBytes()));document.close();}/*** 读取 HTML 文件* @return*/private static String readHtmlFile() {StringBuffer textHtml = new StringBuffer();try {File file = new File("D:\\project\\java\\RuoYi-Vue-master_test\\ruoyi-admin\\src\\main\\java\\com\\ruoyi\\web\\controller\\api\\demo.html");BufferedReader reader = new BufferedReader(new FileReader(file));String tempString = null;// 一次读入一行,直到读入null为文件结束while ((tempString = reader.readLine()) != null) {textHtml.append(tempString);}reader.close();} catch (IOException e) {System.out.println("e"+e.toString());return null;}return textHtml.toString();}public static void main(String[] args) throws Exception {
//        new Test().hellowPdf();//读取html文件String htmlStr = readHtmlFile();//将html文件转成PDFwriteToOutputStreamAsPDF(htmlStr);}
}

pom文件

<!--        html转pdf--><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.11</version></dependency><dependency><groupId>com.itextpdf.tool</groupId><artifactId>xmlworker</artifactId><version>5.5.11</version></dependency><!-- 支持中文 --><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency><!-- 支持css样式渲染 --><dependency><groupId>org.xhtmlrenderer</groupId><artifactId>flying-saucer-pdf-itext5</artifactId><version>9.1.16</version></dependency><!-- 转换html为标准xhtml包 --><dependency><groupId>net.sf.jtidy</groupId><artifactId>jtidy</artifactId><version>r938</version></dependency>

java 将HTML文件转成pdf相关推荐

  1. Java 将HTML文件转换成PDF(Windows和linux)

    核心代码 package lijiong.pdf.htmltopdfv2;import java.io.IOException;public class PDFTool { //wkhtmltopdf ...

  2. Java 将Excel文件转成PDF格式

    之前工作需要,查了挺多种Excel转PDF的方法,目前来看这种比较简单,因此分享一下.如果对您有帮助的话请关注下微信号:泽学Java,不定期分享学习心得和成长经验. 首先需要引入aspose-cell ...

  3. 在Java中将excel文件转换成pdf文件

    直接贴Excel转PDF方法 /** excelFileDir:excel文件路径 excelFileName:excel文件名称(包含扩展名,不包含下面默认给.xls) */ public Stri ...

  4. 利用Java将word文件转成pdf文件

    说明:使用本方法计算机中必须含有office 一.准备工作 1.准备如图三个文件: 2.将第二个文件复制到C:\Windows\System32,将第三个文件复制到C:\Windows\SysWOW6 ...

  5. java编程将HTML文件转换成PDF文件

    网上有好几种方法可以将将HTML文件转换成PDF文件但是有些对HTML文件格式要求比较严格,稍微错了一些就不能生成我们所要的PDF文件,这里我推荐一个 PD4ML,它可以解决HTML文件格式不正确的问 ...

  6. Java使用aspse实现Excel文件转换成PDF文件

    使用Java代码把Excel文件转换成PDF文件 需要引用aspose包,引入操作我写了一个博客,地址如下 https://blog.csdn.net/weixin_46713508/article/ ...

  7. OFD文件转换成PDF格式,Java语言实现

    OFD文件转换成PDF格式,Java语言实现 我个人的思路大致是这样的.首先在指定路径创建一个文件夹,然后每次要转换的时候都把OFD文件统一放到指定的文件夹内进行转换.这样写代码的时候只需要循环遍历一 ...

  8. java pdf 首页 缩略图_Java中将上传的文件首页生成缩略图(先将上传的文件转成pdf,然后将pdf转成jpg)...

    1.首先将上传的非jpg,pdf格式的文件转成pdf,这个是采用OpenOffice进行转的,具体代码如下: private void officeToPdf(){ OpenOfficeConnect ...

  9. 使用flying saucer将html文件转成PDF

    使用flying saucer生成PDF文件之前,先要使用freemarker生成html文件,然后将html文件转成pdf.生成html文件的东东网上一搜一大堆,大家找找就成. 当然"使用 ...

最新文章

  1. java plc通讯_树莓派+西门子PLC+Aliyun
  2. Lambda表达式介绍
  3. spark用scala读取hive表数据(不同版本区别)
  4. linux c之信号signal处理机制
  5. Linux环境变量配置的三个方法--/etc/profile,~/.bashrc,shell
  6. python中line.split_Python splitlines()方法
  7. Proxmox VE2.2虚拟化安装配置学习笔记(三)
  8. cent os7 安装elasticsearch-7.9.3(伪集群)和kibana-7.9.3
  9. js前端之浅拷贝与深拷贝
  10. 抖音短视频数据分析报告工具
  11. 基于matlab的锁相环频率合成器,基于simulink的电荷泵锁相环频率合成器建模与仿真.pdf...
  12. kudu之tablet设计原理
  13. 图片尺寸的修改(Java)
  14. C语言编程练习---2021级山东理工大学ACM实验三题解
  15. dedecms index.php挂马,dedecms被挂马常见解决方法
  16. vos3000配置与通讯测试(一)
  17. python 第一行包含一个整数n、表示行数_输入 第一行输入一个整数n(1 = n = 100)表示测试样例个数 接下来n行,一...
  18. c++开源协程库libgo介绍及使用
  19. 基于微信小程序的电影院购票平台
  20. 算法高级(7)-限流(Rate limit)算法详解

热门文章

  1. 力扣46.全排列(回溯法)
  2. flink ui含义图解
  3. 内存存放方式_如何以正确的方式存放剩余涂料
  4. 国内数字藏品的乱象与未来
  5. WebBrowser 显示Html内容3点细节技巧
  6. 关于飞思卡尔的芯片固件库问题,为什么5.3没有8位芯片固件选择MC9S08DZ60芯片
  7. java 转化罗马数字._Java刷LeetCode:整数转罗马数字
  8. 20210904英雄联盟记录
  9. mysql 统计表中条目数量的几种方法
  10. SETi的Violeds技术解决方案可帮助阻止德尔塔变异病毒的传播