java导出pdf_一次java导出pdf的经历

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

PDF生成

第一步:导入Maven依赖

com.itextpdf

itextpdf

5.4.2

com.itextpdf.tool

xmlworker

5.4.1

com.itextpdf

itext-asian

5.2.0

org.xhtmlrenderer

flying-saucer-pdf

9.0.3

第二步:直接上代码

public static void main(String[] args) throwsIOException

{

String html= PDFKit.readFileByUrl("http://127.0.0.1/export/1/1"); // 将html代码读取到html字符串中try{

Document document= newDocument();

PdfWriter mPdfWriter= PdfWriter.getInstance(document, new FileOutputStream(new File("C:\\data\\3.pdf")));

document.open();

ByteArrayInputStream bin= newByteArrayInputStream(html.getBytes());

XMLWorkerHelper.getInstance().parseXHtml(mPdfWriter, document, bin,null, newChinaFontProvide());

System.out.println("生成完毕");

document.close();

}catch(Exception e) {

e.printStackTrace();

}

}public static final class ChinaFontProvide implementsFontProvider

{

@Overridepublic booleanisRegistered(String s)

{return false;

}

@Overridepublic Font getFont(String arg0, String arg1, boolean arg2, float arg3, intarg4, 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);returnFontChinese;

}

}

另附PDFKit.java工具类

public staticString readFileByUrl(String urlStr) {

String res=null;try{

URL url= newURL(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);

}returnres;

}/*** 从输入流中获取字符串

*@paraminputStream

*@return*@throwsIOException*/

public static String readInputStream(InputStream inputStream) throwsIOException {byte[] buffer = new byte[1024];int len = 0;

ByteArrayOutputStream bos= newByteArrayOutputStream();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预览

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

Title

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

预览效果

f05906d75e84012464bb809115662544.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的方式获取,因此更换代码如下:

ClassPathResource resource = new ClassPathResource("static/STSONG.TTF");

bfChinese= BaseFont.createFont(resource.getURL().toString(), BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

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

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

f0300d4781a80620385712ee97d97140.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);

去除边框可以通过设置PDF页面的边距来实现。下面是一个Java代码示例,使用iText库来导出PDF并去除边框: ```java import com.itextpdf.io.font.FontConstants; import com.itextpdf.kernel.font.PdfFontFactory; import com.itextpdf.kernel.geom.Rectangle; import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.layout.Document; import com.itextpdf.layout.borders.Border; import com.itextpdf.layout.borders.SolidBorder; import com.itextpdf.layout.element.Paragraph; import com.itextpdf.layout.property.TextAlignment; import java.io.File; import java.io.IOException; public class PDFExporter { // 导出PDF方法 public static void exportPDF(File file, String content) throws IOException { // 创建PdfWriter实例 PdfWriter writer = new PdfWriter(file); // 创建PdfDocument实例 PdfDocument pdf = new PdfDocument(writer); // 创建Document实例 Document document = new Document(pdf, new Rectangle(36, 36, 559, 806)); // 设置边距 document.setMargins(0, 0, 0, 0); // 添加内容 Paragraph paragraph = new Paragraph(content); paragraph.setBorder(Border.NO_BORDER); paragraph.setTextAlignment(TextAlignment.LEFT); paragraph.setFontSize(12f); paragraph.setFont(PdfFontFactory.createFont(FontConstants.HELVETICA)); document.add(paragraph); // 关闭document和pdf对象 document.close(); pdf.close(); } } ``` 在上面的代码中,我们通过设置Document对象的边距来去除PDF页面的边框,并使用Paragraph对象来添加内容。注意,我们还将Paragraph对象的边框设置为NO_BORDER,以确保内容和页面之间没有边框。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值