Date: prev next · Thread: first prev next last
2018 Archives by date, by thread · List index


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: users+unsubscribe@de.libreoffice.org
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

Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.