(一)java生成pdf的方法

java生成pdf的方法

这里讲解生成pdf的两种方法:
1.使用pdfStamper生成pdf
2.使用XMLWorkerHelper生成pdf(css比较简单的情况下)

XMLWorkerHelper的坑在于:
1.图片问题。所以当存在图片的时候使用方法一。
2.itextpdf不支持 css 的float,position,border-xxxx这些属性,如果使用了float:xxx之类的,生成的pdf直接白屏(没任何数据),我X,最后使用table 替换div
3.所有的必须指明字体。style="font-family:‘宋体’;
eg.

<p style="padding-left: 205pt;text-indent: 0pt;line-height: 16pt;text-align: left;"> 

必须改成:

<p style="font-family:'宋体';padding-left: 205pt;text-indent: 0pt;line-height: 16pt;text-align: left;">  

1.pdfStamper表单域生成pdf

使用adobe对pdf进行插入表单域。

     /**
     * 利用表单域生成pdf
      * @param templatePath   模板路径
     * @param targetPath      生成文件存放的路径
     * @param replacement       pdf中存放的数据(放在一个实体中)
     */
    public static File createPdf(String templatePath, String targetPath,Object replacement){
        try {
            /* 打开已经定义好字段以后的pdf模板 */
            URL a = PdfUtil.class.getClassLoader().getResource(templatePath);
            PdfReader reader = new PdfReader(a.getPath());

            /* 将要生成的目标PDF文件名称 */
            File file = new File(targetPath);
            File fileParent = file.getParentFile();
            if(!fileParent.exists()){
                fileParent.mkdirs();
            }
            file.createNewFile();
            PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(file));
            /* 使用中文字体 */
            BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",
                    BaseFont.NOT_EMBEDDED);
            /* 取出报表模板中的所有字段 */
            AcroFields form = stamp.getAcroFields();
            form.addSubstitutionFont(bf);
			/* 将实体中的内容放到pdf中 */
            for (Field aField : replacement.getClass().getDeclaredFields()) {
                String fieldName = aField.getName();
                if ("class java.lang.String".equals(aField.getGenericType().toString())) {
                    Method method = replacement.getClass().getMethod("get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1));
                    String fieldValue = (String) method.invoke(replacement);
                    if (fieldValue != null) {
                        form.setField(fieldName,fieldValue);
                    }
                }
            }
            /* 如果为false那么生成的PDF文件还能编辑,一定要设为true*/
            stamp.setFormFlattening(true);
            stamp.close();
            reader.close();
            return file;
        }catch(Exception e){
            e.printStackTrace();
        }
        return null;
    }

XMLWORKHEADER生成pdf

	/**
	 * @param fileString  模板中的内容被替换之后的字符串
     * 将文本生成为pdf到指定路径
     */
    public File generatePdfToLocal(String fileString, String archivePath)
            throws IOException, DocumentException {
        if (fileString != null) {
            Document doc = new Document();
            File file =  new File(archivePath);
            File fileParent = file.getParentFile();
            if(!fileParent.exists()){
                fileParent.mkdirs();
            }
            file.createNewFile();
            OutputStream output = new FileOutputStream(file);
            PdfWriter pdfWriter = PdfWriter.getInstance(doc, output);
            doc.open();
            log.info("生成的合同" + fileString);
            InputStream input = new ByteArrayInputStream(fileString.getBytes());
            XMLWorkerHelper.getInstance().parseXHtml(pdfWriter, doc, input);
            doc.close();
            output.close();
            return  file;
        }
        return null;
    }

有问题请指出并批评。谢谢。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值