当前位置: 首页 > 知识库问答 >
问题:

XWPF文档中缺少嵌入的图片

东门清夷
2023-03-14

我有一个问题'XWPF文档'。程序的一部分获取docx文件,并将其中的所有内容复制到一个输出docx文件中。包括文字、表格、图片和公式。我在这方面有一个很好的结果,但是最近我有一个错误:一张图片没有复制到结果中。这是源代码,这是结果。结果你可以看到“3.1.6.2”部分的哪些图像被成功复制,但是不在“3.1.6.1”。

我是这样做的:

for (XWPFRun run : oldParagraph.getRuns()) {

        XWPFRun newRun = newParagraph.createRun()

        if (run.getText(0) != null && !run.getText(0).isEmpty()) {
            .... copy text ....
        }
        if (run.getEmbeddedPictures() != null && run.getEmbeddedPictures().size() > 0) {
            for (XWPFPicture pic : run.getEmbeddedPictures()) {

                byte[] img = pic.getPictureData().getData()
                long cx = pic.getCTPicture().getSpPr().getXfrm().getExt().getCx()
                long cy = pic.getCTPicture().getSpPr().getXfrm().getExt().getCy()
                int pictureType = pic.getPictureData().getPictureType()

                XWPFDocument document = newParagraph.getDocument()

                String blipId = document.addPictureData(new ByteArrayInputStream(img), pictureType)
                createPictureCxCy(document, blipId, document.getNextPicNameNumber(pictureType), cx, cy)
            }
        }
    }

这里的关键是:

 for (XWPFPicture pic : run.getEmbeddedPictures())

我从'运行'得到嵌入的图片。在坏的文件中,我有5个段落,每个里面有1个运行,其中4个有文本,1个是空的。通常,正是这个空的“运行”嵌入了图片,根据顺序判断图片应该在这里。现在它空了。但是在XWPF文档中,此图片存在于图片和包图片列表中。

问题:此列表包含“XWPFPictureData”对象,这些对象不包含有关文档和图片比例中位置的信息。但是“快跑”。getEmbeddedPictures()包含“XWPFPicture”-我们需要什么。有办法摆脱这种局面吗?

更新第一条评论。

我检查:

        for(XWPFParagraph paragraph: document.getParagraphs()) {
            for (XWPFRun run : paragraph.getRuns()) {
                println "run text: " + run.getText(0)
                println "embedded picture count: " + run.getEmbeddedPictures().size()
            }
        }
        println "*** for document picture count: " + document.allPictures.size()

结果是:

run text:      3.1.6.1 В ряде районов сейсмические нагрузки  на СПБУ ...
embedded picture count: 0
run text:      Интегральное сейсмическое воздействие на  СПБУ ...
embedded picture count: 0
run text: null
embedded picture count: 0
run text:  Рис. 3.1.6.1 Обообщенный коэффициент динамичности: ...
embedded picture count: 0
run text:      Р01 — низшая частота горизонтальных колебаний
embedded picture count: 0
*** for document picture count: 4

我不知道为什么照片数是4。第二,关于锚。我没有找到它。此外,我没有找到它和其他文件-正确的文件。在一篇文章中,我读到:“对象可以以两种方式放置在文档中:内联或浮动。”只有漂浮的物体才有锚。

共有1个答案

颜霖
2023-03-14

文档中包含的不是一个简单的图片,而是一个绘图画布,如将绘图添加到文档中所述。

此绘图画布包含两张相互对齐的图片。

Word中打开后,您可以看到这一点,因为您可以在那里选择三个对象。画布和其中的两幅图片:

此绘图画布在文档中表示。xmlAlternateContent元素中:

<mc:AlternateContent>
 <mc:Choice Requires="wpg">
  <w:drawing>
   <wp:inline distT="0" distB="0" distL="0" distR="0">
    ...
   </wp:inline>
  </w:drawing>
 </mc:Choice>
 <mc:Fallback>
  <w:pict>
   ...
  </w:pict>
 </mc:Fallback>
</mc:AlternateContent>

apachepoi无法解释此XML。至少到现在为止。

可以编写自己的方法来解释这个XML。但这将是一项更大的任务。

如果没有太多的文件,你可以做的最好的是打开*. docx使用Word,选择并剪切整个画布到剪贴板,然后粘贴回JPEG图片使用特殊粘贴。然后再次保存*. docx

或者从文档中获取两张图片。但是它们有两个,因为AlternateContent元素提供了一个回退元素,该元素将画布内容再次作为Base64编码的ZIP存档,并且再次具有图片引用。这就是为什么文档图片计数的***:4

只需解压缩*。docx存档并查看/word/document。xml来查看此信息。

 类似资料:
  • 你知道有没有办法在段落完整填充文档(XWPFDocument)中插入段落(XWPFParagraph)?。 有一种方法可以将文档中已经存在的段落“更改”为另一个段落(XWPFDocument.setparagration()),但我不知道如何将新段落插入文档中的特定位置,而不是在XWPFDocument的末尾。创建段落()。

  • 我想让(start)中的文本成为文档中另一个具体(end)的超链接。我发现了一个在中制作超链接的代码,但它不起作用(启动链接开始):

  • 有人知道谷歌电子表格嵌入URL参数是否有任何官方文档吗? 也就是说,给定一个来自Google表单的嵌入URL,如下所示:https://docs.google.com/a/aicr.org/spreadsheet/pub?key=0AhExuVBhVYT1dGxxejBmUHAzYUhGb25veTRkdW1YekE 争论是做什么的? 还有哪些参数是默认情况下不包括的? 经过大量的挖掘和寻找,我发

  • 提前感谢。 我只是遵循数字海洋的教程:https://www.digitalocean.com/community/tutorials/how-to-set-up-apache-virtual-hosts-on-ubuntu-14-04-lts。我完成了所有说明,但是当我开始测试配置并从我的停车域添加 A 记录时,假设 example.com,我的数字海洋 vps 地址是 192.168.10.2

  • 我在 rest 控制器中有两个 get 映射,一个具有必需的请求参数(项目 ID),一个没有具有相同路径的请求参数。 此外,在项目中设置一个带有UI的基本Swagger。起初,从我之前描述的2 get映射中,有一个是随机丢失的,然后我用swagger注释正确注释它们,但现在不带参数的get不断丢失。 有没有办法强制昂首阔步既得图又得图? 更新:是的,路径变量可以是一个很好的解决方案,但由于遗留的原

  • 问题内容: 在Mongoose文档中的以下地址:http : //mongoosejs.com/docs/embedded- documents.html 有一条声明: DocumentArrays具有一个特殊的方法ID,该ID通过其_id属性(每个嵌入式文档获取一个)来过滤嵌入式文档: 考虑以下代码段: 我的问题是: 文档是否正确?如果是这样,那么我如何找出“ my_id”是什么(在示例中),以