PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PS -> EPS / PDF ... Grafik zuschneiden?



derjanosch
06-11-2004, 18:21
Hallo.

Folgendes Szenario:
Aus einer Anwendung (PSPICE, es handelt sich um Schaltplaene im Vektorformat, das Programm bietet keine Moeglichkeit, direkt PNG/PS zu speichern) speichere ich ueber einen PS-Druckertreiber (momentan verwende ich den "Apple LaserWrite v23.0") meine in LaTeX einzubindende Grafik als PostScript.

Das klappt auch ganz wunderbar, ich erhalte dann eine schoene PS-Datei mit dem Inhalt. Das Problem ist dabei allerdings, dass die entstandene PS-Datei von den Ausmassen her natuerlich etwas "groesser" ist als der eigentlich Inhalt, da der ja nicht immer eine ganze (DIN A4-)Seite fuellen muss.

Mittels "GSview" konnte ich bereits ueber den Befehl "PS to EPS" eine EPS-Datei erzeugen, die dann auch die richtigen "Maße" besitzt (die BoundingBox lasse ich automatisch berechnen). Anscheinend wird die Grafik dabei aber nicht wirklich zugeschnitten, sondern eben nur die "BoundingBox" aktualisiert.

Wenn ich nun die EPS-Datei in mein LaTeX-Dokument einfuege:


\includegraphics[width=1.00\textwidth]{meine_grafik}

klappt das auch wunderbar, bei der EPS-Datei wird anscheinend die BoundingBox automatisch richtig interpretiert und die Grafik entsprechend eingefuegt.

Nun moechte ich natuerlich auch direkt PDF erzeugen koennen und wollte dazu die EPS in PDF umwandeln.

Folgende Methoden habe ich dazu benutzt:

- Direkt ueber die Kommandozeile: epstopdf meine_grafik.eps
-> Ergebnis: erzeugtes PDF ist von den Ausmassen wieder so gross wie die PS-Datei (also in meinem Fall eine ganze A4-Seite)

- Ueber GSview (meine_grafik.eps): Datei -> Konvertierung -> pdfwrite, "Schrumpfe auf Seitengroesse"
-> Ergebnis: "leere" PDF-Datei, zumindest wird nichts angezeigt, GSview bringt aber auch keine Fehler

- Ueber GSview (meine_grafik.ps): Datei -> Konvertierung -> pdfwrite, "Schrumpfe auf Seitengroesse"
-> Ergebnis: wie bei der ersten Methode, A4-groß

Bisher habe ich es so gemacht, dass ich in meinem Dokument eine Fallunterscheidung mache und bei der PDF-Erzeugung den "viewport"-Parameter angebe, dann funktioniert auch alles korrekt:



\ifpdf
\includegraphics[width=1.00\textwidth, viewport=48 325 546 797]{meine_grafik}
\else
\includegraphics[width=1.00\textwidth]{meine_grafik}
\fi

Allerdings ist das doch sehr umstaendlich und ich muss auch jedes mal haendlich den BoundingBox-Parameter der Grafik nachschauen und eintragen ... gibt es denn da keine Moeglichkeit, die EPS-Datei in eine "gleich-große" PDF- bzw. PNG-Datei zu konvertieren?!

Danke fuer eure Hilfe!

huckfinn
06-11-2004, 21:39
Hi,

Schau dir mal ghostscript (gs) an. Das kann eine ganze Menge und werkelt hinter der gsview Geschichte. Mit diesem Tool kannst du deine Grafik auf eine Reihe von Rasterformaten bwz. Drucker-Code rippen sowie Skalierungen der Grafik wie shift, scale etc. vornehmen. Ein einfaches



man gs


sollte Aufschluß bringen. Der ganze PS- bzw. PDF-Schnokus ist recht
komplex. Vielleicht solltest du dir ein Buch von Thomas Maerz beschaffen .Die "Postscript und PDF-Bibel" zzg. ein etwas bombastischer Titel aber sehr gut. Ich glaube den GS Teil kann man sogar über das Netz herunterladen (siehe http://www.pdflib.com) .

Bis denne Huck

CPPeter
07-11-2004, 00:32
Hi,

in der Einrichtung etwas aufwendig, dafür danach komfortabel ist diese (http://www.mrunix.de/forums/showthread.php?t=36206) Vorgehensweise.

Lass einfach das VB script weg und verwende das perl Script, um die BoundingBox zu extrahieren und den tex Code für die korrekte Einbindung zu erzeugen.

Ich habe allerdings in der zwischenzeit festgestellt, dass die BoundingBox für PDFs zu klein ist (in machnen Fällen).

Daher hier das neue Script, das die EPS- Höhe um 10 erhöht:


#!/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 -r120 -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+)/)
{
($dummy, $bbtop) = $boundingBox =~ /(\d+\s*\d+\s*\d+\s*)(\d+)/;
$boundingBox =~ s/(\d+\s*\d+\s*\d+\s*)\d+/\1/;
$bbtop = $bbtop + 10;
$boundingBox = $boundingBox.$bbtop;
open (TEXFILE, ">$texFileName") || die "could not open file $texFileName for output";
print TEXFILE "\\begin{figure}[h]\n";
print TEXFILE "\\centering\n";
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";
print TEXFILE "\\caption{Beschriftung}\n";
$fileNameBaseWithoutDir =~ s(^.*/)();
print TEXFILE "\\label{fig:".$fileNameBaseWithoutDir."}\n";
print TEXFILE "\\end{figure}\n";
close (TEXFILE);
$continue = 0;
}
}
close (EPSFILE);
unlink $psFileName;
1;


'hoffe das hilft.

Ciao,
Peter

red.iceman
08-11-2004, 12:34
epstopdf funktioniert bei mir gut.



epstopdf transforms the Encapsulated PostScript file epsfile so that it is guaranteed to start at the 0,0 coordinate, and it sets a page size exactly corresponding to the BoundingBox. This means that when Ghostscript renders it, the result needs no cropping, and the PDF Medi-aBox is correct. The result is piped to Ghostscript and a PDF version written.

If the bounding box is not right, of course, you have problems...


Vielleicht ist deine eps-Datei nicht okay....

ri