Freemaker 模板生成html文件带barcode4j条形码并转PDF

前面野了三篇博客,现在直接结合在一起做一个实例

首先生成条形码并且放入html转换成pdf下载下来,将所有功能集合在一起
1.条形码

String barcode=BarCodeUtil.create39Code(“A123456”);

实现方法

public static String create39Code(String code) {
        ByteArrayOutputStream baos=new ByteArrayOutputStream();
        try {
            // Create the barcode bean
            Code39Bean bean = new Code39Bean();
            final int dpi = 140;
            // Configure the barcode generator
            bean.setModuleWidth(UnitConv.in2mm(1.0f / 140)); // makes the narrow
            bean.setHeight(13);
            bean.setWideFactor(3);// width exactly one pixel
            bean.doQuietZone(false);
            bean.setQuietZone(2);// 两边空白区
            // bean.setMsgPosition(HumanReadablePlacement.HRP_NONE);
            bean.setFontSize(5);
            bean.setDisplayStartStop(true);
            // Set up the canvas provider for monochrome JPEG output
            BitmapCanvasProvider canvas = new BitmapCanvasProvider(baos, "image/png", dpi, BufferedImage.TYPE_BYTE_BINARY, false, 0);
            // Generate the barcode
            bean.generateBarcode(canvas, code);
            // Signal end of generation
            canvas.finish();
        } catch (Exception e) {
            logger.error("单号:{}生成条形码出错",code,e);
        }
        String base64Img=Base64.byteArrayToBase64(baos.toByteArray());
        return base64Img;
    }

2.模板赋值

    String html=FreemarkerUtil.getHtml(String base64Img);

实现方法:

public static String getHtml(String base64Img) throws Exception {
        // 创建插值的Map
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("users", base64Img);
        StringWriter stringWriter = new StringWriter();
        BufferedWriter writer = new BufferedWriter(stringWriter);
        template.setEncoding("UTF-8");
        // 执行插值,并输出到指定的输出流中
        template.process(map, writer);
        String html = stringWriter.toString();
        writer.flush();
        writer.close();
        return html;
    }

3.模板转PDF

ByteArrayOutputStream baos=FlyingSuacerUtil.htmlToPdf(String html);

实现方法:

