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