Anzeige:
Ergebnis 1 bis 4 von 4

Thema: my way: eps/png Grafiken einbinden für dvi/pdf

  1. #1
    Registrierter Benutzer
    Registriert seit
    27.09.2004
    Beiträge
    37

    my way: eps/png Grafiken einbinden für dvi/pdf

    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:
    1. "HP LaserJet 5P/5MP PostScript" ist eingerichtet. Mit dem "Generic Postscript Printer" funktioniert es leider nicht.
    2. gsview muss installiert sein
    3. 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:
    Code:
    \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:
    Code:
    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:
    Code:
    #!/usr/bin/perl
    
    if ($#ARGV eq -1)
    {
    	print "usage\n";
    	print "=====\n\n";
    	print "perl ps_to_eps_and_png.pl \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 =  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

  2. #2
    Registrierter Benutzer
    Registriert seit
    27.09.2004
    Beiträge
    37

    Konvertierung ohne Scripts

    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:
    Code:
    gswin32c.exe -q -dNOPAUSE -sDEVICE#epswrite -dBATCH -sOutputFile#mygrafic.eps mygrafic.ps
    2) PNG aus EPS erzeugen:
    Code:
    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

  3. #3
    Registrierter Benutzer
    Registriert seit
    31.05.2005
    Ort
    Erlangen
    Beiträge
    105
    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
    WinShell - www.winshell.org

  4. #4
    Registrierter Benutzer
    Registriert seit
    02.02.2005
    Beiträge
    74
    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.
    Gruss
    Matthias

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •