Convert list of jpgs to pdf with ghostscript

旧城冷巷雨未停 提交于 2021-02-11 12:54:24

问题


GhostScript v9.10 64bit version

I'd like to take a list of jpgs and turn them into a single pdf file where each image has its own page.

I tried to follow the method used here: Using Ghostscript to convert JPEG to PDF but I'm getting errors.

Here is my command:

C:\Temp>gswin64c -sDEVICE=pdfwrite -o cafb0173-f4be-47a8-a39e-f479ca0a4d09.pdf viewjpeg.ps -c 5c520934-461a-44f3-9f00-9fdc9fe666c1.jpg

Here is what I get:

GPL Ghostscript 9.10 (2013-08-30)
Copyright (C) 2013 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Error: /undefined in 5c520934-461a-44f3-9f00-9fdc9fe666c1.jpg
Operand stack:

Execution stack:
   %interp_exit   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_pus
h   --nostringval--   --nostringval--   --nostringval--   false   1   %stopped_push   .runexec2   --
nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--
Dictionary stack:
   --dict:1179/1684(ro)(G)--   --dict:0/20(G)--   --dict:80/200(L)--
Current allocation mode is local
Last OS error: No such file or directory
GPL Ghostscript 9.10: Unrecoverable error, exit code 1

I've tried using the full path to viewjpeg.ps, and I've tried putting viewJPEG showpage at the end, and that didn't help either.

When I run this c# code, however:

     try
            {
                var guid = System.Guid.NewGuid().ToString();
                Process p = new Process();
                p.StartInfo.WorkingDirectory = @"C:\Temp";
                p.StartInfo.FileName = Program.ghostScriptLocation;
                p.StartInfo.Arguments = " -sDEVICE=pdfwrite -o " + guid + ".pdf " + "\""+Program.viewJPEGLoc+"\"" +" -c " + String.Join(" ", pictures.ToArray()); 
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.RedirectStandardOutput = true;
                p.Start();

                string outp = p.StandardOutput.ReadToEnd();
                p.WaitForExit();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
        }

I get a blank pdf file as well as an error saying "Unrecoverable error, exit code 1"


回答1:


Following viewjpeg.ps you have put "-c" This switch means 'treat the following command line as PostScript, up until a -f is encountered". So Ghostscript then tries to parse "5c52......jpg" as PostScript operations. Since that is gibberish in PostScript, you get an error.

From the header of viewjpeg.ps:

% Usage example:
%   (jpeg-6/testimg.jpg) viewJPEG

So your command line should read:

C:\Temp>gswin64c -sDEVICE=pdfwrite -o cafb0173-f4be-47a8-a39e-f479ca0a4d09.pdf viewjpeg.ps -c "(5c520934-461a-44f3-9f00-9fdc9fe666c1.jpg) viewJPEG" -f

Update I rather felt that the problem was that you couldn't get viewJPEG to work. Once that is working, well, its not terribly hard to have viewjpeg operate on multiple files. Here's an example:

C:\Temp>gswin64c -sDEVICE=pdfwrite -o cafb0173-f4be-47a8-a39e-f479ca0a4d09.pdf viewjpeg.ps -c "(file1.jpg) viewJPEG (file2.jpg) viewJPEG (file3.jpg) viewJPEG" -f

Obviously you can expand the command line as required. Of course if you continue to use extremely long names for your JPEG files you'll probably run out of command line, so you will want to switch to using a command file (see the Ghostscript documentation) or put all the filenames in a file and write PostScript to pull the names from the file and then execute viewJPEG on each one.

This will, of course, stick all the JPEG images into one PDF file. If you don't like that then you'll have to use the '%d' syntax for the output file, so that each page goes to a separate numbered file, or you will have to write a script to invoke Ghostscript once for each file in your list.



来源:https://stackoverflow.com/questions/26289515/convert-list-of-jpgs-to-pdf-with-ghostscript

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!