Я пытаюсь объединить два или более файла postscript в один. Я пробовал объединение, но оно не работает, поскольку каждый файл postscript может иметь разные заголовки ресурсов.
Кто-нибудь делал это раньше? Существуют ли какие-либо библиотеки (коммерческие или с открытым исходным кодом)? Я не против библиотек C ++, C # или даже Java.
Отредактировано
Я пытаюсь объединить два или более файла postscript в один. Я пробовал объединение, но оно не работает, поскольку каждый файл postscript может иметь разные заголовки ресурсов.
Кто-нибудь делал это раньше? Существуют ли какие-либо библиотеки (коммерческие или с открытым исходным кодом)? Я не против библиотек C ++, C # или даже Java.
Отредактировано
Я пытаюсь объединить два или более файла postscript в один. Я пробовал объединение, но оно не работает, поскольку каждый файл postscript может иметь разные заголовки ресурсов.
Кто-нибудь делал это раньше? Существуют ли какие-либо библиотеки (коммерческие или с открытым исходным кодом)? Я не против библиотек C ++, C # или даже Java.
Отредактировано Это большие файлы postscript (более 200 МБ), и их назначение - только для цветной печати (не для просмотра в Интернете).
Заключение
В заключение, временным решением для объединения двух файлов postscript является вариант 3 или 4.
Вот пример командной строки 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.
Конечно, вы также можете объединить различные входные файлы (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 позволит сделать файлы значительно меньше без потери качества.
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;
}