请问一个文档中包含的附件信息怎么获取

请问一个文档中包含了另一个附件文档,怎么获取它?

@ouchli 嵌入的 OLE 对象在 Aspose.Words 文档对象模型中表示为形状。 您可以使用 Shape.OleFormat 属性访问它们的属性。 请参阅我们的文档以了解如何使用 Aspose.Words 处理 OLE 对象:
https://docs.aspose.com/words/java/working-with-ole-objects/

Document doc = new Document("D:\\Users\\00306664\\Desktop\\开发工作\\aspose\\temp\\里面有附件.docx");
for (Shape s : (Iterable<Shape>)doc.getChildNodes(NodeType.SHAPE, true))
{
    OleFormat oleFormat = s.getOleFormat();
    if (Objects.nonNull(oleFormat))
    {
        byte[] rawData = oleFormat.getRawData();
        Document doc2 = new Document(new ByteArrayInputStream(rawData));
        NodeCollection<Paragraph> childNodes = doc2.getChildNodes(NodeType.PARAGRAPH, true);
        Node node = childNodes.get(0);
        String text = node.getText();
        System.out.println("成功");

    }
}

使用上面的代码获取的附件文档信息不对,请问代码有什么问题?

@ouchli 代码看起来不错。 您能否在此处附上您的输入文档进行测试并描述您遇到的问题? 我们将检查该问题并为您提供更多信息。

里面有附件.docx (45.1 KB)

你好这是我的输入文档

for (Shape s : (Iterable<Shape>)doc.getChildNodes(NodeType.SHAPE, true))
{
    OleFormat oleFormat = s.getOleFormat();
    if (Objects.nonNull(oleFormat))
    {
        byte[] rawData = oleFormat.getRawData();
        Document doc2 = new Document(new ByteArrayInputStream(rawData));
        NodeCollection<Paragraph> childNodes = doc2.getChildNodes(NodeType.PARAGRAPH, true);
        for (Paragraph childNode : childNodes)
        {
            System.out.println(childNode.getText());
        }
    }
}

这段代码打印的结果是乱码

@ouchli 如果您需要提取 OLE 对象,您应该使用OleFormat.save方法而不是OleFormat.getRawData。 请像这样修改您的代码:

ByteArrayOutputStream tmpStream = new ByteArrayOutputStream();
oleFormat.save(tmpStream);
Document doc2 = new Document(new ByteArrayInputStream(tmpStream.toByteArray()));

谢谢,那我想要获取 文档里面的附件名称,怎么获取呢

@ouchli OLE 对象可以提供建议的文件名和扩展名,我们可以在将对象的内容保存到本地文件系统中的文件中时使用它们。 如果建议的文件名可用于 OLE 对象,您可以使用oleFormat.getSuggestedFileName()获取。 在您的特定情况下,没有建议的文件名,因此您应该使用建议的扩展名和一些随机文件名自行构建它。您可以使用 OleFormat.getSuggestedExtension() 属性获取建议的扩展。

oleFormat.getSuggestedFileName()获取到的值是个空值

@ouchli 是的,在您的情况下,文档中未提供建议的文件名。 所以你应该自己构造文件名。

文档中的 附件名 是 “表格1.docx” ,这个值获取不到吗

@ouchli 不,不幸的是,正如我所提到的,文档中没有指定建议的名称。 您在文档中看到的名称仅显示在 OLE 对象 EMF 图标上,无法通过 Aspose.Words 获取。

那我是不是也判断不出来这个附件是excel、pdf还是docx?

@ouchli 您可以使用 OleFormat.getSuggestedExtension。 此外,您还可以使用 OleFormat.getProgId

请问可以支持提取图标上的文字吗?

请问在word中怎么构造文件名

这其中都没有可选项

@ouchli

不,这超出了 Aspose.Words 范围。

不太清楚你的意思。 您能否更详细地阐述您的要求。

请问这个excel附件,Excel.Sheet.12 这个节点怎么获取

@ouchli Excel.Sheet.12 是 OLE 对象 ProgID。 您可以像提取任何其他嵌入的 OLE 对象一样提取 OLE 对象。