POI word 转 Pdf

本文介绍了一种使用Apache POI库将Word文档转换为PDF的方法,并在转换过程中替换Word文档中的特定文本。代码示例展示了如何读取.docx文件,替换其中的变量,处理中文字体,并最终将修改后的文档转换为PDF格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.代码比较简单,本人踩的坑是 在转换的时候 报空指针 :先写错误:Numbering ,在写代码

org.apache.poi.xwpf.converter.core.XWPFConverterException: java.lang.NullPointerException
    at org.apache.poi.xwpf.converter.pdf.PdfConverter.doConvert(PdfConverter.java:59)
    at org.apache.poi.xwpf.converter.pdf.PdfConverter.doConvert(PdfConverter.java:37)
    at org.apache.poi.xwpf.converter.core.AbstractXWPFConverter.convert(AbstractXWPFConverter.java:45)
    at com.ys.test.WordToPdf.wordConverterToPdf(WordToPdf.java:85)
    at com.ys.test.WordToPdf.main(WordToPdf.java:116)
Caused by: java.lang.NullPointerException
    at org.apache.poi.xwpf.converter.core.XWPFDocumentVisitor.getXWPFNum(XWPFDocumentVisitor.java:468)
    at org.apache.poi.xwpf.converter.core.XWPFDocumentVisitor.getNumPr(XWPFDocumentVisitor.java:335)
    at org.apache.poi.xwpf.converter.core.XWPFDocumentVisitor.visitParagraph(XWPFDocumentVisitor.java:280)
    at org.apache.poi.xwpf.converter.core.XWPFDocumentVisitor.visitBodyElements(XWPFDocumentVisitor.java:242)
    at org.apache.poi.xwpf.converter.core.XWPFDocumentVisitor.start(XWPFDocumentVisitor.java:194)
    at org.apache.poi.xwpf.converter.pdf.PdfConverter.doConvert(PdfConverter.java:55)
    ... 4 more

