2015-05-08 302 views
7

我有myfile.ps与包括一个矢量图像。 但是当我运行ps2pdf:保留页面大小

ps2pdf myfile.ps 

似乎输出页面大小为A4:矢量图像过大,成为切掉,所以大约一英寸丢失。

下面的伪报头在输出的PDF文件的印刷,除原来的矢量图像:

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

是否有任何选项或任何方式对PS文件转换为保留一个PDF 原始纸张尺寸?

回答

6

我怀疑你引用的2行是否真的在PS文件里面引用过......不是他们前面有%评论字符?

  • 如果他们不是通过这样的人物preceeded,没有PS解释会的工作,因为他们没有已知的PostScript运营商。

  • 如果他们通过这样的字符preceeded,PS解释会简单地忽略他们,因为......他们只是评论! :-)

如果你想这个PS文件转换为PDF,最好是直接运行的Ghostscript(ps2pdf只有大约一个Ghostscript的命令薄shell脚本包装反正):

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

说明:

  1. -g...给出像素的中等大小。
  2. A4页面的尺寸为595x842pt(PostScript点数)。
  3. 1英寸与72 PostScript点相同。
  4. 默认情况下,默认情况下,Ghostscript在处理PDF输出时计算每英寸720像素的分辨率。
  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'?错误信息是什么?你的输入postscript是否包含一个边界框?您似乎已经降低了投票率,但是您没有提供很多信息。 – 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; 
}