下記コードにて、RTF形式のファイルからEmbedded Objectの抽出を行っています。
Document doc = new Document(InputStream);
List<byte[]> embeddedObjects = new ArrayList<>();
for (Object shapeObj : doc.getChildNodes(NodeType.SHAPE, true)) {
Shape shape = (Shape) shapeObj;
OleFormat ole = shape.getOleFormat();
if (ole == null) {
continue;
}
if (!ole.isLink()) {
try (ByteArrayOutputStream objectStream = new ByteArrayOutputStream()) {
ole.save(objectStream);
embeddedObjects.add(objectStream.toByteArray());
}
}
}
}
サンプルデータを処理した際、Embedded Object( xlsx と xlsm )のシグネチャに誤りがあることを確認しています。
・出力ファイルのシグネチャ
50 4B 03 04 00 08 08 08
・正しいXLSXのシグネチャ
50 4B 03 04 14 00 06 00
シグネチャの違いが原因かわかりませんが、処理する毎に、出力されるデータのバイナリに差分があります。
使用バージョン:Aspose.Words for Java 18.7
サンプルデータ:RTF_SampleDocument.zip (12.3 KB)
上記の問題について回避する方法はありますでしょうか。
お手数をおかけしますが、ご確認の程よろしくお願いいたします。
@yudai_yamaguchi,
しかし、次のコードは、1つのXLSXファインを正しく抽出します。
Document doc = new Document("D:\\temp\\RTF_SampleDocument\\RTF_SampleDocument.rtf");
List<byte[]> embeddedObjects = new ArrayList<>();
int i = 0;
for (Object shapeObj : doc.getChildNodes(NodeType.SHAPE, true)) {
Shape shape = (Shape) shapeObj;
OleFormat ole = shape.getOleFormat();
if (ole == null) {
continue;
}
if (!ole.isLink()) {
try (ByteArrayOutputStream objectStream = new ByteArrayOutputStream()) {
ole.save(objectStream);
embeddedObjects.add(objectStream.toByteArray());
if (ole.getProgId().equals("Excel.Sheet.12")) {
ole.save("D:\\temp\\RTF_SampleDocument\\RTF_SampleDocument" + i + ".xlsx");
i++;
}
}
}
}
私はあなたの参照のためにここに抽出XLSXファイルを添付しました。
RTF_SampleDocument0.zip (5.4 KB)
このファイルは、MS Excel 2016で正しく表示されます。
提供していただいたコードを数回実行した結果、
出力されるXLSXファイルに差分があることを確認しました。
差分を確認すると、ファイルの先頭部分に差があることを確認しました。
差分の内容は以下の通りです。
|#|HEX(00000000~0000000F)|
| --- | --- |
|1|50 4B 03 04 14 00 08 08 08 00 30 BF 0D 4D 00 00|
|2|50 4B 03 04 14 00 08 08 08 00 77 BF 0D 4D 00 00|
|3|50 4B 03 04 14 00 08 08 08 00 0F 00 0E 4D 00 00|
|4|50 4B 03 04 14 00 08 08 08 00 35 00 0E 4D 00 00|
|5|50 4B 03 04 14 00 08 08 08 00 59 00 0E 4D 00 00|
また、XLSXファイルの シグネチャ は、「50 4B 03 04 14 00 06 00」が正しいと思います。
※シグネチャは https://filesignatures.net/index.php?search=xlsx&mode=EXT
で確認しました。
今出力されているXLSXファイルのシグネチャは「50 4B 03 04 14 00 08 08」になっています。
ファイルを開くことは出来ますが、XLSXファイルのシグネチャとしては間違っていると思います。
正しいファイルシグネチャで、差分が出ないようにする方法はありますでしょうか。
お手数をおかけしますが、ご確認の程よろしくお願いいたします。
@yudai_yamaguchi,
追加情報をありがとう。 訂正のために、私たちはこの問題を当社の問題追跡システムに記録しました。 この問題のIDはWORDSNET-17333です。 この問題の詳細をさらに調査し、この問題のステータスを更新します。 ご迷惑をおかけして申し訳ありません。
この問題の修正が完了する時期はいつごろになるか教えてください。
お手数をおかけしますが、ご確認の程よろしくお願いいたします。
@yudai_yamaguchi,
残念ながら、あなたの問題はまだ解決されていません。 この問題は現在解析中ですが、キューに入っています。 現時点では見積もりはありません。 この問題が解決され次第、このスレッドを通じて通知させていただきます。 ご迷惑をおかけして申し訳ありません。
ご返答ありがとうございます。
この問題の修正が完了する予定日を見積もっていただけますか。
私はこの問題を早急に対応する必要があります。
そのため、この問題がすぐに修正されない場合には、私は別の方法を考えなければいけません。
お手数をおかけしますが、ご確認の程よろしくお願いいたします。
@yudai_yamaguchi,
残念ながら、あなたの問題はまだ解決されていません。 この問題が解決され次第、または見積もり(時間枠)が利用可能になるとすぐに、このスレッドを通じて通知させていただきます。 ご迷惑をおかけして申し訳ありません
@yudai_yamaguchi,
WORDSNET-17333に関しては、元のXLSXパッケージを入手する方法を提供することを皆様にお知らせすることです。 次のコードを使用して、必要な署名付きの元のパッケージを取得することもできます。
OleFormat ole = shape.getOleFormat();
byte[] bytes = ole.getOleEntry("package");
これが新しいXLSXファイルを生成するたびに問題は、保存中にXLSXパッケージの再生成を妨げるものです。 また、XLSXパッケージの再生成を引き起こすケースの数を減らす修正を実装する予定です。
私たちはあなたに更なるアップデートを掲載し続けます。
The issues you have found earlier (filed as WORDSNET-17333) have been fixed in this Aspose.Words for .NET 18.10 update and this Aspose.Words for Java 18.10 update.