问题产生的原因:word 有问题(我用的是自己用poi合成的word,后面解决了:链接

 

2.代码功能:word转pdf,转换同时可以替换word中的文本(参考链接:没找到了,嘿嘿嘿~~~·)

 /**
     * 将word文档, 转换成pdf, 中间替换掉变量
     * 
     * @param source
     *            源为word文档, 必须为docx文档
     * @param target
     *            目标输出
     * @param params
     *            需要替换的变量
     * @throws Exception
     */
    public static void wordConverterToPdf(InputStream source, OutputStream target, Map<String, String> params)
            throws Exception {
        wordConverterToPdf(source, target, null, params);
    }

    /**
     * 将word文档, 转换成pdf, 中间替换掉变量
     * 
     * @param source
     *            源为word文档, 必须为docx文档
     * @param target
     *            目标输出
     * @param params
     *            需要替换的变量
     * @param options
     *            PdfOptions.create().fontEncoding( "windows-1250" ) 或者其他
     * @throws Exception
     */
    public static void wordConverterToPdf(InputStream source, OutputStream target, PdfOptions options,
            Map<String, String> params) throws Exception {
        XWPFDocument doc = new XWPFDocument(source);
        paragraphReplace(doc.getParagraphs(), params);
        for (XWPFTable table : doc.getTables()) {
            for (XWPFTableRow row : table.getRows()) {
                for (XWPFTableCell cell : row.getTableCells()) {
                    paragraphReplace(cell.getParagraphs(), params);
                }
            }
        }
        // 中文字体处理
        options.fontProvider(new IFontProvider() {
            public Font getFont(String familyName, String encoding, float size, int style, Color color) {
                try {
                    BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
                    Font fontChinese = new Font(bfChinese, size, style, color);
                    if (familyName != null)
                        fontChinese.setFamily(familyName);
                    return fontChinese;
                } catch (Exception e) {
                    e.printStackTrace();
                    return null;
                }
            }

        });
        PdfConverter.getInstance().convert(doc, target, options);
    }

    /** 替换段落中内容 */
    private static void paragraphReplace(List<XWPFParagraph> paragraphs, Map<String, String> params) {
        if (params != null && !params.isEmpty()) {
            for (XWPFParagraph p : paragraphs) {
                for (XWPFRun r : p.getRuns()) {
                    String content = r.getText(r.getTextPosition());
                    if (StringUtils.isNotEmpty(content) && params.containsKey(content)) {

                        r.setText(content.replace("keyword", params.get(content)), 0);
                    }
                }
            }
        }
    }

<think>好的,用户想用Apache POIWord文档换为PDF。我需要根据他们提供的引用内容来整理步骤。首先,用户提到了引用[1]中的依赖项,包括poi-ooxml和xdocreport的换器。同时,引用[2]提到了版本兼容的问题,需要排除某些包。 我应该先确认所需的Maven依赖,确保版本正确。然后,用户可能需要代码示例,这部分在引用[1]里有,但需要检查是否有版本冲突。比如,xdocreport的版本可能需要调整,或者排除冲突的模块。 另外,用户可能遇到的问题包括依赖冲突,特别是poi的不同版本之间的兼容性。引用[2]提到使用1.0.6版本的换器,并且排除了core模块,这可能是因为与较新的POI版本不兼容。所以,在依赖配置时需要注意这一点。 还有,用户可能需要处理不同格式的Word文档,比如doc和docx。不过POI主要支持docx,所以需要提醒用户这一点。此外,生成的PDF可能存在样式问题,特别是复杂格式,需要测试和调整。 最后,用户可能需要相关的优化方法或常见问题解答,比如如何处理大文件或性能问题。虽然引用中没有提到,但根据常见经验,可以建议分块处理或使用缓存。</think>### 使用Apache POI实现WordPDF步骤详解 #### 1. 环境准备(Maven项目) ```xml <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.3</version> <!-- 推荐较新稳定版 --> </dependency> <dependency> <groupId>fr.opensagres.xdocreport</groupId> <artifactId>org.apache.poi.xwpf.converter.pdf</artifactId> <version>2.0.4</version> <!-- 必须排除冲突模块 --> <exclusions> <exclusion> <groupId>fr.opensagres.xdocreport</groupId> <artifactId>org.apache.poi.xwpf.converter.core</artifactId> </exclusion> </exclusions> </dependency> ``` *注意:版本选择需确保与POI兼容,高版本换器支持更多格式特性[^2]* #### 2. 核心换代码 ```java import org.apache.poi.xwpf.converter.pdf.PdfConverter; import org.apache.poi.xwpf.usermodel.XWPFDocument; public class WordToPdf { public static void convert(String inputPath, String outputPath) throws Exception { try (FileInputStream fis = new FileInputStream(inputPath); XWPFDocument document = new XWPFDocument(fis); FileOutputStream fos = new FileOutputStream(outputPath)) { PdfConverter.getInstance().convert(document, fos, null); } } } ``` #### 3. 重要注意事项 1. **格式支持**: - 仅支持`.docx`格式(POI不直接支持旧版`.doc`) - 复杂排版可能丢失:数学公式、特殊字体需额外处理 2. **性能优化**: ```java PdfOptions options = PdfOptions.create(); options.fontProvider(new DefaultFontProvider(true, true, true)); ``` 通过字体注册可改善中文乱码问题 3. **异常处理**: - 捕获`InvalidFormatException`处理文件损坏情况 - 使用try-with-resources确保流关闭 #### 4. 扩展方案对比 | 方案 | 优点 | 局限性 | |---------------------|-----------------------|------------------------| | POI原生换 | 无需外部依赖 | 复杂格式支持有限 | | Aspose.Words | 完美格式保持 | 商业授权费用高 | | LibreOffice CLI | 支持批量处理 | 需要安装桌面环境 |
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值