Je suis en train de fusionner deux ou plusieurs fichiers Postscript en un seul. J'ai essayé concaténation mais il ne fonctionne pas comme chaque fichier Postscript peuvent avoir différents en-tête de ressource. P>
Quelqu'un at-il fait ça avant? Y a-t-il des bibliothèques (source commerciale ou ouverte) là-bas? Je ne me dérange pas C ++, C # ou même les bibliothèques Java. P>
Edité strong>
Ce sont de gros fichiers Postscript (plus de 200 Mo) et leur but est uniquement pour l'impression couleur (pas pour le visionnement en ligne). P>
Conclusion strong> p>
En conclusion, la solution provisoire pour fusionner deux fichiers Postscript sont l'option 3 ou 4. P>
6 Réponses :
Voici un exemple de guLiche de Ghostscript, qui convertirait et fusionnerait les deux (ou plus) fichiers PostScript en un PDF dans une option une option: edit: forte > Mon premier coup avait faussement supposé des fichiers d'entrée PDF. Il fonctionne bien sûr avec PostScript également (ou même un mélange de PS / PDF) ... et la sortie peut également être PS. P> P>
Salut pipitas. Merci pour les conseils (je vous donne 1 point), mais je ne peux pas utiliser l'approche PDF, car il aurait besoin de moi pour convertir de PostScript en PDFS, puis fusionner PDFS à la post-scriptum avant de convertir le PDF fusionné en PostScript. Je suis allé sur ce chemin avant et c'était très très lent (le processus ne s'est pas terminé; Je l'ai arrêté après 6 heures). Remarque: j'ai de très gros fichiers postscript. Êtes-vous au courant d'un pure PostScript Evaoch?
Vous avez assez de "conversions" à beaucoup ici: aurait besoin de moi pour convertir de PostScript en PDFS, puis fusionner PDFS à la post-scriptum avant de convertir le PDF fusionné en PostScript i> ?? - Cela dépend également de vos fournisseurs de services d'impression. Parfois, ces gars do b> préfèrent pdf (et pdf sont plus petits, car ils sont compressés), et parfois ils ont même des imprimantes qui consomment PDF (pas PostScript). - Si votre processus ne s'est pas terminé, vous ne saviez pas les commutateurs pour modifier des indemnités de performance et de RAM supérieures?
@papitas .. Typo sur mon commentaire précédent. L'approche PDF est 1) Convertissez chaque PostScript en PDF 2) Fusionner les PDF en un PDF 3) Convertissez le PDF fusionné en PostScript.
@papitas. Merci pour la réponse mise à jour. Je me souviens que j'ai déjà essayé, mais j'ai perdu la haute résolution dans le fichier fusionné -> gswin32c.exe -o c: \ tempt \ test \ sorties.ps -sdevice = pswrite% 1% 2. Je me souviens également de définir l'option "-r", mais la taille de la sortie est devenue beaucoup trop grande. Y a-t-il des paramètres que je devrais utiliser pour conserver le haut document d'origine?
@Syd: pswrite code> est le périphérique PostScript qui par défaut peut écrire des données de niveau 1 postScript. Et PS L1 ne connaît pas certains opérateurs de niveau HI qui adobe ajouté à la langue plus tard, à PS L2 et PS L3. D'où la taille de sortie plus grande (F.e. par pixélisation de certains types de polices). Vous pouvez essayer d'ajouter
-dlanguagelevel = 3 code> à votre commande. (Toutefois, le niveau 3 de GhostScript génère actuellement la même sortie que son niveau 2 ...)
@Syd: le périphérique ps2write code> convertit également des polices en polices bitmap si celles ne sont pas disponibles sinon (F.e. Si l'incorporation est interdite par sa licence). Je n'ai pas beaucoup de temps maintenant, mais plus tard ce soir, je pourrai peut-être entraîner une ligne de commande complète avec toutes les options pouvant être utiles pour vous permettre de minimiser la sortie PS Sortie Sans compromettre la qualité d'impression ...
@Papitas, je vais marquer votre réponse comme la meilleure réponse. De mes recherches, le PS2WRITE ne prend pas en charge DSC. pswrite que vous avez souligné produit une sortie L1. Le grand fichier est causé par le rastering. À ce stade, il existe deux options: 1) est d'utiliser PDFWRITE pour convertir les deux PS en PDF, puis convertir une utilisation PDF fusionnée sur un PS. 2) Pour concéder les deux fichiers PostScript (avec le "False 0 StartJob Pop" entre les fichiers). Les deux ne sont pas idéaux mais au moins produiront une production de travail. Jusqu'à ce qu'il y ait une meilleure solution, votre avantage m'a donné au moins une solution provisoire. Merci beaucoup :)
Salut pipitas, je suis tellement désolé. Je viens de me rendre compte que je me trompe tout cela. Ma faute. Mes sincères excuses :)
Bien sûr, vous pouvez également fusionner divers fichiers d'entrée (PS, PDF ou un mélange d'entre eux) dans un fichier PostScript. Je vais inclure quelques autres paramètres de peaufinage dans l'exemple suivant, qui augmentera l'allocation de RAM pour Ghostscript de 800 Mo (à condition que vous disposiez d'une machine avec une grande quantité de mémoire):
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
Merci pipitas. Vu votre réponse avec PS2Write au lieu de pswrite. Ajoutez un point de plus à vous pour la deuxième réponse. Je vais essayer cela à la prochaine commodité. Oups. En ce qui concerne votre question, l'application qui produit la PostScript est un produit de fournisseur tiers.
@papitas - a ajouté mes commentaires ci-dessous.
Ghostscript sur Linux est livré avec un script shell appelé © Angus J. C. Duggan 1991-1995 B> P> Psmerge code> (qui est installé dans le répertoire
/ USR / bin code>). Après quelques essais simples, il semble que ce programme prend en compte les définitions de ressources. Il s'appuie sur le fait que vos programmes PostScript sont strictement conformes au Adobe DSC . Le contenu du script de fusion reproduit ici avec considération de la licence:
#!/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;
}
Merci pour votre réponse. Psmerge n'est pas disponible dans le monde Windows (pas partie des utilitaires fantômes). Il est probablement disponible dans l'un des outils d'outils CGYWIN. Cela dit, merci d'avoir souligné le strict conformité du format DSC avant de pouvoir être utilisé (1 point). Mes recherches ont montré que de nombreux utilisateurs n'avaient pas beaucoup de succès avec Psmerge. Peut-être que je suis meilleur avec la commande "FALSE 0 STARTJOB POP" entre le fichier PostScript comme solution provisoire.
@Syd: Que diriez-vous d'un simple / sauvegarde code> au début de chaque document et
sauvegardj restaures code> à la fin? Je ne sais pas si cela a un effet équivalent.
Il ne fait aucune différence pour "Faux 0 startjob pop". Mais merci pour la suggestion (+1 à votre commentaire).
Psmerge peut être obtenu à Ubuntu dans le paquet Psutils
J'ai été capable de fusionner avec succès plus de 100 fichiers PostScript (plus de 1500 pages) en utilisant les deux %% Début Document / %% Document final et les faux méthodes de StartJob POP. P>
Le problème que je vais avoir est lors de l'impression du fichier fusionné que l'imprimante pause pendant 20 à 45 secondes entre les fichiers fusionnés. P>
Quelqu'un avait des problèmes similaires? P>
FYI J'ai constaté que cela ne fonctionne pas correctement dans un cas - si un fichier, mais le premier fichier en a des liens, ils ne seront pas corrects dans le fichier PDF fusionné final. En particulier, si le second pdf a un lien vers sa deuxième page, il finira par être un lien vers la deuxième page du document fusionné, qui n'est pas correct ... P>
Notez que PDFTK (qui peut être téléchargé gratuit) obtiendra les liens corrects. p>
+1 pour pdftk. Voici un site en ligne qui le fait: Nublue.co.uk/tools/pdftk
en tant qu'OP mentionné dans les conclusions de la question, concaténer les fichiers avec La ligne entre les deux devraient faire le tour. Donc, dans Bash, on pourrait écrire quelque chose comme p> Cependant, comme la question mentionne également que cela n'est utile que pour l'impression (ou la conversion PDF), un spectateur ne parviendra probablement pas à afficher Tout sauf le premier fichier PS. Un peu plus de détails peut être trouvé ici . P> P>
Cela ne fonctionne pas par moi, ouvrant le document concédé avec Evince code> montre uniquement le premier doc. BTW, félicitation pour votre création de la physique SE.
@peterh pourquoi merci, je n'étais que au bon endroit au bon moment (pour une fois). J'ai ajouté une responsabilité de non-responsabilité à ma réponse - en effet, cela ne fonctionnera pas avec la plupart des téléspectateurs, mais les imprimantes et les convertisseurs de PDF devraient pouvoir faire face à l'IS. Néanmoins, la réponse acceptée sera probablement plus fiable; Celui-ci est juste un piratage rapide que je n'ai aussi testé qu'une seule fois ...