准备

  • jasperreports
  • jasperStudio
  • idea

基本步骤

  1. 使用jasperStudio编辑模板
  • 软件安装 官方需注册,第三方无需注册
    官网下载: https://community.jaspersoft.com/project/jaspersoft-studio/releases
    第三方站点: https://sourceforge.net/projects/jasperstudio
  • 模板制作
  1. 新建project
    file-new -project
  2. Java调用打印如何设置黑白或彩印_java

  3. 新建 jasperReport
  4. Java调用打印如何设置黑白或彩印_中文字体_02

  1. 模板分多个区域

Title:标题区,如果数据有多页只会在第一页打印
Page Header:页头区,多页的情况下每页都会打印
Column Header:列头区,配合下面的Detail区打印列表数据,多页的情况下每页都会打印
Detail:可以新增多个Detail区,可以组合打印出多个列表数据,多页的情况下每页都会打印
Column Footer:列表底部区,多页的情况下每页都会打印
Page Footer:页底部区,多页的情况下每页都会打印
Summary:合计区,只会在最后一页打印

4)随便设置几个title和feild(直接把元素拖到对应位置,然后在右边的properties里设置属性即可)

Java调用打印如何设置黑白或彩印_xml_03


5)编译模板

上面保存后的文件是.jrxml格式的,需要编译成.jasper格式。

在jrxml文件上,右键–jasperReports–>compile report 即可。

  1. 编写java程序
    首先使用jasperReport需要先引入他的依赖。
<dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports</artifactId>
            <version>6.19.1</version>
            <!--jasperReport中依赖了非release版本的itext,阿里镜像库中没有该依赖-->
            <exclusions>
                <exclusion>
                    <groupId>com.lowagie</groupId>
                    <artifactId>itext</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
        <dependency>
            <groupId>com.lowagie</groupId>
            <artifactId>itext</artifactId>
            <version>2.1.7</version>
        </dependency>
  • 将之前生成的jasper文件放在项目中。位置自己定,能访问到即可。
  • Java调用打印如何设置黑白或彩印_java_04

  • 我将对jasper的操作写在了工具类中。
    在jasperReport中,读取了模板文件。并通过jasperReport的类,做了转换。具体可以详细代码,这里就不赘述了。
  • 写一个简单的接口调用就可以测试了
  • Java调用打印如何设置黑白或彩印_xml_05

访问 http://localhost:8080/jasper/demo01/getReport?type=pdf 即可看到页面了。

Java调用打印如何设置黑白或彩印_xml_06

  1. 碰到问题 这块最值得一看了 因为坑了我好久。
  • 依赖的问题。
    我jasperreports用的最新的版本。但是这个版本里他依赖了itext.2.1.7.js9这个版本。但是这个版本不是一个release版本,所以阿里的maven库中没有这个。导致构建失败。
    处理方式:将jasperreports中默认的依赖去掉,重新加入一个itext的依赖即可。
  • Java调用打印如何设置黑白或彩印_中文字体_07

  • 这里需要注意的是,虽然itext的最新版本已经升级成了itextpdf,但这里是不兼容的。jasperreports中只能使用itext的2.1.7.使用itextpdf会报错。
  • 中文空白的问题、
    在编辑模板后,会碰到中文在浏览器显示为空白的问题。这个需要分两部分处理。
    先解释下空白情况。打印时的中文空白有两种:一种是jasperStudio编辑模板时,使用了中文变成了空白。如表头,描述文字等。第二种是java程序里填充的文字变成了空白。如表格的具体内容等。
    1)jasperStudio 端的空白
    空白的原因是jasperStudio里没有中文字体。虽然字体里可以选择中文的字体,但是实际是没有的。所以需要自己安装需要的中文字体。
    右键项目–properties–fonts:
    把你.ttf格式的字体文件添加过来就可以了。然后在属性里选择添加的字体文件。
  • java程序中的字体空白
    项目想增加两个个配置文件:
    1)jasperreports_extension.properties

xst是自己命名的,取啥都行。后面的文件路径是你字体文件的存放路径。

net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.xst=fonts/fonts.xml

2)fonts.xml

<fontFamily name="新宋体常规"><!--字体名称-->
        <normal>fonts/新宋体常规.ttf</normal><!--字体文件的路径-->
        <bold>fonts/新宋体常规.ttf</bold>
        <italic>fonts/新宋体常规.ttf</italic>
        <boldItalic>fonts/新宋体常规.ttf</boldItalic>
        <pdfEncoding>Identity-H</pdfEncoding><!--这里的定义就与上面1.1的图设置相匹配了-->
        <pdfEmbedded>true</pdfEmbedded>
        <exportFonts>
            <export key="net.sf.jasperreports.html">'新宋体常规', Arial, Helvetica, sans-serif</export>
            <export key="net.sf.jasperreports.xhtml">'新宋体常规', Arial, Helvetica, sans-serif</export>
        </exportFonts>
    </fontFamily>

然后就可以了

java端你可以把jasperStudio 里导入的字体文件,导出为jar包,然后add进项目中,就不用这个配置文件了。

ppppss:
如果你上述设置后,还是有问题,检查下jasperStudio 中设置java填充内容的占位元素的font,有没有设置为对应的中文字体。这里不设置的话,java中设置是不生效的。一定注意!

代码的demo完整文件地址:
https://github.com/PQfushb/jasperReport