bugfix> zip > 投稿

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

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

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

回答 4 件
  • ドキュメントはこちら。この手順は私にとってうまくいきました:

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

    $ mkdir document
    $ cd document
    $ unzip ../document.odt
    
    

    非圧縮データを変更します。

    新しいodtを作成します。

    $ zip -0 -X ../document2.odt mimetype
    $ zip -r ../document2.odt * -x mimetype
    
    

  • OASIS OpenOffice仕様のセクション17は、OpenDocumentパッケージをパッケージ化する方法を定義しています。

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

    If a MIME type for a document that makes use of packages is existing, then the package SHOULDcontain a stream called "mimetype". This streamSHOULDbe first stream of the package's zip file, itMUST NOTbe compressed, and itMUST NOTuse an 'extra field' in its header (see [ZIP])..

    The purpose is to allow packaged files to be identified through 'magic number' mechanisms, such as Unix's file/magic utility. If a ZIP file contains a stream at the beginning of the file that is uncompressed, and has no extra data in the header, then the stream name and the stream content can be found at fixed positions. More specifically, one will find:

      a string 'PK' at position 0 of all zip files

      a string 'mimetype' at position 30 of all such package files

      the mimetype itself at position 38 of such a package.

  • 私はtoklandの提案を試しましたが、LibreOffice 4が特定の順序を要求することを発見しました(最初のものだけですか?):

    mimetype  (非圧縮)

    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

    そのためのスクリプトを作成します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/

  • シェルスクリプトも私にとってはうまくいきました:) 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"
    
    

あなたの答え