16

プログラムでOpenOfficeスプレッドシートを作成しようとしていますが、何らかの理由で、必要なすべてのファイルを含むフォルダを圧縮すると、OpenOfficeがファイルに破損のフラグを立てます。

どうやってこれにたどり着いたのですか?まず、OpenOfficeでいくつかの値を含む通常のスプレッドシートを作成しました。保存後、拡張子を.zipに変更し、フォルダーのコピーを作成します。次に、コマンドラインzipを使用して2番目のフォルダーを圧縮し、ファイル拡張子を.odsに変更します。結果のファイルを開こうとすると、OpenOfficeからファイルが破損しているというエラーが表示されます。

Open Officeは特別な圧縮アルゴリズムを使用していますか?「ファイルtest.ods」を実行すると、圧縮されたzipとして表示されます。それで、Open Officeは、圧縮ルーチン中に何を追加して機能させるのでしょうか。

4

5 に答える 5

21

ドキュメンテーションはこちら。この手順は私にとってはうまくいきました:

  1. 元のドキュメント ファイル (通常の zip ファイル) を次のディレクトリに解凍します。

    $ mkdir document
    $ cd document
    $ unzip ../document.odt
    
  2. 非圧縮データを変更します。

  3. 新しい odt を作成します。

    $ zip -0 -X ../document2.odt mimetype
    $ zip -r ../document2.odt * -x mimetype
    
于 2011-03-28T15:43:37.200 に答える
9

OASIS OpenOffice 仕様のセクション 17では、OpenDocument パッケージをどのようにパッケージ化する必要があるかを定義しています。

セクション 17.4 MIME タイプ ストリームは次のようになります。

パッケージを使用するドキュメントの MIME タイプが存在する場合、パッケージには 「 mimetype」と呼ばれるストリームが含まれている必要があります。このストリームは、パッケージの zip ファイルの最初のストリームであるべきであり、圧縮してはならず、ヘッダーに「追加フィールド」を使用してはなりませ([ZIP] を参照)。

目的は、Unix の file/magic ユーティリティなどの「マジック ナンバー」メカニズムによってパッケージ化されたファイルを識別できるようにすることです。ZIP ファイルの先頭に圧縮されていないストリームが含まれていて、ヘッダーに余分なデータがない場合、ストリーム名とストリーム コンテンツは固定位置にあります。より具体的には、次のことがわかります。

  • すべての zip ファイルの位置 0 にある文字列「PK」
  • このようなすべてのパッケージ ファイルの 30 番目の文字列「mimetype」
  • そのようなパッケージの 38 番目の位置にある MIME タイプ自体。
于 2011-02-10T13:19:40.570 に答える
6

私はtoklandの提案を試みましたが、LibreOffice 4には特定の順序が必要であることがわかりました(最初のもののみ?):

  1. mimetype(非圧縮)
  2. meta.xml
  3. settings.xml
  4. content.xml
  5. Thumbnails/thumbnail.png
  6. Configurations2/images/Bitmaps/
  7. Configurations2/popupmenu/
  8. Configurations2/toolpanel/
  9. Configurations2/statusbar/
  10. Configurations2/progressbar/
  11. Configurations2/toolbar/
  12. Configurations2/menubar/
  13. Configurations2/accelerator/current.xml
  14. Configurations2/floater/
  15. styles.xml
  16. META-INF/manifest.xml

そのfolder2od.shを実行するスクリプトを作成します。

#!/bin/sh

# Convert folder (unzipped OpenDocument file) to OpenDocument file (odt, ods, etc.)
# Usage: ./folder2od.sh "path/to/folder" "file.odt"

cmdfolder=$(cd `dirname "$0"`; pwd -P)
folder=$(cd `dirname "$2"`; pwd -P)
file=$(basename "$2")
absfile="$folder/$file"

cd "$1"
zip -0 -X "$file" "mimetype"

list=$(cat <<'END_HEREDOC'
meta.xml
settings.xml
content.xml
Thumbnails/thumbnail.png
Configurations2/images/Bitmaps/
Configurations2/popupmenu/
Configurations2/toolpanel/
Configurations2/statusbar/
Configurations2/progressbar/
Configurations2/toolbar/
Configurations2/menubar/
Configurations2/accelerator/current.xml
Configurations2/floater/
styles.xml
META-INF/manifest.xml
END_HEREDOC
)

for f in $list
do
    zip "$absfile" "$f"
done

cd "$cmdfolder"

ここでいくつかの興味深い情報を見つけました: http://www.jejik.com/articles/2010/03/how_to_correctly_create_odf_documents_using_zip/

于 2013-04-27T23:43:56.653 に答える
0

シェル スクリプトも機能しました :) odt ファイルを解凍した後、元に戻すときに問題が発生しました。マニフェストの部分が欠けていると思います。

ただし、上記のシェル スクリプトはインラインの画像/グラフィックスを処理しませんでした。そのため、いくつかの小さな調整を行いました (また、スクリプトには END_HEREDOC が専用回線にないというバグがありました)。

#!/bin/sh

# Convert folder (unzipped OpenDocument file) to OpenDocument file (odt, ods, etc.)
# Usage: ./folder2od.sh "path/to/folder" "file.odt"

cmdfolder=$(cd `dirname "$0"`; pwd -P)
folder=$(cd `dirname "$2"`; pwd -P)
file=$(basename "$2")
absfile="$folder/$file"

cd "$1"
zip -0 -X "$file" "mimetype"

list=$(cat <<'END_HEREDOC'
meta.xml
settings.xml
content.xml
Pictures/
Thumbnails/
Configurations2/
styles.xml
manifest.rdf
META-INF/manifest.xml
END_HEREDOC
)

for f in $list
do
    zip -r "$absfile" "$f"
done

cd "$cmdfolder"
于 2014-04-28T19:17:35.293 に答える