JAVA 实现简单的打印pdf文件

本文详细介绍了如何使用Java实现简单的PDF打印。首先,制作模板文件,注意jx:area标记的使用。接着配置环境,引入必要的Maven依赖,并解决服务器字体问题以确保跨平台打印。通过传值和PDF操作,最终成功实现打印功能。

实现逻辑:如果文件的内容都是固定,只是所填的值不同时,可先行创作模板文件,然后进行传值制成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();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值