CPPeter
06-10-2004, 19:20
Moin,
'bin derzeit dabei, ein existierendes Buch unter XP von Word nach LaTex zu portieren. Die Grafiken in den Buch sind mit Word gezeichnet worden, auf der anderen Seite verwende ich WinShell und miktex (beides sollte für den hier vorgestellten Ansatz aber nicht erforderlich sein).
Nach langem Suchen habe ich mir jetzt einen Weg gebastelt, der sehr bequem ist und sowohl für DVIs (eps Grafiken) als auch für PDFs (png Grafiken) taugt.
Voraussetzungen:
"HP LaserJet 5P/5MP PostScript" ist eingerichtet. Mit dem "Generic Postscript Printer" funktioniert es leider nicht.
gsview muss installiert sein
perl muss installiert sein
Zum einen habe ich ein VBA Script geschrieben, mit dem eine beliebige Markierung (z.B. eine Grafik) in einem Word Dokument per Knopfdruck in eine PostScript Datei geschrieben wird. Das Script ruft am Ende ein perl Script auf, das dann die Konvertierung in eps und png übernimmt und gleichzeitig ein TeX Codesegment erstellt, das die \includegraphics Anweisung einschl. der korrekten BoundingBox beinhaltet:
\ifpdf
\includegraphics[bb=70 674 450 767]{Codierung_von_Information/Codierung_Decodierung.png}
\else
\includegraphics{Codierung_von_Information/Codierung_Decodierung.eps}
\fi
Dieses Codesegment paste ich dann einfach in mein TeX Dokument. Fertig.
Hier das VBA Script:
Sub CreatePsfromSelection()
Dim status As Double
Dim tempFilenameBase As String
Dim psFilename As String
Dim epsFilename As String
tempFilenameBase = InputBox("Please enter base name of files to generate")
If tempFilenameBase = "" Then End
psFilename = tempFilenameBase + ".ps"
epsFilename = tempFilenameBase + ".eps"
Selection.Copy
Application.Documents.Add
Selection.Paste
ActivePrinter = "HP LaserJet 5P/5MP PostScript"
If Dir(psFilename) <> "" Then
Kill psFilename
End If
'print to PS
ActiveDocument.PrintOut Range:=wdPrintAllDocument, OutputFileName:=psFilename, Item:= _
wdPrintDocumentContent, Copies:=1, Pages:="", PageType:=wdPrintAllPages, _
ManualDuplexPrint:=False, Collate:=True, Background:=True, PrintToFile:=True, _
PrintZoomColumn:=0, PrintZoomRow:=0, PrintZoomPaperWidth:=0, _
PrintZoomPaperHeight:=0
ActiveDocument.Close SaveChanges:=False
Shell "perl E:\Dev\perl\ps_to_eps_and_png.pl """ + tempFilenameBase + """", 0
End Sub
Und hier das perl Script:
#!/usr/bin/perl
if ($#ARGV eq -1)
{
print "usage\n";
print "=====\n\n";
print "perl ps_to_eps_and_png.pl <path and filename without extension>\n\n";
exit;
}
my $fileNameBase = "$ARGV[0]";
my $psFileName = "$fileNameBase".".ps";
my $epsFileName = "$fileNameBase".".eps";
my $pngFileName = "$fileNameBase".".png";
my $texFileName = "$fileNameBase".".txt";
my $gswin32c = "C:/Programme/gs/gs8.00/bin/gswin32c.exe";
#-e "$psFileName" or die "could not open $psFileName";
-e "$gswin32c" or die "could not find Ghostview executable $gswin32c";
my $fileNameBaseWithoutDir = $fileNameBase;
$fileNameBaseWithoutDir =~ s(^.*\\(.*\\))(\1); # remove path except for the last folder
$fileNameBaseWithoutDir =~ s/\\/\//; # convert Windows path style to Unix path style
system("$gswin32c -q -dNOPAUSE -sDEVICE#epswrite -dBATCH -sOutputFile#\"$epsFileName\" \"$psFileName\"") == 0 or die "Could not create EPS file $epsFileName";
system("$gswin32c -q -dNOPAUSE -sDEVICE#png16m -dBATCH -r300 -sOutputFile#\"$pngFileName\" \"$epsFileName\"") == 0 or die "Could not create PNG file $pngFileName";
open (EPSFILE, "$epsFileName") or die "could not open file $epsFileName";
my $continue = 1;
while ($line = <EPSFILE> and $continue)
{
chomp $line;
if (($boundingBox) = $line =~ /%%BoundingBox:\s*(\d+\s*\d+\s*\d+\s*\d+\s*)/)
{
open (TEXFILE, ">$texFileName") || die "could not open file $texFileName for output";
print TEXFILE "\\ifpdf\n";
print TEXFILE " \\includegraphics[bb=$boundingBox]{$fileNameBaseWithoutDir.png}\n";
print TEXFILE "\\else\n";
print TEXFILE " \\includegraphics{$fileNameBaseWithoutDir.eps}\n";
print TEXFILE "\\fi\n";
close (TEXFILE);
$continue = 0;
}
}
close (EPSFILE);
unlink $psFileName;
1;
Klar, man hätte alles ins VBA Script packen können, doch hatte ich Probleme, den VBA Shell Befehl davon zu überzeugen zu warten, bis das Aufgerufene fertig ist.
Ciao,
Peter
'bin derzeit dabei, ein existierendes Buch unter XP von Word nach LaTex zu portieren. Die Grafiken in den Buch sind mit Word gezeichnet worden, auf der anderen Seite verwende ich WinShell und miktex (beides sollte für den hier vorgestellten Ansatz aber nicht erforderlich sein).
Nach langem Suchen habe ich mir jetzt einen Weg gebastelt, der sehr bequem ist und sowohl für DVIs (eps Grafiken) als auch für PDFs (png Grafiken) taugt.
Voraussetzungen:
"HP LaserJet 5P/5MP PostScript" ist eingerichtet. Mit dem "Generic Postscript Printer" funktioniert es leider nicht.
gsview muss installiert sein
perl muss installiert sein
Zum einen habe ich ein VBA Script geschrieben, mit dem eine beliebige Markierung (z.B. eine Grafik) in einem Word Dokument per Knopfdruck in eine PostScript Datei geschrieben wird. Das Script ruft am Ende ein perl Script auf, das dann die Konvertierung in eps und png übernimmt und gleichzeitig ein TeX Codesegment erstellt, das die \includegraphics Anweisung einschl. der korrekten BoundingBox beinhaltet:
\ifpdf
\includegraphics[bb=70 674 450 767]{Codierung_von_Information/Codierung_Decodierung.png}
\else
\includegraphics{Codierung_von_Information/Codierung_Decodierung.eps}
\fi
Dieses Codesegment paste ich dann einfach in mein TeX Dokument. Fertig.
Hier das VBA Script:
Sub CreatePsfromSelection()
Dim status As Double
Dim tempFilenameBase As String
Dim psFilename As String
Dim epsFilename As String
tempFilenameBase = InputBox("Please enter base name of files to generate")
If tempFilenameBase = "" Then End
psFilename = tempFilenameBase + ".ps"
epsFilename = tempFilenameBase + ".eps"
Selection.Copy
Application.Documents.Add
Selection.Paste
ActivePrinter = "HP LaserJet 5P/5MP PostScript"
If Dir(psFilename) <> "" Then
Kill psFilename
End If
'print to PS
ActiveDocument.PrintOut Range:=wdPrintAllDocument, OutputFileName:=psFilename, Item:= _
wdPrintDocumentContent, Copies:=1, Pages:="", PageType:=wdPrintAllPages, _
ManualDuplexPrint:=False, Collate:=True, Background:=True, PrintToFile:=True, _
PrintZoomColumn:=0, PrintZoomRow:=0, PrintZoomPaperWidth:=0, _
PrintZoomPaperHeight:=0
ActiveDocument.Close SaveChanges:=False
Shell "perl E:\Dev\perl\ps_to_eps_and_png.pl """ + tempFilenameBase + """", 0
End Sub
Und hier das perl Script:
#!/usr/bin/perl
if ($#ARGV eq -1)
{
print "usage\n";
print "=====\n\n";
print "perl ps_to_eps_and_png.pl <path and filename without extension>\n\n";
exit;
}
my $fileNameBase = "$ARGV[0]";
my $psFileName = "$fileNameBase".".ps";
my $epsFileName = "$fileNameBase".".eps";
my $pngFileName = "$fileNameBase".".png";
my $texFileName = "$fileNameBase".".txt";
my $gswin32c = "C:/Programme/gs/gs8.00/bin/gswin32c.exe";
#-e "$psFileName" or die "could not open $psFileName";
-e "$gswin32c" or die "could not find Ghostview executable $gswin32c";
my $fileNameBaseWithoutDir = $fileNameBase;
$fileNameBaseWithoutDir =~ s(^.*\\(.*\\))(\1); # remove path except for the last folder
$fileNameBaseWithoutDir =~ s/\\/\//; # convert Windows path style to Unix path style
system("$gswin32c -q -dNOPAUSE -sDEVICE#epswrite -dBATCH -sOutputFile#\"$epsFileName\" \"$psFileName\"") == 0 or die "Could not create EPS file $epsFileName";
system("$gswin32c -q -dNOPAUSE -sDEVICE#png16m -dBATCH -r300 -sOutputFile#\"$pngFileName\" \"$epsFileName\"") == 0 or die "Could not create PNG file $pngFileName";
open (EPSFILE, "$epsFileName") or die "could not open file $epsFileName";
my $continue = 1;
while ($line = <EPSFILE> and $continue)
{
chomp $line;
if (($boundingBox) = $line =~ /%%BoundingBox:\s*(\d+\s*\d+\s*\d+\s*\d+\s*)/)
{
open (TEXFILE, ">$texFileName") || die "could not open file $texFileName for output";
print TEXFILE "\\ifpdf\n";
print TEXFILE " \\includegraphics[bb=$boundingBox]{$fileNameBaseWithoutDir.png}\n";
print TEXFILE "\\else\n";
print TEXFILE " \\includegraphics{$fileNameBaseWithoutDir.eps}\n";
print TEXFILE "\\fi\n";
close (TEXFILE);
$continue = 0;
}
}
close (EPSFILE);
unlink $psFileName;
1;
Klar, man hätte alles ins VBA Script packen können, doch hatte ich Probleme, den VBA Shell Befehl davon zu überzeugen zu warten, bis das Aufgerufene fertig ist.
Ciao,
Peter