2015-05-08 26 views
7

Ho myfile.ps con un'immagine vettoriale inclusa. Ma quando ho eseguitops2pdf: conserva dimensione pagina

ps2pdf myfile.ps 

sembra che la dimensione della pagina di uscita è A4: l'immagine di vettore è troppo grande e diventare tagliare, in modo da circa un pollice è perduto.

Il seguente pseudo-intestazione viene stampata nel file PDF di output, oltre alla immagine vettoriale originale:

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

C'è un'opzione o un modo per convertire il file PS in PDF preservare il formato della carta originale?

risposta

6

Dubito che le 2 righe citate siano realmente all'interno del file PS come citato ... Non sono preceduti da % caratteri di commento?

  • Se non erano preceduto da tali caratteri, senza interprete PS avrebbe funzionato, perché non sono operatori PostScript noti.

  • Se sono preceduto da tali personaggi, l'interprete PS sarebbe semplicemente ignorarli, perché ... sono solo commenti! :-)

Se si desidera convertire il file PS in PDF, è meglio per essere eseguito direttamente Ghostscript (ps2pdf è solo un sottile involucro script di shell in giro un comando Ghostscript in ogni caso):

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

Spiegazione:

  1. -g... dà la dimensione di medie pixel.
  2. Una pagina A4 ha una dimensione di 595x842pt (punti PostScript).
  3. 1 pollice equivale a 72 punti PostScript.
  4. Ghostscript internamente per il calcolo predefinito con una risoluzione di 720 pixel per pollice quando si tratta di output PDF.
  5. Quindi per l'output PDF 595x842pt == 5950x8420px.
  6. Quindi per il tuo caso in questione 8.02x8.62Inches ≈≈ 5775x6207px.
+0

Avevi ragione: ho confuso l'intestazione PDF di output con l'intestazione PS, supponendo erroneamente che fossero la stessa cosa. Ora ho corretto la domanda. Sfortunatamente, con i tuoi valori, l'immagine è ancora tagliata, forse perché quella "intestazione" non era così affidabile. Ma aumentando la dimensione dell'output di alcune centinaia di pixel si ottiene il risultato corretto. Grazie! – BowPark

9

Se il poscritto ingresso ha un EPS BoundingBox, questo dovrebbe preservare la dimensione della pagina:

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

+0

Ho provato questo, ma non ha funzionato. – roy

+0

@roy Quale versione di 'ps2pdf' /' ghostscript'? Qual è stato il messaggio di errore? Il tuo post script di input contiene un riquadro di selezione? Sembra che tu abbia downvoted ma non fornisci molte informazioni. – Raman

+0

Nessun errore mostrato ma il PDF risultante non conserva le dimensioni della pagina. Come dici tu, forse quell'opzione legge il riquadro di delimitazione, ma questa domanda riguarda la dimensione della pagina, che è memorizzata nell'intestazione di DocumentMedia, vedi la mia risposta qui sotto. – roy

0

in base alla risposta del @Kurt Pfeifle ho scritto questo script in Perl per fare il compito:

#! /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; 
}