Как объединить два файла PostScript вместе?

Я пытаюсь объединить два или более файла postscript в один. Я пробовал объединение, но оно не работает, поскольку каждый файл postscript может иметь разные заголовки ресурсов.

Кто-нибудь делал это раньше? Существуют ли какие-либо библиотеки (коммерческие или с открытым исходным кодом)? Я не против библиотек C ++, C # или даже Java.

Отредактировано

Я пытаюсь объединить два или более файла postscript в один. Я пробовал объединение, но оно не работает, поскольку каждый файл postscript может иметь разные заголовки ресурсов.

Кто-нибудь делал это раньше? Существуют ли какие-либо библиотеки (коммерческие или с открытым исходным кодом)? Я не против библиотек C ++, C # или даже Java.

Отредактировано

Я пытаюсь объединить два или более файла postscript в один. Я пробовал объединение, но оно не работает, поскольку каждый файл postscript может иметь разные заголовки ресурсов.

Кто-нибудь делал это раньше? Существуют ли какие-либо библиотеки (коммерческие или с открытым исходным кодом)? Я не против библиотек C ++, C # или даже Java.

Отредактировано Это большие файлы postscript (более 200 МБ), и их назначение - только для цветной печати (не для просмотра в Интернете).

Заключение

  1. ps2write не является ответом, поскольку он не поддерживает DSC.
  2. pswrite, как правильно указал читатель pipitas, производит вывод L1. Это не решение.
  3. Использование pdfwrite возможно. В этом варианте мы конвертируем два ps в PDF, а затем конвертируем объединенный PDF в ps. С этим решением может быть проблема, так как во время преобразования может быть потеряна некоторая информация. Помимо дополнительных шагов преобразования, требуются дополнительные ресурсы и время.
  4. Если нам не нужно просматривать выходной файл, объединение двух файлов postscript вместе со следующей строкой «false 0 startjob pop», вставленной между файлами, также является решением. (См. Также эту ссылку )

В заключение, временным решением для объединения двух файлов postscript является вариант 3 или 4.

7
задан Syd 19 August 2010 в 07:18
поделиться

3 ответа

Вот пример командной строки Ghostscript, которая конвертирует и объединяет два (или более) файла PostScript в один PDF-файл за один раз:

 gswin32c.exe ^
   -o c:/path/to/output.pdf ^
   -sDEVICE=pdfwrite ^
   -dPDFSettings=/Screen ^
   [...more desired parameters (optional)...] ^
   /path/to/first.ps ^
   /path/to/second.ps ^
   /path/to/third.pdf

Редактировать: мой первый снимок ошибочно предполагал входные файлы PDF. Конечно, он также работает с PostScript (или даже смесью PS / PDF) ... И вывод также может быть PS.

13
ответ дан 6 December 2019 в 08:40
поделиться

Конечно, вы также можете объединить различные входные файлы (PS, PDF или их смесь) в один файл PostScript. Я включу еще несколько параметров настройки в следующий пример командной строки, которая увеличит объем оперативной памяти для Ghostscript на 800 Мб (при условии, что у вас есть машина с таким объемом памяти):

 gswin32c.exe ^
   -o c:/path/to/output.ps ^
   -sDEVICE=ps2write ^
  -c "800000000 setvmthreshold" ^
   [...more desired parameters (optional)...] ^
   /path/to/first.ps ^
   /path/to/second.ps ^
   /path/to/third.ps

Вы должны указать, какое приложение создало ваши PostScripts, и с какими настройками. Только тогда вы сможете рассчитывать на более конкретный совет. Ваши PostScripts могут, например, содержать изображения высокого разрешения (например, 1200dpi), в то время как ваше устройство печати может быть способно только на 600dpi. В этом случае понижение дискретизации до 600dpi позволит сделать файлы значительно меньше без потери качества.

3
ответ дан 6 December 2019 в 08:40
поделиться

