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

如何从中提取图像。DOCX使用DocumentFormat。OpenXml。段落

商鸿哲
2023-03-14

我需要从DOCX文件中提取文本和图像到文本文件(当然,将图像保存为图形文件)。使用下面的代码如何获取图像并将其保存为文本文件中的引用?

如果我使用:

List<ImagePart> imgPart = wordProcessingDoc.MainDocumentPart.ImageParts.ToList();

我可以得到所有的图像,但有时一个图像被用在几个地方。我找不到从列表中获取特定图像的参考。以下是取自(从DOCX提取表)的示例代码:

public static string ReadAllTextFromDocx(FileInfo fileInfo)
{
    StringBuilder stringBuilder;
    using (WordprocessingDocument wordprocessingDocument = WordprocessingDocument.Open(fileInfo.FullName, false))
    {
        NameTable nameTable = new NameTable();
        XmlNamespaceManager xmlNamespaceManager = new XmlNamespaceManager(nameTable);
        xmlNamespaceManager.AddNamespace("w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main");

        string wordprocessingDocumentText;
        using (StreamReader streamReader = new StreamReader(wordprocessingDocument.MainDocumentPart.GetStream()))
        {
            wordprocessingDocumentText = streamReader.ReadToEnd();
        }

        stringBuilder = new StringBuilder(wordprocessingDocumentText.Length);

        XmlDocument xmlDocument = new XmlDocument(nameTable);
        xmlDocument.LoadXml(wordprocessingDocumentText);

        XmlNodeList paragraphNodes = xmlDocument.SelectNodes("//w:p", xmlNamespaceManager);
        foreach (XmlNode paragraphNode in paragraphNodes)
        {
            XmlNodeList textNodes = paragraphNode.SelectNodes(".//w:t | .//w:tab | .//w:br | .//w:drawing", xmlNamespaceManager);
            foreach (XmlNode textNode in textNodes)
            {
                switch (textNode.Name)
                {
                    case "w:t":
                        stringBuilder.Append(textNode.InnerText);
                        break;

                    case "w:tab":
                        stringBuilder.Append("\t");
                        break;

                    case "w:br":
                        stringBuilder.Append("\v");
                        break;
                    case "w:drawing":
                        stringBuilder.Append("----------------IMAGE HERE-------------");
                        break;
                }
            }

            stringBuilder.Append(Environment.NewLine);
        }
    }

    return stringBuilder.ToString();
}

共有2个答案

傅长恨
2023-03-14

您可以使用从ImagePart获取图像流。

var images = from graphic in paragraph
                .Descendants<DocumentFormat.OpenXml.Drawing.Graphic>()
            let graphicData = graphic.Descendants<DocumentFormat.OpenXml.Drawing.GraphicData>().FirstOrDefault()
            let pic = graphicData.ElementAt(0)
            let nvPicPrt = pic.ElementAt(0).FirstOrDefault()
            let blip = pic.Descendants<DocumentFormat.OpenXml.Drawing.Blip>().FirstOrDefault()
            join part in WordprocessingDocument.MainDocumentPart.Parts on blip.Embed.Value equals part
                .RelationshipId
            let image = part.OpenXmlPart as ImagePart
            select new
            {
                Id = blip.Embed,
                fileStream = image.GetStream()
            } ;
居琛
2023-03-14

我在这篇文章中找到了答案:使用OpenXML替换word文档中的图像

var imageParts =from graphic in par.Descendants<DocumentFormat.OpenXml.Drawing.Graphic>()
let graphicData = graphic.Descendants<DocumentFormat.OpenXml.Drawing.GraphicData>().FirstOrDefault()
                               let pic = graphicData.ElementAt(0)
                               let nvPicPrt = pic.ElementAt(0).FirstOrDefault()
                               let blip = pic.Descendants<DocumentFormat.OpenXml.Drawing.Blip>().FirstOrDefault()
                               select new
                               {
                                   Id = blip.GetAttribute("embed", xr).Value,
                                   Filename = nvPicPrt.GetAttribute("name", xpic).Value
                               };
 类似资料:
  • 我正在开发一个程序,需要从MS Word文档中提取两个图像,以便在另一个文档中使用它们。我知道图像的位置(文档中的第一个表),但当我试图从表中提取任何信息(即使只是纯文本)时,我会得到空单元格。 这是我想从中提取图像的Word文档。我想从第一页(第一个表,第0行和第1行,第2列)中提取“Rentel”图像。 我尝试了以下代码: 这只会给我空话。。。 我已经读过这篇讨论和这篇文章,问题可能是“包含在

  • 我试图从docx中提取文本:tika-app做得很好,但当我试图在代码中做同样的事情时,结果是什么也没有,tika解析器说我的docx文件的内容类型是“application/zip”。 我该怎么办?我应该使用递归方法(像这样)还是有其他方法? java.lang.noClassDefFounderRor:org/apache/poi/openXML4j/exceptions/invalidFor

  • 使用OpenXML(C#)解析*. docx文档有一个问题。 下面是我的步骤: 1。加载*。docx文档 2。接收段落列表 3。在每个段落中查找文本、图像和表格元素 4。为每个文本和图像元素创建html标记 5。将输出另存为*。html文件 我已经了解了如何在文档中定位图像文件并将其解压缩。现在有一个步骤要做——找到表格在文本(段落)中的位置。 如果有人知道如何在*中定位表。docx文档使用Ope

  • 问题内容: 我知道那里也有类似的问题,但是我找不到能回答我的祷告的东西。我需要的是一种从MS-Word文件访问某些数据并将其保存在XML文件中的方法。在python- docx 上阅读无济于事,因为它似乎只允许一个人写入Word文档,而不是阅读。要准确呈现我的任务(或我选择如何执行任务的方式):我想在文档中搜索关键字或短语(文档包含表格),并从关键字/短语所在的表格中提取文本数据找到了。有人有什么

  • 我想使用java netbeans从pdf中的按钮中获取图像图标,并将其放在某个面板中。然而,我在这里打了一块砖头。我正在使用PDFBox作为我的PDF导出器,我似乎无法理解。我已经成功地从表单字段读取,但是只要我尝试在PDFBox中找到它,就没有按钮提取器。我应该如何制作它?是否可以使用此方法,或者是否有其他方法。提前致谢。 编辑:我已经发现使用使用此代码的示例实用程序的提取时间: 但是我仍然无

  • 问题内容: 我需要从服务器上的PDF文件中提取所有图像。我不想要PDF页面,只想要原始尺寸和分辨率的图像。 如何使用Perl,PHP或任何其他基于UNIX的应用程序(我将使用PHP的exec函数调用它)来做到这一点? 问题答案: pdfimages就是这样做的。它是poppler- utils和xpdf-utils软件包的一部分。 从联机帮助页: Pdfimages将可移植文档格式(PDF)文件中