🙏 Bitte helfen Sie uns das LibreOffice Forum zu erhalten. 🙏
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.

🍀 Wir hoffen auf Ihre Unterstützung - vielen Dank!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Tool zur Massenkonvertierung der alten (Star)officeformate

Komponentenübergreifende Themen und Hilfe zu LibreOffice
Antworten
mjost
Beiträge: 2
Registriert: So 24. Feb 2013, 15:58

Tool zur Massenkonvertierung der alten (Star)officeformate

Beitrag von mjost » So 24. Feb 2013, 16:27

Hallo,
nachdem für Libreoffice 4 die Unterstützung der alten Staroffice-Formate abgekündigt wird, musste ich jetzt meine alten Dokumente endgültig konvertieren.
Also habe ich mir dafür einen perl-Hack, basierend auf unoconv http://dag.wieers.com/home-made/unoconv/ gebaut.
Über die Funktionalität von unoconv selbst hinaus, habe ich mir eingebaut:
  • Bearbeitet alle Dateien in einem Verzeichnis
    (Rekursiv alles Verzeichnisse darunter zu bearbeiten, ist mit einer einfachen Modifikation möglich - ich fürchtete aber von der dann umzusetzenden Zahl an Dokumenten erschlagen zu werden.
  • Erkennung der verschiedenen Formate (Text, Tabelle, ...)
    (Das ist nicht vollständig ! Ich habe jeweils implementiert, was mir auf meinem System unterkam)
    (s.u.)
  • Der "modified" timestamp der neuen Datei wird auf den der alten Datei gesetzt
  • Hat alles geklappt, wird die alte Datei gelöscht
Im Moment sind folgende Umsetzungen realisiert:
  • .s[dx]w => .odt # writer
  • .s[dx]c => .ods # calc
  • .sxi => .odp # Presentation
  • .svg => .odg # draw
  • .sxd => .odg/# draw
Meine Erfahrung hat gezeigt, dass mindestens zwei Läufe in einem Verzeichnis Sinn machen, wenn es beim ersten Durchlauf Fehlermeldungen von unoconv gab; in vielen Fällen klappte es im zweiten Durchlauf bei mir dann - keine Ahnung weshalb...

Viele Grüße - und viel Erfolg beim Konvertieren...

Martin

Da ich es nicht schaffte, irgendeine Datei anzuhängen, hier also "inline".
(Und ja, Ihr müsst Euch entscheiden, ob Ihr meinem Code vertraut - aber Ihr könnt ihn Euch ja ansehen....)

Code: Alles auswählen

#!/usr/local/bin/perl -w

# $Header: /home/jost/cvs/hacks/oooConv.pl,v 1.3 2013/02/24 14:25:51 jost Exp $

use strict;

use English qw( -no_match_vars);
use IO::File;
use File::Find;
use Getopt::Long;

use constant UNOCONV => "/home/jost/transfer/unoconv-0.6/unoconv";

my($matched,  # Files matching filter
   $tried,    # Tried to transform
   $succeeded); # Succeeded to transform


$matched = 0;
$tried = 0;
$succeeded = 0;

sub manual()
  {
    print STDERR <<EOM;
Converts old OOO (SO) files to new ones; sets timestamp and removes the old relicts
Old is'*.sdw', new '*.odt'.
The timestamp of the new file is set from the old one, then the old fiel is removed.
Uses unoconv (http://dag.wieers.com/home-made/unoconv/) for the actual conversion

call: oooConv DIR
EOM
  }

sub wanted
  {
    # Called for each element found below given dir
    # $File::Find::name: name of the found object

    my($elem) = $File::Find::name;

    if (!-f $elem)
      {
        return; # No file
      }

    if (($elem !~ /\.sd[cw]$/i) &&
        ($elem !~ /\.sx[cdiw]$/i) &&
        ($elem !~ /\.svg$/i))
      {
        return; # Wrong extension
      }

    print "=== $elem ===\n";
    $matched++;

    my($new,
       $format);
    $new = $elem;
    if ($elem =~ /\.s[dx]w$/i)
      {
        $new =~ s/\.s[dx]w$/.odt/i; # writer
        $format = "odt";
      }
    elsif ($elem =~ /\.s[dx]c$/i)
      {
        $new =~ s/\.s[dx]c$/.ods/i; # calc
        $format = "ods";
      }
    elsif ($elem =~ /\.sxi$/i)
      {
        $new =~ s/\.sxi$/.odp/i; # Presentation
        $format = "odp";
      }
    elsif (($elem =~ /\.svg$/i) ||
           ($elem =~ /\.sxd$/i))
      {
        $new =~ s/\.svg$/.odg/i; # draw
        $new =~ s/\.sxd$/.odg/i; # draw
        $format = "odg";
      }

    if (-e $new)
      {
        print STDERR "  Error: \"$new\" already exists !\n";
        return;
      }

    $tried++;

    my($cmd,
       $ret);
    $cmd = UNOCONV . " -v -f $format \"$elem\"";
    $ret = system($cmd);

    if ($ret == -1)
      {
        print STDERR "  Error: Failed to execute: $ERRNO\n";
        return;
      }
    elsif ($ret & 127)
      {
        printf STDERR "  Error: Died with signal %d, %s coredump\n", ($? & 127),  ($? & 128) ? 'with' : 'without';
        return;
      }
    elsif ($ret != 0)
      {
        printf STDERR "  Error: Exited with value %d\n", $? >> 8;
        return;
      }

    my($mtimeOld,
       $mtimeNew);
    $mtimeOld = (stat($elem))[9];

    if (!-f $new)
      {
        printf STDERR "  Error: '.odt-file doesn't exist !\n";
        return;
      }

    $mtimeNew = (stat($new))[9];
    if ($mtimeOld > $mtimeNew)
      {
        printf STDERR "  Error: New file is older than old one !\n";
        return;
      }

    my($now);
    $now = time;
    $ret = utime($now, $mtimeOld, $new);

    if ($ret != 1)
      {
        printf STDERR "  Error: umtime failed !\n";
        return;
      }

    $ret = unlink($elem);
    if (!$ret)
      {
        printf STDERR "  Error: unlink failed: $ERRNO !\n";
        return;
      }
    $succeeded++;
  }

if ($#ARGV < 0)
  {
    print STDERR "Error: No argument (dir) given ! \n";
    manual();
    exit 1;
  }


my($dir) = $ARGV[0];
if (! -d $dir)
    {
      print STDERR "Error: Expected Dir as argument ! \n";
      manual();
      exit 1;
    }

find(\&wanted, $dir);

if ($matched > 0)
    {
      print "\n==================================\n";
      print "$matched files passed filter\n";
      print "$tried files tried to transform\n";
      if ($tried - $succeeded > 0)
        {
          print "" . ($tried - $succeeded) . " files FAILED\n";
        }
      else
        {
          print "ALL files SUCCESSFULL\n";
        }
    }

swolf
* LO-Experte *
Beiträge: 1143
Registriert: Di 14. Feb 2012, 16:56

Re: Tool zur Massenkonvertierung der alten (Star)officeforma

Beitrag von swolf » So 24. Feb 2013, 17:32

Hallo mjost,

hast du es schon mit der Version 3.3.4 versucht? Sie hat noch den Konverter für
StarOffice Dateien - im Menü Datei-Assistenten - Dokumenten Konverter.

Wenn es dir widerstrebt, diese Version parallel zu installieren, kannst du Portable nehmen:
http://downloadarchive.documentfoundati ... d/3.3.4.1/

Übrigens, das Thema wird u.a. auch in der Rubrik f. Windows diskutiert:
http://www.libreoffice-forum.de/viewtop ... 422#p19695

...aber der Filter und der Konverter wurden entfernt mit der Begründung,
dass niemand mehr StarOffice5 - Dateien hat.

mjost
Beiträge: 2
Registriert: So 24. Feb 2013, 15:58

Re: Tool zur Massenkonvertierung der alten (Star)officeforma

Beitrag von mjost » So 24. Feb 2013, 18:04

Hallo swolf,

ja, ich war rechtzeitig gewarnt: Ich habe die aktuelle 3.6.5 verwendet. (Auch unoconv braucht ein libreoffice im Hintergrund)
Mit meinem Artikel ging es mir "nur" darum, meinen perl-Hack hier zu teilen, so dass sich vielleicht anderer den Aufwand sparen können.
Ich hatte jedenfalls stapelweise alte Dateien herumliegen und hätte ohne die Konvertieraktion ziemlich viel Historie verloren.

Ok, vielleicht hätte ich das im Artikel klarer formulieren können: [Was Alles so beim nochmal Lesen auffällt :-]
Das war kein Hilfeschrei, sondern soll ein Angebot an andere libreoffice-Nutzer sein.

Viele Grüße

Martin

Auch eben aufgefallen:
Mein Tool braucht natürlich perl.
Ist das nicht in /usr/local/bin installiert, so muss man die erste Zeile meines Scripts ändern, oder es einfach mit 'perl scriptname' aufrufen.

Vito Leone
Beiträge: 1
Registriert: So 22. Sep 2024, 17:57

Re: Tool zur Massenkonvertierung der alten (Star)officeformate

Beitrag von Vito Leone » So 22. Sep 2024, 18:31

Hallo,

anbei ein alternativer Weg, den ich dem WWW gerne zurückgeben möchte, nachdem ich ihn mir in Teilen aus dem WWW genommen habe und damit meinem 77-jährigen Vater dessen Ansammlung alter Staroffice-Dateien auf die Schnelle konvertiert habe. Vielleicht ist es noch für jemand anderes hilfreich.

Zur Verwendung kam eine portable Version von LibreOffice 3.6.6., die noch mit den StarOffice-Formaten umzugehen weiß. Den Download gab es für mich hier:

https://sourceforge.net/projects/winpen ... /releases/

Im Folgenden entpackt nach c:\_tmp lag es bereit, um von einem Batch-File angesprochen zu werden, das in drei separaten Schleifen das Verzeichnis selbst, in dem es abgelegt wurde, sowie alle darin enthaltenen Unterverzeichnisse zu durchlaufen und die gefragten Dateitypen *.sdw, *.sdc und *.vor entsprechend zu konvertieren.

Die Batch-Datei hatte folgenden Inhalt und wurde anschließend über die Kommandozeile ausgeführt:

Code: Alles auswählen

@echo off

set "path=%path%;c:\_tmp\X-LibreOffice_3.6.6_rev15\Bin\LibreOffice 3\program"

for /r %%f in (*.sdw) do (
	pushd %%~dpf
	soffice.exe --headless --convert-to odt "%%f"
	echo "%%f"
	popd
)

for /r %%f in (*.sdc) do (
	pushd %%~dpf
	soffice.exe --headless --convert-to ods "%%f"
	echo "%%f"
	popd
)

for /r %%f in (*.vor) do (
	pushd %%~dpf
	soffice.exe --headless --convert-to odt "%%f"
	echo "%%f"
	popd
)
Nicht schön, nicht performant, aber für seinen Zweck praktikabel. Vater ist glücklich und StarOffice darf endlich in Frieden ruhen.

juribel
Beiträge: 234
Registriert: Mi 6. Mai 2020, 15:48

Re: Tool zur Massenkonvertierung der alten (Star)officeformate

Beitrag von juribel » Mo 23. Sep 2024, 22:13

Dies hat jetzt nichts mit StarOffice-Dateien zu tun, aber die zuletzt mit der Batchdatei für Windows vorgestellte Methode ist auch heute noch der einfachste Weg, um einzelne oder viele Dateien in ein anderes Format zu überführen. Auch unter Linux. Beispiel:

Code: Alles auswählen

libreoffice --headless --convert-to html *.odt


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten