实现逻辑:如果文件的内容都是固定,只是所填的值不同时,可先行创作模板文件,然后进行传值制成excel文件,然后转成pdf文件。
1.前期准备:首先制作模板文件
大概就是这样,其中内容的填充就是由所填的字段进行替换,这里有个需要注意的地方

图中的红色三角为批注,需要自己手动添加,最主要的就是jx:area(lastCell=''AJ36''),我这里的最后一列是J,最后一行是36。
到此,模板文件就已经创建完成了。
2.环境配置
网上对于如何将文件打印成pdf有很多方法,其中还因为打印的页数不同有所区分。最明显的是免费版本的只能打印三页之内,但同时也是最简单,易实现同时无水印的这种,这里介绍的就是这种。而另一种可实现多页打印的方法,我也在网上有看到如何将官方的jar包进行破译同时去掉水印,但是经过测试,效果并不让人满意。所以 如果是实现在浏览器中打印的功能,三页之内的可参考这个,三页之外的可去找寻破解版。
首先引进maven文件
<dependency> <groupId>org.jxls</groupId> <artifactId>jxls</artifactId> <version>2.6.0</version> </dependency> <dependency> <groupId>org.jxls</groupId> <artifactId>jxls-poi</artifactId> <version>1.1.0</version> </dependency><dependency> <groupId>e-iceblue</groupId> <artifactId>spire.xls.free</artifactId> <version>3.9.1</version> </dependency>需要进行远程仓库的配置,不然无法下载依赖
<repositories> <repository> <id>com.e-iceblue</id> <name>e-iceblue</name> <url>https://repo.e-iceblue.cn/repository/maven-public/</url> </repository> </repositories>
3.利用模板文件进行传值
public class Print {
/**
* 打印方法 不插入图片
* @throws Exception
* @return
*/
public static void print(BillSubsidy subsidy) throws Exception {
//准备数据,path是生成的excel文件的保存位置
String path ="D://test.xls";
//获取模板文件,你自己当前模板的位置 我这里为当前项目下
InputStream is = new FileInputStream("D://test.xlsx");
//根据模板生成的文件保存路径 我这里保存在本地D盘
OutputStream os = new FileOutputStream(path);
//绑定数据
Context context = new Context();
//内容太多只写了一个单独的
context.putVar("userName","张三");
context.putVar("address","测试");
//生成
JxlsHelper.getInstance().processTemplate(is, os, context);
}
到这里,调用此方法后赋值后的excel文件就已经生成了
4. 进行pdf的打印
String path = "D://order_contract.xls";//这里的path为赋值生成的excel文件地址Workbook wb = new Workbook(); wb.loadFromFile(path);//下面可进行一些调整,例如进行内容的自动换行,居中等操作可在制作模板文件时手动完成
Worksheet worksheet = wb.getWorksheets().get(0); worksheet.getRange().get("E3").getStyle().setWrapText(true);//地址自动换行 worksheet.getRange().get("C3").getStyle().setWrapText(true);//名字自动换行//调用方法保存为PDF格式 String pdfPath = "D://test.pdf"; wb.saveToFile(pdfPath, FileFormat.PDF);到这里,打印成pdf文件就已经实现了!!!
下面为补充的内容,根据需要自行查看;
如果是在本机上调试,那么此时打印pdf文件的功能已经实现,可自行测试,但很多时候网上很多只是介绍了这个功能如何实现,却并没有考虑到运行的环境。
因为在本机上运行时,spire可自行找到Windows下的字体文件进行使用,但在服务器上,由于很多时候服务器并没有安装字体,调用打印pdf方法时会出现报错,这里介绍一个解决方法:
1.确定服务器是ubuntu还是centos 先安装mkfontscale mkfontdir和fc-cache命令
Ubuntu下 : sudo apt-get install ttf-mscorefonts-installer
sudo apt-get install fontconfig
centos下 : yum install mkfontscale
yum install fontconfig
2.安装字体(这边建议是从windows中下载一个simsum.ttf的字体)
cd /usr/share/fonts/ 如果没有fonts那就手动创建
mkdir fonts
3.把下载的字体放到文件夹中
4.然后修改字体文件的权限
cd /usr/share/fonts/
chmod +x simsum.ttf
5.建立字体缓存
在文件夹路径下:mkfontscale
mkfontdir
fc-cache -fv
至此,Java 实现打印pdf无论是在本地还是服务器上实现就都可了。
如果想实现点击打印,能直接从浏览器下载到电脑,
//文件以流的方式进行输出
public static void returnPdfStream2(HttpServletResponse response, String pathName, String subsidyNane) throws Exception {
InputStream in = null;
try {
File file = new File(pathName);
in = new BufferedInputStream(new FileInputStream(file));
String filename = new String((subsidyNane+".pdf").getBytes(), "ISO8859_1");
response.setContentType("application/binary;charset=ISO8859_1");
response.setHeader("Content-disposition", "attachment; filename=" + filename);// 组装附件名称和格式
IoUtil.copy(in, response.getOutputStream());
} catch (Exception e) {
System.out.println("------------ 这里除了问题!!!-----------");
System.out.println(e);
}finally {
if (in != null) {
in.close();
}
}
}
本文详细介绍了如何使用Java实现简单的PDF打印。首先,制作模板文件,注意jx:area标记的使用。接着配置环境,引入必要的Maven依赖,并解决服务器字体问题以确保跨平台打印。通过传值和PDF操作,最终成功实现打印功能。

3779

被折叠的 条评论
为什么被折叠?



