网页导出pdf不完整_如何用java导出PDF,附完整代码

8067b38c111e68983a053d454d2e303d.png

近期由于工作需要,需要将html代码导入到pdf中,经过了几种pdf的方案对比后发现IText是最简单和便捷的一种方式,于是乎采用了Itext。

PDF生成

第一步:导入Maven依赖

      <dependency>          <groupId>com.itextpdfgroupId>          <artifactId>itextpdfartifactId>          <version>5.4.2version>      dependency>      <dependency>          <groupId>com.itextpdf.toolgroupId>          <artifactId>xmlworkerartifactId>          <version>5.4.1version>      dependency>      <dependency>          <groupId>com.itextpdfgroupId>          <artifactId>itext-asianartifactId>          <version>5.2.0version>      dependency>      <dependency>          <groupId>org.xhtmlrenderergroupId>          <artifactId>flying-saucer-pdfartifactId>          <version>9.0.3version>      dependency>

第二步:直接上代码

public static void main(String[] args) throws IOException    {        String html = PDFKit.readFileByUrl("http://127.0.0.1/export/1/1"); // 将html代码读取到html字符串中        try {            Document document = new Document();            PdfWriter mPdfWriter = PdfWriter.getInstance(document, new FileOutputStream(new File("C:\\data\\3.pdf")));            document.open();            ByteArrayInputStream bin = new ByteArrayInputStream(html.getBytes());            XMLWorkerHelper.getInstance().parseXHtml(mPdfWriter, document, bin, null, new ChinaFontProvide());            System.out.println("生成完毕");            document.close();        } catch (Exception e) {            e.printStackTrace();        }    }    public static final class ChinaFontProvide implements FontProvider    {        @Override public boolean isRegistered(String s)        {            return false;        }        @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", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);            }            catch(Exception e)            {                e.printStackTrace();            }            Font FontChinese = new Font(bfChinese, 12, Font.NORMAL);            return FontChinese;        }    }

另附PDFKit.java工具类

public static String readFileByUrl(String urlStr) {        String res=null;        try {            URL url = new URL(urlStr);            HttpURLConnection conn = (HttpURLConnection)url.openConnection();            //设置超时间为3秒            conn.setConnectTimeout(3*1000);            //防止屏蔽程序抓取而返回403错误            conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");            //得到输入流            InputStream inputStream = conn.getInputStream();            res = readInputStream(inputStream);        } catch (Exception e) {            log.error("通过url地址获取文本内容失败 Exception:" + e);        }        return res;    }    /**     * 从输入流中获取字符串     * @param inputStream     * @return     * @throws IOException     */    public static String readInputStream(InputStream inputStream) throws IOException {        byte[] buffer = new byte[1024];        int len = 0;        ByteArrayOutputStream bos = new ByteArrayOutputStream();        while((len = inputStream.read(buffer)) != -1) {            bos.write(buffer, 0, len);        }        bos.close();        //System.out.println(new String(bos.toByteArray(),"utf-8"));        return new String(bos.toByteArray(),"utf-8");    }

至此 dpf就可以到下面路径中查看了

C:\\data\\3.pdf

PDF预览

只需在页面中增加如下代码即可

<html><head>    <title>Titletitle>head><body><body style="height: 100%; width: 100%; overflow: hidden; margin: 0px;"><embed width="100%" height="100%" src="pdf/3.pdf" type="application/pdf" internalinstanceid="25"/>body>body>html>

注意:html文档一定是,不可以是 不然body的100% 会失去效果

预览效果

d24af960cf0edf3298a7e888b84743d2.png

特别说明

如上代码生成的pdf,如果直接用工具打开后发现字体是没有问题,但是嵌套在网页后发现字体竟然不是宋体了,下面我们来介绍下IText输出中文的三种字体的选择方式

1、使用iTextAsian.jar中的字体    BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);2、使用Windows系统字体(TrueType)        BaseFont.createFont("C:/WINDOWS/Fonts/SIMLI.TTF", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);    3、使用资源字体(ClassPath)    BaseFont.createFont("/SIMYOU.TTF", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);  //下面着重介绍

上面是设置字体的方式,刚刚咱们用的第一种方式,所以pdf预览的的时候字体会变,改用下面的方式就没有任何问题了,下面咱们说下标红的是什么意思

由于项目使用的是springboot,所以发布到liunx后并不能直接从jar中查找相应的字体,要改用ClassPathResource的方式获取,因此更换代码如下:

可将STSONG.TTF直接放入resources文件夹根目录即可

这样windows和linux都可以正确的生成pdf并预览了。更换后的效果:

1e57bc3907939d93a9e3e327192b9867.png

 另附:常用字体

//楷体字BaseFont bfComic = BaseFont.createFont("c://windows//fonts//simkai.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//方正舒体BaseFont bfComic = BaseFont.createFont("c://windows//fonts//FZSTK.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//方正姚体BaseFont bfComic = BaseFont.createFont("c://windows//fonts//FZYTK.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//仿宋体BaseFont bfComic = BaseFont.createFont("c://windows//fonts//SIMFANG.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//黑体BaseFont bfComic = BaseFont.createFont("c://windows//fonts//SIMHEI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//华文彩云BaseFont bfComic = BaseFont.createFont("c://windows//fonts//STCAIYUN.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//华文仿宋BaseFont bfComic = BaseFont.createFont("c://windows//fonts//STFANGSO.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//华文细黑BaseFont bfComic = BaseFont.createFont("c://windows//fonts//STXIHEI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//华文新魏BaseFont bfComic = BaseFont.createFont("c://windows//fonts//STXINWEI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//华文行楷BaseFont bfComic = BaseFont.createFont("c://windows//fonts//STXINGKA.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//华文中宋BaseFont bfComic = BaseFont.createFont("c://windows//fonts//STZHONGS.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//隶书BaseFont bfComic = BaseFont.createFont("c://windows//fonts//SIMLI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//宋体-方正超大字符集BaseFont bfComic = BaseFont.createFont("c://windows//fonts//SURSONG.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//幼圆BaseFont bfComic = BaseFont.createFont("c://windows//fonts//SIMYOU.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

作者:流逝的青春

原文:https://www.cnblogs.com/blueskyli/p/9921832.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值