poi中word中表格跨列合并以及不兼容wps问题,java下 linux下word转pdf 问题解决

   最近需要在word中绘制表格,绘制完成后发现 wps不支持poi的跨列合并,百度没有找到好的解决办法。自己在office中把文档转换为doc格式之后发现wps可以正常显示word中的表格了,同时之前微信预览不到表格的问题也解决了。

poi版本为3.17 以下是跨列以及跨行合并代码 之前网上搜到的 忘记原作者是哪位大佬了

maven

        <!--poi 用于操作word-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.14</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>3.14</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.14</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>3.14</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>ooxml-schemas</artifactId>
            <version>1.3</version>
        </dependency>
    // word跨列合并单元格
    public void mergeCellsHorizontal(XWPFTable table, int row, int fromCell, int toCell) {
        for (int cellIndex = fromCell; cellIndex <= toCell; cellIndex++) {
            XWPFTableCell cell = table.getRow(row).getCell(cellIndex);
            if (cellIndex == fromCell) {
                // The first merged cell is set with RESTART merge value
                cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
            } else {
                // Cells which join (merge) the first one, are set with CONTINUE
                cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
            }
        }
    }

    // word跨行并单元格
    public void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) {
        for (int rowIndex = fromRow; rowIndex <= toRow; rowIndex++) {
            XWPFTableCell cell = table.getRow(rowIndex).getCell(col);
            if (rowIndex == fromRow) {
                // The first merged cell is set with RESTART merge value
                cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
            } else {
                // Cells which join (merge) the first one, are set with CONTINUE
                cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
            }
        }
    }

   docx转doc用的是aspose-words-jdk16.jar   这个jar包全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF,EPUB, XPS, SWF 相互转换 且linux和windiws下均可使用。效率也很高。比之前使用的jacob要好用很多,以下是调用方法十分简单

    /**
     * word转pdf 需引入 aspose-words-16.4.0-jdk16.jar包  收费插件windows linux下均可用
     *
     * @param inPath  源文件路径
     * @param outPath 输出文件路径
     */
    public static void docx2pdf(String inPath, String outPath) {
        //不用进行验证
        /*
        if (!getLicense()) { // 验证License 若不验证则转化出的pdf文档会有水印产生
            return;
        }*/

        try {
            File file = new File(outPath); // 新建一个空白pdf文档
            FileOutputStream os = new FileOutputStream(file);
            com.aspose.words.Document doc = new com.aspose.words.Document(inPath); // Address是将要被转化的word文档
            doc.save(os, SaveFormat.PDF);// 全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF,EPUB, XPS, SWF 相互转换
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * docx转doc 需引入 aspose-words-16.4.0-jdk16.jar包  收费插件windows linux下均可用
     *
     * wps不兼容docx的表格跨列合并,微信文件预览不支持docx下的表格
     * 转换为doc格式的可以被wps兼容 微信可预览表格
     *
     * @param inPath  源文件路径
     * @param outPath 输出文件路径
     */
    public static void docx2doc(String inPath, String outPath) {
        try {
            File file = new File(outPath); // 新建一个空白pdf文档
            FileOutputStream os = new FileOutputStream(file);
            com.aspose.words.Document doc = new com.aspose.words.Document(inPath); // Address是将要被转化的word文档
            doc.save(os, SaveFormat.DOC);// 全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF,EPUB, XPS, SWF 相互转换
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

这个是aspose的下载地址 破解版本 转换之后没有发现水印 下载后放至maven对应目录下 或者直接把jar包放入工程内

aspose下载地址

        <!-- word转pdf插件包 破解版 此包需要手动导入至maven仓库 -->
        <dependency>
            <groupId>com.aspose.words</groupId>
            <artifactId>aspose-words-jdk16</artifactId>
        </dependency>

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,将 PDF Word 有很多种方法,这里介绍使用 Apache POI 和 iText 来实现。POI 提供了对 Word 文档的操作,而 iText 可以解析 PDF 文件,并提供了一些字体处理的功能。下面是一个简单的示例代码,可以将 PDF Word解决文乱码问题: ``` import java.awt.Color; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFRun; import com.itextpdf.text.Document; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.parser.PdfTextExtractor; import com.itextpdf.text.pdf.parser.SimpleTextExtractionStrategy; public class PdfToWordConverter { public static void main(String[] args) throws Exception { // 1. 读取 PDF 文件 PdfReader reader = new PdfReader(new FileInputStream(new File("input.pdf"))); // 2. 获取 PDF 文件的文本 StringBuilder sb = new StringBuilder(); for (int i = 1; i <= reader.getNumberOfPages(); i++) { String text = PdfTextExtractor.getTextFromPage(reader, i, new SimpleTextExtractionStrategy()); sb.append(text); } reader.close(); // 3. 将文本写入 Word 文件 XWPFDocument document = new XWPFDocument(); XWPFParagraph paragraph = document.createParagraph(); XWPFRun run = paragraph.createRun(); run.setText(sb.toString()); run.setColor(Color.BLACK); // 4. 保存 Word 文件 FileOutputStream out = new FileOutputStream(new File("output.docx")); document.write(out); out.close(); document.close(); } } ``` 在上面的示例代码,我们首先使用 iText 读取 PDF 文件,并获取 PDF 文件的文本。然后使用 POI 创建一个新的 Word 文档,将文本写入 Word 文件,并设置文本颜色。最后将 Word 文件保存到本地磁盘上。 需要注意的是,上面的代码只能处理纯文本的 PDF 文件,并且对于一些特殊的字体或字符,可能仍然会出现乱码问题。如果需要处理 PDF 的图片或表格,可以使用其他的 PDF Word 工具。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值