public class FlyingSuacerUtil {
    public static ByteArrayOutputStream htmlToPdf(String html) throws Exception { 
        ByteArrayOutputStream baos=new ByteArrayOutputStream();   
        ITextRenderer renderer = new ITextRenderer();
        renderer.setDocumentFromString(html);
        // 解决中文支持问题     
        ITextFontResolver fontResolver = renderer.getFontResolver();     
        String env=SystemConstant.getProperty("spring.profiles.active");
        String os = System.getProperty("os.name");
        String fontPath=SystemConstant.getProperty("font.simsun.path");
        if(env.equals(Constants.ENV_DEVELOPMENT)&&os.startsWith(Constants.OS_WINDOWS)){
            fontResolver.addFont("C:/Windows/Fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        }else{
            fontResolver.addFont(fontPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        }
        renderer.layout();     
        renderer.createPDF(baos); 
        return baos;
    }     

最后是PDF输出流,将输出流传人PDF文件就好了。

public static void download(HttpServletResponse response, ByteArrayOutputStream baos, String fileName) throws IOException {
        response.setHeader("Content-type", "text/html;charset=UTF-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("multipart/form-data");
        response.setHeader("Content-Disposition", "attachment;fileName=" + new String(fileName.getBytes("UTF-8"),"ISO-8859-1"));
        response.addHeader("Content-Length", String.valueOf(baos.size()));
        OutputStream os = response.getOutputStream();
        os.write(baos.toByteArray());
        os.close();
        baos.close();
    }

或者:

File outFile = new File("D:\\index.pdf");
            try {
            outFile.createNewFile();
            OutputStream os = new FileOutputStream(outFile);
                    os.write(baos.toByteArray());
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                os.flush();
                os.close();
            }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
* 条形码制作简明指导 * * * * 2010年.杭州(FreeBarcode) * *********************************************************************************************** 1、首先,FreeBarcode 是一款完全免费的软件,任何人都可以自由使用它,但禁止任何人捆绑到商业软件或 共享软件中销售。自从这个软件发布之后,用户群迅速膨胀,这是好事,说明这款软件还比较实用,但也 因此产生另一个问题:有的用户对“完全免费”这四个字不甚理解。所以,咨询的、提要求的、请教的等 等络绎不绝。有工厂用户要输出流水条码的、有商家用户要输出条码商品标签的、有印刷行业的用户要输 出特别的格式,等等,各行各业,五花八门的拥上来咨询、请教、提要求。在此作者声明:本软件作者对 FreeBarcode 软件,不提供任何服务,请用户们不要再咨询、请教,更不要提要求。 2、FreeBarcode 2.1.0.409 版本支持35大类条码的制作,这在免费条码制作软件中是极其少见的。虽然这个 软件没有提供排版功能,但它却有一个输出到剪贴板的功能,您为什么不可以用Word、WPS、CorelDraw等 等软件排版呢?难道Word、WPS、CorelDraw这些软件的排版功能,还不够强大吗? 3、FreeBarcode 是完全基于矢量图形的,不存在光栅图形输出的误差。所以,它的制作精度,只和您的打印 机有关。但条形码的等级,还和打印介质有关系,并非仅由打印精度决定。一般而言,使用激光、喷墨打 印机,只能制作出C级、D级的条码,若要制作出A级、B级条码,就得使用热印或热敏打印机打印。用户 可能会发现这样一个问题:超市里商品标签上的条码,看起来很粗糙,甚至有锯齿,可是条码扫描枪很 好读出来,而你打印的很精密的条码,条码枪却读不出,这是为什么呢?这就是因为打印介质问题,因为 条码枪扫描时,需要条码反射光到条码扫描器,所以你的条码打印得很好,却不怎么反光的话,条码扫描 器就读不出了。当然,这也和条码打印到什么纸张上有关,因为条码标签纸一般都是反光性很好的,若打 印在普通纸张上,性能就要差一些。当然,还和条码扫描枪的灵敏度有关,灵敏度高的条码枪,条码微弱 的反光即可,灵敏度差的条码枪,需要较强的反光,才能识别出来。现在,也有不依赖条码反射光的扫描 器,不过这类扫描器价格相对高些。有的用户用劣质硒鼓、墨水,打印到劣质的纸张上,扫描枪又是最低 档次的…… 4、制作条形码先得了解相关条码的一些常识。比方有的用户,连某种条码的尺寸规范还没弄清楚,就开始制 作条码,这样胡乱做出的条码,连外形尺寸都不达标,当然没什么用,因为条码并不是你想做多大就做多 大的,因为它要适配条码扫描器,否则条码扫描器不能认识。所以,制作条码之前最好先了解下相应的条 码。现在网络这么发达,网上到处可找到条码相关的信息。 5、对于1D条形码来说,比较常用又比较复杂的是Code 128A\B\C条码和GS1/EAN/UCC 128A\B\C 条码。可以这 么说,目前绝大部分专业或免费的条形码制作软件,对Code 128条码和GS1/EAN/UCC 128 条码的支持,都 是不怎么完善的,仅仅支持明码 128条码。所谓明码就是abcd...1234...#$<|=...这些可在键盘上打出的 字符。但 128码还支持编码那些无法在键盘上打出的控制符号,比如:回车、ESC、Tab等等你可以在键盘 上看见,但无法在键盘上打出。FreeBarcode 是完整支持128条码的,如何在FreeBarcode中输入这些在键 盘上无法打出的32个控制符号呢?象下面一样输入即可(一个反斜杠\加上字符名): \NUL、\SOH、\STX、\ETX、\EOT、\ENQ、\ACK、\BEL、\BS、\HT、\LF、\VT、\FF、\CR、\SO、\SI、\DLE、 \DC1、\DC2、\DC3、\DC4、\N
可以使用itextpdffreemarker来实现Java中的HTMLPDF功能。首先,确保你的项目已经引入了相关的依赖,包括spring-boot-starter-freemarker、itextpdf、xmlworker和itext-asian。 接下来,你可以创建一个HtmlConvertPdfHelper类来实现HTMLPDF的功能。在这个类中,你可以使用freemarker来生成HTML内容,并使用itextpdfHTML内容换为PDF文件。可以参考以下代码: ```java import com.itextpdf.text.Document; import com.itextpdf.text.DocumentException; import com.itextpdf.text.pdf.PdfWriter; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; import java.io.*; import java.util.Map; public class HtmlConvertPdfHelper { public byte[] htmlConvertPDF(String templateName, Map<String, String> data) throws IOException, TemplateException, DocumentException { // 加载freemarker配置 Configuration configuration = new Configuration(Configuration.VERSION_2_3_23); configuration.setClassForTemplateLoading(getClass(), "/"); // 获取freemarker模板 Template template = configuration.getTemplate(templateName); // 使用StringWriter来保存生成HTML内容 StringWriter writer = new StringWriter(); template.process(data, writer); // 使用itextpdfHTML内容换为PDF Document document = new Document(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); PdfWriter.getInstance(document, baos); document.open(); InputStream is = new ByteArrayInputStream(writer.toString().getBytes()); com.itextpdf.tool.xml.XMLWorkerHelper.getInstance().parseXHtml(PdfWriter.getInstance(document, baos), document, is); document.close(); // 返回换后的PDF文件内容 return baos.toByteArray(); } } ``` 接下来,你可以在测试类中调用HtmlConvertPdfHelper类来完成HTMLPDF的操作。首先,创建一个Map对象来存储模板中的变量值,然后调用htmlConvertPDF方法将HTML内容换为PDF,并将换后的PDF内容保存到文件中。 ```java import org.junit.Test; import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.HashMap; import java.util.Map; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class Test { private static final Logger LOGGER = LoggerFactory.getLogger(Test.class); @Test public void aaa() throws IOException, TemplateException, com.itextpdf.text.DocumentException { Map<String, String> data = new HashMap<>(); data.put("name", "鹤顶红"); data.put("type", "毒药"); byte[] bytes = new HtmlConvertPdfHelper().htmlConvertPDF("demo.ftl", data); OutputStream os = new FileOutputStream("G:/text.pdf"); os.write(bytes, 0, bytes.length); os.flush(); os.close(); LOGGER.info("换完成"); } } ``` 通过以上代码,你可以实现Java中的HTMLPDF功能。你需要按照你的实际情况进行适当的修改,如模板名称、变量值等。请确保模板文件存在,并且与HtmlConvertPdfHelper类处于相同的目录下。 希望这个回答能帮到你。如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值