Hallo Lilo,

ich hatte mich vor 4 Jahren schon mal mit dem Problem odDatei entpacken und wieder packen beschäftigt. Ich habe Dir mal aus meiner PERL-Bibliothek die benötigten Programme in eine Datei zusammengestellt, so dass Du schon mal ein ablauffähiges PERL-Programm hast zum Testen, wenn Du in dieser Richtung weiter machen willst.

Ich schicke Dir diese Datei "ChangeAutoTrueToFalse.pl" als "ChangeAutoTrueToFalse.txt" auch an deine private Mail-Adresse, weil hier die Einrückungen oftmals verloren gehen - und dann isses doch etwas unübersichtlich.

Allerdings halte ich die MAKRO-Variante noch immer für die bessere Variante als dieses direkte Eingreifen :-o in die odDatei : ...

Gruß
Hans-Werner ;-))


##############################################################################################################

  use strict;
  use warnings;

  my $AV;  # Arbeits Verzeichnis
  my $odD; # open document Datei
  my $odV; # open document Verzeichnis (= zip-Archiv)

  $AV  = "E:/TMP/";
  $odD = "standard-defekt1.odt";

#     Programmablauf:

# [1] "E:/TMP/standard-defekt1.odt" entpacken nach "E:/TMP/standard-defekt1.odt_unpacked" # [2] "E:/TMP/standard-defekt1.odt" umbennen in "E:/TMP/BACKUP_standard-defekt1.odt", # weil sonst später "PackOD" meckert, dass die odDatei schon existiert. # [3] Programmablauf-Unterbrechung (hier für Testzwecke), damit man das 'odVerzeichnis'
#     "E:/TMP/standard-defekt1.odt_unpacked" inspizieren kann.
# [4] 'odDatei'-Archiv wieder packen zu "E:/TMP/standard-defekt1.odt".

$odV = UnpackOD($AV,$odD); # odDatei entpacken: 'AV'"standard-defekt1.odt_unpacked"

rename($AV.$odD,$AV."BACKUP_".$odD); # originale odDatei umbennen: "BACKUP_'odDatei'"

# In der Datei "styles.xml" die Modifikation 'style:auto-update="true"' zu 'style:auto-update="false"' durch-
# führen.

  print "\n Weiter mit [ENTER] ... "; <STDIN>;

PackOD($AV,$odV); # odDatei packen: "standard-defekt1.odt

##############################################################################################################

  sub UnpackOD {
# ================================================================================================= 11.06.2014 # Entpackt das in einer OD-Datei enthaltene OD-Archiv in ein Verzeichnis. # ------------------------------------------------------------------------------------------------------------
#    odc = 'o'pen 'd'ocument format data 'c'hart              - Diagramm
#    odf = 'o'pen 'd'ocument format 'f'ormula                 - Formel
# odg = 'o'pen 'd'ocument format 'g'raphics - Zeichnung
#    odi = 'o'pen 'd'ocument format 'i'mage                   - Bild
# odm = 'o'pen 'd'ocument format text-'m'aster - Globaldokument # odp = 'o'pen 'd'ocument format 'p'resentation - Präsentation # ods = 'o'pen 'd'ocument format 's'preadsheet - Tabellendokument
#    odt = 'o'pen 'd'ocument format 't'Text                   - Text
# otg = 'o'pen document format 't'emplate 'g'raphics - Zeichnungsvorlage # otp = 'o'pen document format 't'emplate 'p'resentation - Präsentationsvorlage # ots = 'o'pen document format 't'emplate 's'preadsheet - Tabellenvorlage # ott = 'o'pen document format 't'emplate 't'ext - Textvorlage # ============================================================================================================
     use strict;
     use warnings;
     use Archive::Zip qw(:ERROR_CODES);
     use File::Path;
     my $AV;    # Arbeits Verzeichnis
     my $odD;   # open document Datei
     ($AV,$odD) = @_;
     my @M;     # (array) Member
     my $A;     # Archiv
     my $odDAV; # open document Datei Archiv Verzeichnis
     my $M;     # Member
     my $RA;    # Regulärer Ausdruck
     $RA = '\.(odc|odf|odg|odi|odm|odp|ods|odt|otg|otp|ots|ott)$';
# ============================================================================================================
#    OD-Datei auf Existenz prüfen:
     unless ( -e $AV."/".$odD ) {
        MsgError("[UnpackOD] Die OD-Datei existiert nicht.\n".
                 "Datei      : ".$odD."\n".
                 "Verzeichnis: ".$AV."/");
        exit;
     }
#    OD-Datei auf OD-Dateierweiterung prüfen:
     unless ( $odD =~ m/$RA/ ) {
MsgError("[UnpackOD] Die OD-Datei hat keine OD-Dateierweiterung.\n".
                 "OD-Datei  : ".$odD."\n".
                 "Bezugspfad: ".$AV."\n".
"Syntax : \'datei\'.\'[odc|odf|odg|odi|odm|odp|ods|odt|otg|otp|ots|ott]\'");
        exit;
     }
#    OD-Verzeichnis anlegen:
     $odDAV = $AV."/".$odD."_unpacked";
     if ( -e $odDAV ) {
        rmtree($odDAV);
     }
     mkpath($odDAV);
#    OD-Datei entpacken:
$A = Archive::Zip->new($AV."/".$odD); # Archiv-Objekt initiieren @M = $A->memberNames(); # Archiv-Membernamen holen
     foreach $M (@M){
unless ( $A->extractMember($M,$odDAV."/".$M) == AZ_OK ) { # Archiv-Member entpacken MsgError("[UnpackOD] Archive::Zip: extractMember ist fehlgeschlagen.\n".
                    "Member: ".$M);
           exit;
        }
     }
