2015-05-08 13 views
7

Ich habe myfile.ps mit einem Vektorbild enthalten. Aber wenn ich laufeps2pdf: Seitengröße erhalten

ps2pdf myfile.ps 

scheint es, dass die Ausgangsseitengröße A4 ist: Das Vektor-Bild ist zu groß und wird weggeschnitten, so etwa ein Zoll verloren.

Die folgenden Pseudo-Header in der Ausgabe als PDF-Datei gedruckt werden, zusätzlich zu dem ursprünglichen Vektor-Bild:

PLOT SIZE:8.02x8.62Inches 
Magnification:7354.21X 

Gibt es eine Möglichkeit oder eine Möglichkeit, die PS-Datei in einem PDF-Erhaltung zu konvertieren das Original Papierformat?

Antwort

6

Ich bezweifle Ihre zitierte 2 Zeilen wirklich in der PS-Datei sind wie angegeben ... Werden sie von % Kommentarzeichen Voranstellung?

  • Wenn sie waren nicht durch solche Zeichen vorangestellt, kein PS-Interpreter funktionieren würde, weil sie keine bekannten Postscript-Operatoren sind.

  • Wenn sie sind durch solche Zeichen vorangestellt, würde der PS-Interpreter einfach ignorieren sie, weil ... sie sind nur Kommentare! :-)

Wenn Sie diese PS-Datei in PDF konvertieren mögen, ist es besser, Ghost direkt (ps2pdf ist nur ein dünner Shell-Script-Wrapper um einen Ghost Befehl sowieso) auszuführen:

gs -o myfile.pdf  \ 
    -sDEVICE=pdfwrite \ 
    -g5775x6207  \ 
    -dPDFFitPage  \ 
    myfile.ps 

Erläuterung:

  1. -g... gibt die mittlere Größe in Pixel.
  2. Eine A4-Seite hat die Dimension 595x842pt (PostScript-Punkte).
  3. 1 Zoll entspricht 72 PostScript-Punkten.
  4. Ghostscript intern berechnet standardmäßig mit einer Auflösung von 720 Pixel pro Zoll, wenn es um PDF-Ausgabe geht.
  5. Daher für PDF-Ausgabe 595x842pt == 5950x8420px.
  6. Daher für Ihren Fall in Frage 8.02x8.62Inches ≈≈ 5775x6207px.
+0

Sie hatten recht: Ich habe den Ausgabe-PDF-Header mit dem PS-Header vermischt, fälschlicherweise angenommen, dass sie das gleiche waren. Jetzt habe ich die Frage korrigiert. Mit deinen Werten ist das Bild leider immer noch abgeschnitten, vielleicht weil dieser "Header" nicht so vertrauenswürdig war. Wenn man jedoch die Ausgabegröße um einige hundert Pixel erhöht, erhält man das korrekte Ergebnis. Vielen Dank! – BowPark

9

Wenn das Eingangspostscript BoundingBox einen EPS hat, diese die Seitengröße bewahren soll:

ps2pdf -dEPSCrop <input.ps> <output.pdf>

+0

Versucht dies, hat aber nicht funktioniert. – roy

+0

@roy Welche Version von 'ps2pdf' /' ghostscript'? Was war die Fehlermeldung? Enthält Ihr eingegebenes PostScript eine Bounding Box? Sie scheinen heruntergeblättert zu sein, aber Sie liefern nicht viele Informationen. – Raman

+0

Kein Fehler angezeigt, aber die resultierende PDF behält die Seitengröße nicht bei. Wie Sie vielleicht sagen, liest diese Option die Bounding Box, aber diese Frage bezieht sich auf die Seitengröße, die in der DocumentMedia-Kopfzeile gespeichert ist, siehe meine Antwort unten. – roy

0

Basierend auf @Kurt Pfeifles Antwort, die ich diesen Perl-Skript schrieb die Aufgabe zu tun:

#! /usr/bin/env perl 
use strict; 
use warnings; 

use Scalar::Util qw(looks_like_number); 
use List::Util qw(all); 


sub ps2pdf; 
sub get_ps_headers; 
sub get_media_size; 
sub main; 

# Run the program 
main(); 


# Function: main 
# 
# Program's entry point. 
# 
sub main { 
    for (@ARGV) { 

     # check input file 
     if(not -r) { 
     print "WARN: Cannot read input file: $_\n"; 
     next; 
     } 

     # build PDF file name 
     my $pdf = $_; 
     $pdf =~ s/(\.e?ps)?$/.pdf/i; 

     ps2pdf($_, $pdf); 
    } 
} 


# Function: ps2pdf 
# 
# Converts a PostScript file to PDF format using GhostScript, 
# keeping the medium size. 
# 
# Params: 
# 
#  $ps_file - (string) Input [E]PS file name 
#  $pdf_file - (string) Output PDF file name 
# 
sub ps2pdf { 
    my ($ps_file, $pdf_file) = @_; 
    my $cmd = "gs -q -sDEVICE=pdfwrite -dPDFFitPage "; 

    # try to find the media size 
    my ($width, $height) = get_media_size(get_ps_header($ps_file)); 

    # keep media size 
    if(defined $height) { 
     $cmd .= "-g${width}x${height} "; 
    } 

    # set input/output 
    $cmd .= "-o $pdf_file $ps_file"; 

    print "Running: $cmd\n"; 

    system($cmd); 
} 


# Function: get_media_size 
# 
# Computes the size of a PostScript document in pixels, 
# from the headers in the PS file. 
# 
# Params: 
# 
#  $hdr - (hash ref) Parsed PS header values 
# 
# Returns: 
# 
#  On success: Two-element array holding the document's width and height 
#  On failure: undef 
# 
sub get_media_size { 
    my ($hdr) = @_; 

    # we need the DocumentMedia header 
    return undef if not defined $hdr->{DocumentMedia}; 

    # look for valid values 
    my @values = split(/\s+/, $hdr->{DocumentMedia}); 
    return undef if scalar @values < 3; 
    my ($width, $height) = @values[1, 2]; 

    return undef if not all { looks_like_number($_) } ($width, $height); 

    # Ghostscript uses a default resolution of 720 pixels/inch, 
    # there are 72 PostScript points/inch. 
    return ($width*10, $height*10); 
} 


# Function: get_ps_header 
# 
# Parses a PostScript file looking for headers. 
# 
# Params: 
# 
#  $ps_file - (string) Path of the input file 
# 
# Returns: 
# 
#  (hash ref) - As expected, keys are header names, 
#  values are corresponding header values. A special key 
#  named `version' is included for headers of the type 
#  `PS-Adobe-3.0' 
# 
sub get_ps_header { 
    my ($ps_file) = @_; 
    my %head; 

    open my $fh, "<$ps_file" or die "Failed to open $ps_file\n"; 
    while(<$fh>) { 
     # look for end of header 
     last if /^%%EndComments\b/; 

     # look for PS version 
     if(/^%!(\w+)/) { 
     $head{version} = $1; 
     } 

     # look for any other field 
     # Ex: %%BoundingBox: 0 0 1008 612 
     elsif(/^%%(\w+)\s*:\s*(.*\S)/) { 
     $head{$1} = $2; 
     } 

     # discard regular comments and blank lines 
     elsif(/^\s*(%.*)?$/) { 
     next; 
     } 

     # any other thing will finish the header 
     else { 
     last; 
     } 
    } 

    return \%head; 
}