poi word文档根据书签图片(记录一下)

maven

<dependency>
            <groupId>e-iceblue</groupId>
            <artifactId>spire.doc.free</artifactId>
            <version>3.9.0</version>
        </dependency>
<repositories>
        <repository>
            <id>com.e-iceblue</id>
            <url>http://repo.e-iceblue.cn/repository/maven-public/</url>
        </repository>
    </repositories>

正式代码

/**
     * 根据word文件流根据书签位置签章
     *
     * @param fileUrl docx文件地址
     * @param pdfName pdf文件名称
     * @param type 1=文书,2=证照
     * @return
     */
    public static String fileUrlToPdf(String fileUrl, String pdfName, Integer type) {
        URL url = null;
        InputStream is = null;
        HttpURLConnection httpUrl = null;
        try {
            url = new URL(fileUrl);
            httpUrl = (HttpURLConnection) url.openConnection();
            httpUrl.connect();
            httpUrl.getInputStream();
            is = httpUrl.getInputStream();
            //加载Word测试文档
            Document doc = new Document();
            if (type == 1) {
                // 奇葩,用doc读不出来,用Auto能读出来shit
                doc.loadFromStream(is, FileFormat.Auto);
            } else {
                doc.loadFromStream(is, FileFormat.Docx);
            }
            //获取书签
            BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(doc);
            if (type == 1) {
                bookmarksNavigator.moveToBookmark("书签");
                if (null == bookmarksNavigator.getCurrentBookmark()) {
                    bookmarksNavigator.moveToBookmark("签章");
                }
            } else {
                bookmarksNavigator.moveToBookmark("签章");
                if (null == bookmarksNavigator.getCurrentBookmark()) {
                    bookmarksNavigator.moveToBookmark("书签");
                }
            }
            //如果成功获取书签再签章
            if (null != bookmarksNavigator.getCurrentBookmark()) {
                //用新的内容添加到原书签位置
                Paragraph paragraph = new Paragraph(doc);
                //添加电子章图片
                DocPicture picture = paragraph.appendPicture("cqjtj.png");
                paragraph.getFormat().setHorizontalAlignment(HorizontalAlignment.Center); // 这个语句好像没用的
                //设置图片浮于文字下方
                picture.setTextWrappingStyle(TextWrappingStyle.Behind); // 有用
                // 调整图片水平位置
                Integer high = -50;
                Integer width = 0;
                picture.setHorizontalPosition(width);
                picture.setVerticalPosition(high);
                TextBodyPart bodyPart = new TextBodyPart(doc);

                bodyPart.getBodyItems().add(paragraph);  // 可以的
//        bodyPart.getBodyItems().insert(0,paragraph); // 可以的
//        bookmarksNavigator.replaceBookmarkContent(bodyPart); // 可以的-替换书签
//        bookmarksNavigator.replaceBookmarkContent(bodyPart,true);
//        bookmarksNavigator.replaceBookmarkContent(bodyPart,true,true);
                bookmarksNavigator.insertTextBodyPart(bodyPart);  // 在书签出插入
//        doc.saveToFile("C:\\Users\\11296\\Desktop\\word\\" + name, FileFormat.Docx);//输出word
                doc.saveToFile(pdfName, com.spire.doc.FileFormat.PDF);//输出pdf格式有页数限制,仅支持3页
                doc.close();

                StorageClient1 fastClient = EditFileUtil.getFastClient();
                File file1 = new File(pdfName);
                FileInputStream fis = new FileInputStream(file1);
                ByteArrayOutputStream outStream = new ByteArrayOutputStream();
                //创建一个Buffer字符串
                byte[] buffer = new byte[1024];
                //每次读取的字符串长度,如果为-1,代表全部读取完毕
                int len = 0;
                //使用一个输入流从buffer里把数据读取出来
                while ((len = fis.read(buffer)) != -1) {
                    //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
                    outStream.write(buffer, 0, len);
                }
                // 上传文件,返回相对路径
                String fastId = fastClient.upload_file1(outStream.toByteArray(), "pdf", null);
                fis.close();
                outStream.close();
                FileUtils.deleteFile(pdfName); // 删除文件
                return fastId;
            } else {
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (httpUrl != null) {
                httpUrl.disconnect();
            }
        }
    }

测试代码

/**
     * 
     * @param path 目录
     * @param name 名字
     * @throws IOException
     */
    public static void word(String path, String name) throws IOException {
//加载包含书签的Word文档
        Document doc = new Document();
        doc.loadFromFile(path + name);
//获取书签
        BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(doc);
        bookmarksNavigator.moveToBookmark("签章");

//用新的内容替换原书签内容
        Paragraph paragraph = new Paragraph(doc);
        //添加电子章图片
        DocPicture picture = paragraph.appendPicture("C:\\Users\\11296\\Desktop\\cqjtj.png");
        paragraph.getFormat().setHorizontalAlignment(HorizontalAlignment.Center); // 这个语句好像没用的
//        BigDecimal w = new BigDecimal(picture.getWidth());
//        w = w.multiply(new BigDecimal(0.1));
//        BigDecimal h = new BigDecimal(picture.getHeight());
//        h = h.multiply(new BigDecimal(-0.1));
        //设置图片浮于文字下方
        picture.setTextWrappingStyle(TextWrappingStyle.Behind); // 有用
        Integer high = 0;
        Integer width = 0;
//        if (name.contains("船舶营业运输证注销登记证明书套打")) {
//
//        } else {
            high = -50;
//        }
        picture.setHorizontalPosition(width);
        picture.setVerticalPosition(high);
        TextBodyPart bodyPart = new TextBodyPart(doc);

        bodyPart.getBodyItems().add(paragraph);  // 可以的
//        bodyPart.getBodyItems().insert(0,paragraph); // 可以的
//        bookmarksNavigator.replaceBookmarkContent(bodyPart); // 可以的-替换书签
//        bookmarksNavigator.replaceBookmarkContent(bodyPart,true);
//        bookmarksNavigator.replaceBookmarkContent(bodyPart,true,true);
        bookmarksNavigator.insertTextBodyPart(bodyPart);  // 在书签出插入

//        doc.saveToFile("C:\\Users\\11296\\Desktop\\word\\" + name, FileFormat.Docx);//输出word
        doc.saveToFile("C:\\Users\\11296\\Desktop\\word\\" + name.split("\\.")[0] + ".pdf", com.spire.doc.FileFormat.PDF);//输出pdf格式有页数限制,仅支持3页
        doc.dispose();
        System.out.println("完成");
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FreeMarker 和 Poi-tl 都是基于模板的生成方式,需要先创建一个 Word 文档模板,然后将数据填充到模板中,最终生成一个完整的 Word 文档。它们之间的主要区别在于生成方式和操作方法。 1. 生成方式 FreeMarker 的生成方式是基于模板的,需要程序员先创建一个 Word 文档模板,然后使用 FreeMarker 引擎将数据模型中的数据填充到模板中,并生成一个完整的 Word 文档。 Poi-tl 也是基于模板的生成方式,但它提供了更加方便的模板编辑方式。Poi-tl 可以使用 Microsoft Office 软件创建模板,也可以使用 Poi-tl 提供的 API 直接创建模板。 2. 操作方法 FreeMarker 和 Poi-tl 都是使用 API 对文档进行操作,例如修改样式、替换变量、插入图片等等。但是它们的操作方法略有不同。 FreeMarker 使用类似于 JSP 的语法,即通过 ${} 表示一个变量,将数据模型中的数据填充到相应的变量位置上。同时,FreeMarker 还提供了一些内置的指令,如 if、list 等,可以用于逻辑控制和循环操作。 Poi-tl 则使用类似于 Word 的书签的方式,它将模板中的变量替换成书签,然后使用 Poi-tl 提供的 API 将数据填充到书签位置上。同时,Poi-tl 还提供了一些针对 Word 模板的 API,例如修改样式、替换变量、插入图片等等。 3. 使用场景 由于 FreeMarker 和 Poi-tl 是基于模板的生成方式,因此适用于需要批量生成相似结构的 Word 文档的场景,例如生成合同、报告、简历等。 4. 功能 FreeMarker 和 Poi-tl 都提供了丰富的 API,可以对 Word 文档进行各种操作,例如修改样式、替换变量、插入图片等等。但是它们的功能略有不同。 FreeMarker 主要是通过填充模板来生成 Word 文档,并提供了一些基本的操作 API,例如对模板中的变量进行替换、对模板中的样式进行修改、插入图片等等。 Poi-tl 则提供了更加方便的模板编辑方式,可以使用 Microsoft Office 软件创建模板,也可以使用 Poi-tl 提供的 API 直接创建模板。同时,Poi-tl 还提供了针对 Word 模板操作的 API,例如修改样式、替换变量、插入图片等等。 综上所述,FreeMarker 和 Poi-tl 都是用于生成 Word 文档的工具,它们之间有着不同的生成方式、操作方法、使用场景和功能。选择哪个工具应根据具体的需求和场景进行判断。如果需要批量生成相似结构的 Word 文档,可以选择 FreeMarker 或 Poi-tl;如果需要更加方便的模板编辑方式和针对 Word 模板的操作 API,可以选择 Poi-tl。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值