#    Rückgabewert setzen:
     return($odD."_unpacked");
  }

##############################################################################################################

  sub PackOD {
# ================================================================================================= 11.06.2014 # Packt den Inhalt eines OD-Verzeichnisses, welches die Elemente einer entpackten OD-Datei enthält, zu
#    einer OD-Datei. Das OD-Verzeichnis wird nach dem Packen gelöscht.
# ------------------------------------------------------------------------------------------------------------
#    odc = 'o'pen 'd'ocument format data 'c'hart              - Diagramm
#    odf = 'o'pen 'd'ocument format 'f'ormula                 - Formel
# odg = 'o'pen 'd'ocument format 'g'raphics - Zeichnung
#    odi = 'o'pen 'd'ocument format 'i'mage                   - Bild
# odm = 'o'pen 'd'ocument format text-'m'aster - Globaldokument # odp = 'o'pen 'd'ocument format 'p'resentation - Präsentation # ods = 'o'pen 'd'ocument format 's'preadsheet - Tabellendokument
#    odt = 'o'pen 'd'ocument format 't'Text                   - Text
# otg = 'o'pen document format 't'emplate 'g'raphics - Zeichnungsvorlage # otp = 'o'pen document format 't'emplate 'p'resentation - Präsentationsvorlage # ots = 'o'pen document format 't'emplate 's'preadsheet - Tabellenvorlage # ott = 'o'pen document format 't'emplate 't'ext - Textvorlage # ============================================================================================================
     use strict;
     use warnings;
     use Archive::Zip qw(:ERROR_CODES);
     use File::Path;
     my $AV;    # Arbeits Verzeichnis
     my $odV;   # open document Verzeichnis
     ($AV,$odV) = @_;
     my $A;     # Archiv
     my $D;     # Datei
     my $RA;    # Regulärer Ausdruck
     $RA = '\.(odc|odf|odg|odi|odm|odp|ods|odt|otg|otp|ots|ott)$';
# ============================================================================================================
#    OD-Verzeichnis auf '_unpacked'-Endung prüfen:
     unless ( $odV =~ m/_unpacked$/ ) {
MsgError("[PackOD] Der OD-Verzeichnisname endet nicht auf '\_unpacked\'.\n".
                 "OD-Verzeichnis: ".$odV."\n".
                 "Bezugspfad    : ".$AV);
        exit;
     }
#    OD-Datei auf OD-Dateierweiterung prüfen:
     $D = $odV;
     $D =~ s/_unpacked//g;
     unless ( $D =~ m/$RA/ ) {
MsgError("[PackOD] Die OD-Datei hat keine OD-Dateierweiterung.\n".
                 "OD-Datei  : ".$D."\n".
                 "Bezugspfad: ".$AV."\n".
"Syntax : \'datei\'.\'[odc|odf|odg|odi|odm|odp|ods|odt|otg|otp|ots|ott]\'");
        exit;
     }
#    OD-Verzeichnis auf Existenz prüfen:
     unless ( -e $AV."/".$odV ) {
MsgError("[odUnpackOD] Das OD-Verzeichnis wurde nicht gefunden.\n".
                 "OD-Verzeichnis: ".$odV."\n".
                 "Pfad          : ".$AV);
        exit;
      }
#    OD-Datei auf Existenz prüfen:
     if ( -e $AV."/".$D ) {
MsgError("[odUnpackOD] Zu packende OD-Datei existiert bereits.\n".
                 "OD-Datei: ".$D."\n".
                 "Pfad    : ".$AV);
        exit;
     }
#    OD-Datei packen:
$A = Archive::Zip->new(); # Archiv-Objekt initiieren unless ( $A->addTree($AV."/".$odV) == AZ_OK ) { # OD-Daten packen MsgError("[odPackOD] Archive::Zip: addTree ist fehlgeschlagen.\n");
        exit;
     }
