2015-05-08 2 views
7

У меня есть myfile.ps с векторным изображением. Но когда я бегуps2pdf: сохранить размер страницы

ps2pdf myfile.ps 

, кажется, выходной размер страницы A4: вектор изображения слишком велик и стал отрезать, так примерно один дюйм теряется.

Следующая псевдо-заголовок печатается в выходном файле PDF, в дополнение к первоначальному векторного изображения:

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

Есть ли вариант или каким-либо образом преобразовать файл PS в PDF сохраняющих размер оригинальной бумаги?

ответ

6

Я сомневаюсь, что ваши цитируемые 2 строки действительно находятся в файле PS, как указано ... Не преуспели ли они в % комментариях?

  • Если они были не предваряется такими персонажами, не интерпретатор PS не будет работать, потому что они не известны операторы PostScript.

  • Если они являются предваряется такими персонажами, интерпретатор PS будет просто игнорировать их, потому что ... они только комментарии! :-)

Если вы хотите, чтобы преобразовать этот PS файл в формате PDF, то лучше запустить Ghostscript непосредственно (ps2pdf только тонкий сценарий оболочки обертка вокруг команды Ghostscript так или иначе):

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

Пояснение:

  1. -g... дает средний размер в пикселях .
  2. Страница A4 имеет размер 595x842pt (точки PostScript).
  3. 1 Inch - это то же самое, что и 72 точки PostScript.
  4. Ghostscript внутренне по умолчанию вычисляет с разрешением 720 пикселей на дюйм, когда дело доходит до выхода PDF.
  5. Следовательно, для вывода в формате PDF 595x842pt == 5950x8420px.
  6. Следовательно, для вашего дела в вопросе 8.02x8.62Inches ≈≈ 5775x6207px.
+0

Вы были правы: я перепутал выходной заголовок PDF с заголовком PS, ошибочно полагая, что это одно и то же. Теперь я исправил вопрос. С вашими ценностями, к сожалению, изображение все еще обрезается, может быть, потому, что этот «заголовок» был не настолько надежным. Но увеличение размера вывода на несколько сотен пикселей дает правильный результат. Спасибо! – BowPark

9

Если входная приписка имеет EPS BoundingBox, это должно сохранить размер страницы:

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

+0

Пробовал это, но не работал. – roy

+0

@roy Какая версия 'ps2pdf' /' ghostscript'? Каково было сообщение об ошибке? Включен ли ваш вводный постфрейм? Вы, похоже, имеете downvoted, но вы не предоставляете много информации. – Raman

+0

Не отображается ошибка, но полученный PDF-файл не сохраняет размер страницы. Как вы говорите, возможно, этот параметр читает ограничительную рамку, но этот вопрос касается размера страницы, которая хранится в заголовке DocumentMedia, см. Мой ответ ниже. – roy

0

На основании ответа @Kurt Pfeifle, я написал этот сценарий Perl для выполнения задачи:

#! /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; 
} 
Смежные вопросы