PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : my way: eps/png Grafiken einbinden für dvi/pdf



CPPeter
06-10-2004, 18: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

CPPeter
06-10-2004, 22:07
Ergänzung:
wer ohne perl/VBA einfach nur konvertieren möchte, kann dies basierend auf einer PS-Grafik mittels gswin32c.exe wie folgt tun:

1) EPS erzeugen:


gswin32c.exe -q -dNOPAUSE -sDEVICE#epswrite -dBATCH -sOutputFile#mygrafic.eps mygrafic.ps


2) PNG aus EPS erzeugen:


gswin32c.exe -q -dNOPAUSE -sDEVICE#png16m -dBATCH -r300 -sOutputFile#mygrafic.png mygrafic.eps


"-r300" gibt übrigens die Auflösung an. Man kann also die Qualität der Grafik (und den benötigten Speicherplatz) frei skalieren.
gswin32 -?
liefert weitere Infos.

Adele,
Peter

idb
31-05-2005, 10:19
Hi,

warum nicht einfach mit ImageMagick ein .png aus dem .eps erzeugen und einbinden ?
Bei \includegraphics kann man nämlich die Extension weglassen, im Header eine Fallunterscheidung für latex und pdflatex machen und die Programme suchen sich ihre Bilder selber.

In WinShell gibt es ein DemoProjekt, das das zeigt.

greets
Ingo

idefix
31-05-2005, 12:23
Warum nicht das eps in ein pdf wandeln und das einbinden?
Damit bleibt es, wenn es eine Vektorgrafik ist auch eine Vektorgrafik.

Lass die Endung einfach weg, LaTeX sucht sich dann die richtige selber raus.