GhostScript в Linux поставляется со сценарием оболочки под названием psmerge (который устанавливается в каталог /usr/bin). После нескольких простых проб выяснилось, что эта программа учитывает определения ресурсов. Она действительно полагается на то, что ваши PostScript-программы строго соответствуют Adobe DSC. Содержание скрипта слияния воспроизводится здесь с учетом лицензии:

© Angus J. C. Duggan 1991-1995

#!/usr/bin/perl
eval 'exec perl -S $0 "$@"'
    if $running_under_some_shell;

# psmerge: merge PostScript files produced by same application and setup
# usage: psmerge [-oout.ps] file1.ps file2.ps ...
#
# Copyright (C) Angus J. C. Duggan 1991-1995
# See file LICENSE for details.

use strict;
$^W = 1;
my $prog = ($0 =~ m,([^/\\]*)$,) ? $1 : $0;
my $outfile = undef;

usage() unless @ARGV;

while ($ARGV[0] =~ /^-/) {
   $_ = shift;
   if (/^-o(.+)/) {
      $outfile = $1;
   } elsif (/^-t(horough)?$/) {
      # This doesn't do anything, but we leave it for backward compatibility.
   } else {
      usage();
   }
}

my $gs = find_gs();
if (defined $gs)
{
   # Just invoke gs
   $outfile = '/dev/stdout' unless defined $outfile;
   exec +(qw(gs -q -dNOPAUSE -dBATCH -sDEVICE=pswrite),
      "-sOutputFile=$outfile", '-f', @ARGV);
   die "$prog: exec /usr/bin/gs failed\n";
}
else
{
   warn +("$prog: /usr/bin/gs not found; falling back to old," .
      " less functional behavior\n");
}

if (defined $outfile)
{
   if (!close(STDOUT) || !open(STDOUT, ">$outfile")) {
      print STDERR "$prog: can't open $1 for output\n";
      exit 1;
   }
}

my $page = 0;
my $first = 1;
my $nesting = 0;

my @header = ();
my $header = 1;

my @trailer = ();
my $trailer = 0;

my @pages = ();
my @body = ();

my @resources = ();
my $inresource = 0;

while (<>) {
   if (/^%%BeginFont:/ || /^%%BeginResource:/ || /^%%BeginProcSet:/) {
      $inresource = 1;
      push(@resources, $_);
   } elsif ($inresource) {
      push(@resources, $_);
      $inresource = 0 if /^%%EndFont/ || /^%%EndResource/ || /^%%EndProcSet/;
       } elsif (/^%%Page:/ && $nesting == 0) {
      $header = $trailer = 0;
      push(@pages, join("", @body)) if @body;
      $page++;
      @body = ("%%Page: ($page) $page\n");
       } elsif (/^%%Trailer/ && $nesting == 0) {
      push(@trailer, $_);
      push(@pages, join("", @body)) if @body;
      @body = ();
      $trailer = 1;
      $header = 0;
       } elsif ($header) {
      push(@trailer, $_);
      push(@pages, join("", @body)) if @body;
      @body = ();
      $trailer = 1;
      $header = 0;
       } elsif ($trailer) {
      if (/^%!/ || /%%EOF/) {
         $trailer = $first = 0;
      } elsif ($first) {
         push(@trailer, $_);
      }
       } elsif (/^%%BeginDocument/ || /^%%BeginBinary/ || /^%%BeginFile/) {
      push(@body, $_);
      $nesting++;
       } elsif (/^%%EndDocument/ || /^%%EndBinary/ || /^%%EndFile/) {
      push(@body, $_);
      $nesting--;
       }
}

print @trailer;

sub find_gs
{
   my $path = $ENV{'PATH'} || "";
   my @path = split(':', $path);
   foreach my $dir (@path)
   {
      return "$dir/gs" if -x "$dir/gs";
   }
   undef;
}

sub usage
{
   print STDERR "Usage: $prog [-oout] file...\n";
   exit 1;
}
1
ответ дан 6 December 2019 в 08:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: