将一个单词doc合并到另一个单词doc时,图像不可见

时间:2018-02-21 06:27:34

标签: java groovy apache-poi docx4j

我正在尝试合并两个docx文档,并成功实现了我的大多数用例。我能够成功合并文本和表格,但是如果docx文件中有图像,它会显示占位符,但不会显示图像本身。 这是我的代码片段供参考:

def document
Integer i
Integer j

void mergeDocx(FileInputStream test1, FileInputStream test2, FileOutputStream dest) {
    i = 0
    j = 0
    XWPFDocument doc1 = new XWPFDocument(test1)
    XWPFDocument doc2 = new XWPFDocument(test2)
    document = new XWPFDocument()
    parseElement(doc1)
    parseElement(doc2)
    parseStyle(doc1, doc2)
    OutputStream out = dest
    document.write(out)
    out.close()
}

这是我用

开始的parseElement(XWPFDocument doc)的基本版本
void parseElement(XWPFDocument doc) {
    for (IBodyElement e : doc.getBodyElements()) {
        if (e instanceof XWPFParagraph) {
            XWPFParagraph p = (XWPFParagraph) e
            if (p.runs.embeddedPictures.flatten()) {
                p.runs.each { r ->
                    r.embeddedPictures.each { pic ->
                        document.addPictureData(pic.pictureData.data, pic.pictureData.pictureType)
                    }
                }
            } else {
                if (p.getCTP().getPPr() != null && p.getCTP().getPPr().getSectPr() != null) {
                    continue
                } else {
                    document.createParagraph()
                    document.setParagraph(p, i)
                    i++
                }
            }
        } else if (e instanceof XWPFTable) {
            XWPFTable t = (XWPFTable) e
            document.createTable()
            document.setTable(j, t)
            j++
        }
    }
}

这是我使用的parseElement(XWPFDocument doc)的备用版本

void parseElement(XWPFDocument doc) {
    for (IBodyElement e : doc.getBodyElements()) {
        if (e instanceof XWPFParagraph) {
            XWPFParagraph p = (XWPFParagraph) e
            if (p.runs.embeddedPictures.flatten()) {
                p.runs.each { r ->
                    r.embeddedPictures.each { pic ->
                        XWPFParagraph title = document.createParagraph()
                        XWPFRun run = title.createRun()
                        run.setText("Fig.1 A Natural Scene")
                        run.setBold(true)
                        title.setAlignment(ParagraphAlignment.CENTER)
                        run.addBreak()
                        run.addPicture(new ByteArrayInputStream(pic.pictureData.data), XWPFDocument.PICTURE_TYPE_JPEG, pic.pictureData.fileName, Units.toEMU(200), Units.toEMU(200))
                    }
                }
            } else {
                if (p.getCTP().getPPr() != null && p.getCTP().getPPr().getSectPr() != null) {
                    continue
                } else {
                    document.createParagraph()
                    document.setParagraph(p, i)
                    i++
                }
            }
        } else if (e instanceof XWPFTable) {
            XWPFTable t = (XWPFTable) e
            document.createTable()
            document.setTable(j, t)
            j++
        }
    }
}

这里的问题是,无论何时遇到图像,它都会将其视为段落的一个实例,然后它会尝试setParagraph()我知道我不应该在这里使用图像。

这是我在docx之后的单词docx的样子 Here is how my word docx looks like after merge 我正在使用ApachePOI,但我也对使用docx4j的解决方案持开放态度。任何指导将不胜感激。

P.S:编程语言很常见。

1 个答案:

答案 0 :(得分:0)

parseElement()方法更新为此对我有用:

void parseElement(XWPFDocument doc) {
    for (IBodyElement e : doc.getBodyElements()) {
        if (e instanceof XWPFParagraph) {
            XWPFParagraph p = (XWPFParagraph) e
            if (p.runs.embeddedPictures.flatten()) {
                p.runs.each { r ->
                    r.embeddedPictures.each { pic ->
                        XWPFParagraph p1 = document.createParagraph()
                        XWPFRun r1 = p1.createRun()
                        int width = pic.getCTPicture().getSpPr().getXfrm().getExt().getCx() as int
                        int height = pic.getCTPicture().getSpPr().getXfrm().getExt().getCy() as int
                        int imgFormat1 = getImageFormat(pic.pictureData.fileName)
                        r1.addPicture(new ByteArrayInputStream(pic.pictureData.data), imgFormat1, pic.pictureData.fileName, width, height)
                        i++
                    }
                }
            } else {
                if (p.getCTP().getPPr() != null && p.getCTP().getPPr().getSectPr() != null) {
                    continue
                } else {
                    document.createParagraph()
                    document.setParagraph(p, i)
                    i++
                }
            }
        } else if (e instanceof XWPFTable) {
            XWPFTable t = (XWPFTable) e
            document.createTable()
            document.setTable(j, t)
            j++
        }
    }
}

每当我在段落中遇到图像时,我遗漏的一件事是i++