7
votes

Comment fusionner deux fichiers PostScript ensemble?

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.

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.

Edité 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).

Conclusion

  1. ps2write est pas la réponse qu'il ne prend pas en charge DSC.
  2. pswrite comme pipitas lecteur a souligné à juste produit la sortie L1. Ce n'est pas Soluton.
  3. Utilisation pdfwrite est réalisable. Dans cette option, nous convertissons deux ps au format PDF puis convertir le fichier PDF fusionné à un ps. Il peut y avoir un problème avec cette solution car il peut y avoir des informations perdues lors de la conversion. Outre les étapes de conversion supplémentaires prendre des ressources supplémentaires et de temps.
  4. Si nous ne avons pas besoin pour afficher le fichier de sortie, concaténer deux fichiers Postscript en même temps que la ligne suivante « false pop 0 startjob » inséré entre les fichiers est également une solution. (Voir aussi ce lien )

    En conclusion, la solution provisoire pour fusionner deux fichiers Postscript sont l'option 3 ou 4.


0 commentaires

6 Réponses :


13
votes

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: xxx

edit: 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.


8 commentaires

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 ?? - Cela dépend également de vos fournisseurs de services d'impression. Parfois, ces gars do 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 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 à 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 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 :)



4
votes

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


2 commentaires

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.



1
votes

Ghostscript sur Linux est livré avec un script shell appelé 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:

© Angus J. C. Duggan 1991-1995 B> P>

#!/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;
}


4 commentaires

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 au début de chaque document et sauvegardj restaures à 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



1
votes

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.

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.

Quelqu'un avait des problèmes similaires?


0 commentaires

2
votes

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 ...

Notez que PDFTK (qui peut être téléchargé gratuit) obtiendra les liens corrects.


1 commentaires

+1 pour pdftk. Voici un site en ligne qui le fait: Nublue.co.uk/tools/pdftk



1
votes

en tant qu'OP mentionné dans les conclusions de la question, concaténer les fichiers avec La ligne xxx

entre les deux devraient faire le tour. Donc, dans Bash, on pourrait écrire quelque chose comme xxx

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 .


2 commentaires

Cela ne fonctionne pas par moi, ouvrant le document concédé avec Evince 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 ...