当前位置: 首页 > article >正文

微信流量主挑战:用户破16!新增文档转换(新纪元3)

朋友们,报告好消息!我的小程序用户数量已经涨到16个了!没错,真·没拉朋友圈亲戚好友来撑场子,全靠实力(和一点点运气)吸引了16位陌生小伙伴光临!这波进步,连我自己都感动了!

有兴趣的朋友可以搜索体验一下,接下来的日子,我会每天更新营运状况,告诉大家这小程序到底能不能带来“流量变现”奇迹,还是最后成了我自己的社交实验田。同时,我还会不断更新小程序功能,努力让这16位尊贵用户用得开心(不开心也别走啊,求你们了)。今天涨了几个用户?广告收益能不能多买一杯奶茶?这些热乎乎的“战绩”,通通告诉你们!

我承诺,每天更新营运状况,实话实说:流量主是发家致富的捷径,还是“赚够奶茶钱就谢天谢地”?小程序功能也会不断优化升级,毕竟要让这16位小伙伴用得爽,才有希望吸引更多用户加入。

接下来的开发计划已经排满了档期!不仅要优化现有功能,还打算增加更多实用性强、能留住用户的新功能,比如文档转换啊、在线工具类的小工具,要知道,16个用户那可是我未来的“财富基石”,必须得服务到位!

文档转化用了什么技术?主角就是大名鼎鼎的 docx4j,这玩意儿就是处理文档的“瑞士军刀”,专门帮你在各种文档格式之间左手倒右手,效率杠杠的!

docx4j 的核心能力在于,它能够高效解析和生成 .docx 文件,无需安装 Microsoft Office,也不依赖 COM 组件。通过 XML 和 JAXB 技术,docx4j 将文档的结构和内容转换为可操作的对象,开发者可以轻松修改、删除或添加文档内容,比如表格、段落、图片等。

除了基本的文档处理功能,docx4j 的强大之处还在于其转换能力。例如,docx 转 PDF 是一个备受青睐的功能。借助 docx4j 的 PDF 导出模块,它能够快速将 Word 文档渲染成高质量的 PDF 文件,广泛应用于合同生成、报告输出等场景。此外,它还能通过插件支持其他格式的转换,扩展性非常强。

对于开发者来说,docx4j 提供了友好的 API 接口和灵活的功能模块。无论是简单的文档读取,还是复杂的内容操作,它都能轻松驾驭。其社区活跃,文档齐全,为开发者的二次开发和快速实现功能提供了极大的便利。

依赖如下

        <dependency>
            <groupId>org.docx4j</groupId>
            <artifactId>docx4j</artifactId>
            <version>6.1.1</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-reload4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.docx4j</groupId>
            <artifactId>docx4j-export-fo</artifactId>
            <version>8.1.1</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-reload4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

关键代码实现类
 

private byte[] convertWordToPdf(String filePath) throws Exception {
        FileOutputStream fileOutputStream = null;
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        try {
            // 获取当前时间戳
            String timestamp = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());

            // 获取文件名(去掉路径和扩展名)
            File file = new File(filePath);
            String fileName = file.getName().replaceAll("\\.docx$", "");

            // 创建带时间戳的pdf路径,文件保存到fileDir目录下
            String pdfPath = fileDir + fileName + "_" + timestamp + ".pdf";

            // 进行文件转换
            fileOutputStream = new FileOutputStream(new File(pdfPath));
            WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(file);
            setFontMapper(mlPackage);
            Docx4J.toPDF(mlPackage, fileOutputStream);

            System.out.println("PDF转换成功,文件保存为:" + pdfPath);

            // 读取生成的PDF文件内容并返回字节数组
            try (InputStream pdfInputStream = new FileInputStream(pdfPath)) {
                byte[] buffer = new byte[1024];
                int bytesRead;
                while ((bytesRead = pdfInputStream.read(buffer)) != -1) {
                    byteArrayOutputStream.write(buffer, 0, bytesRead);
                }
            }

            return byteArrayOutputStream.toByteArray();
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("转换失败");
            throw new UnsupportedOperationException("Word 转 PDF 的功能尚未实现: " + filePath);
        } finally {
            IOUtils.closeQuietly(fileOutputStream);
            try {
                byteArrayOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private static void setFontMapper(WordprocessingMLPackage mlPackage) throws Exception {
        Mapper fontMapper = new IdentityPlusMapper();
        fontMapper.put("隶书", PhysicalFonts.get("LiSu"));
        fontMapper.put("宋体", PhysicalFonts.get("SimSun"));
        fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei"));
        fontMapper.put("黑体", PhysicalFonts.get("SimHei"));
        fontMapper.put("楷体", PhysicalFonts.get("KaiTi"));
        fontMapper.put("新宋体", PhysicalFonts.get("NSimSun"));
        fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai"));
        fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong"));
        fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB"));
        fontMapper.put("仿宋", PhysicalFonts.get("FangSong"));
        fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312"));
        fontMapper.put("幼圆", PhysicalFonts.get("YouYuan"));
        fontMapper.put("华文宋体", PhysicalFonts.get("STSong"));
        fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong"));

        mlPackage.setFontMapper(fontMapper);
    }


http://www.kler.cn/a/456613.html

相关文章:

  • 【YashanDB知识库】sys登录提示账户被锁,怎么处理?
  • MySQL语句学习第二篇_数据库
  • 【YashanDB知识库】启动yasom时报错:sqlite connection error
  • 点进CSS选择器
  • 基于 `android.accessibilityservice` 的 Android 无障碍服务深度解析
  • redis开发与运维-redis0401-补充-redis流水线与Jedis执行流水线
  • CBSD管理QEMU仿真虚拟机
  • 穷举vs暴搜vs深搜vs回溯vs剪枝系列一>组合
  • 高效搭建Nacos:实现微服务的服务注册与配置中心
  • 字符串函数和结构题内存对齐
  • 虚幻引擎结构之ULevel
  • 小程序配置文件 —— 14 全局配置 - tabbar配置
  • 深度学习笔记(5)——目标检测和图像分割
  • 前端进阶之副作用的分析和控制
  • 微服务-1 认识微服务
  • 用命令行重启资源管理器(记录win解决找不到资源管理器问题)
  • 【 Git 设置代理】
  • upload-labs关卡记录8
  • Java基于SpringBoot的社区团购系统的设计与实现,附源码
  • Clickhouse使用基础
  • 【可靠有效】springboot使用netty搭建TCP服务器
  • 【达梦数据库】达梦数据库windows安装
  • Mask R-CNN
  • WPF TextBox 输入限制 详解
  • OpenWrt 系统UCI详解(Lua、C语言调用uci接口实例)
  • Cocos Creator 3.8.5 正式发布,更小更快更多平台!