unless ( $A->writeToFileNamed($AV."/".$D) == AZ_OK ) { # OD-Datei erzeugen MsgError("[odPackOD] Archive::Zip: writeToFileNamed ist fehlgeschlagen.\n");
        exit;
     }
     rmtree($AV."/".$odV);
#    Rückgabewert setzen:
     return($D);
  }

##############################################################################################################

  sub MsgError {
# ================================================================================================= 11.06.2014
# Gibt eine formatierte Fehlermeldung aus.
# ============================================================================================================
     my $ME;    # Message Error
     ($ME) = $_[0];
     my @ME;    # [array] Message Error
     my $idxME; # index Message Error
# ============================================================================================================ @ME = SplitString("\n",$ME); # Zeilen anhand "\n" in Array-Elemente aufteilen print "\n". # Erste Zeile ausgeben
           " FEHLER - ".$ME[0]."\n";

     for ( $idxME = 1 ; $idxME <= $#ME; $idxME++ ) {
print " ".$ME[$idxME]."\n"; # Eventuelle Folgezeilen ausgeben
     }
     print "\n".
           " Weiter mit [ENTER] ... ";
     <STDIN>;
  }

##############################################################################################################

  sub SplitString {
# ================================================================================================= 11.06.2014 # Teilt eine übergebene Zeichenkette anhand eines übergebenen Trenners in Teilzeichenketten auf, wobei
#
# + der Trenner aus
#   + beliebig vielen beliebigen Zeichen
#   + "\n", welches in "~T~R~E~N~N~E~R~" umgesetzt wird,
#   bestehen darf.
# + entstandene leere Teilzeichenketten "" mit einem " " belegt werden.
# ============================================================================================================
     use strict;
     use warnings;
# ------------------------------------------------------------------------------------------------------------
     my $T;     # Trenner
     my $ZK;    # Zeichen Kette
     ($T,$ZK) = @_;
     my @ZK;    # array Zeichenkette
     my $idxZK; # index Zeichen Kette
     my $TP;    # Trenner Position
# ============================================================================================================
#    Trenner "\n" ersetzen durch "~T~R~E~N~N~E~R~":
     if ( $T eq "\n") {
       $ZK =~ s/$T/~T~R~E~N~N~E~R~/g;
       $T = "~T~R~E~N~N~E~R~";
     }
#    Der Trenner enthält kein Zeichen:
     if ( $T =~ /^$/ ) {
        MsgError("[SplitString] Der Trenner enthält kein Zeichen.\n".
                 "Trenner =====>".$T."<=====\n".
                 "Zeichenkette: ".$ZK);
#    Der Trenner enthält mindestens 1 Zeichen:
     } else {
#       Die Zeichenkette enthält den Trenner:
        if ( index($ZK,$T) != -1 ) {
#          Zeichenkette an den Trennerstellen aufteilen:
           $idxZK = -1;
           while ( index($ZK,$T) != -1 ) {
              $idxZK++;
              $TP = index($ZK,$T);
              $ZK[$idxZK] = substr($ZK,0,$TP);
              $ZK = substr($ZK,$TP+length($T));
           }
           if ( length($ZK) > 0 ) {
              $idxZK++;
              $ZK[$idxZK] = $ZK;
           }
#          Leere Teilzeichenketteelemente mit " " belegen:
           for ( $idxZK=0; $idxZK <= $#ZK ; $idxZK++ ) {
              if ( $ZK[$idxZK] eq "" ) {
                 $ZK[$idxZK] = " ";
              }
           }
#       Die Zeichenkette enthält den Trenner nicht:
        } else {
           $ZK[0] = $ZK;
        }

     }
     return @ZK;
  }

##############################################################################################################
--
Liste abmelden mit E-Mail an: [email protected]
Probleme? 
https://de.libreoffice.org/hilfe-kontakt/mailing-listen/abmeldung-liste/
Tipps zu Listenmails: https://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: https://listarchives.libreoffice.org/de/users/
Datenschutzerklärung: https://www.documentfoundation.org/privacy

Antwort per Email an