使用ghostscript将jpgs列表转换为pdf

时间:2014-10-09 23:22:07

标签: c# pdf cmd ghostscript

GhostScript v9.10 64位版本

我想获取一个jpgs列表并将它们转换为单个pdf文件,其中每个图像都有自己的页面。

我试着按照这里使用的方法: Using Ghostscript to convert JPEG to PDF但我收到了错误。

这是我的命令:

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

这是我得到的:

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

我已尝试使用viewjpeg.ps的完整路径,并且我已经尝试将viewJPEG showpage放在最后,这也没有帮助。

但是当我运行这个c#代码时:

     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);
        }

我得到一个空白的pdf文件以及错误说"不可恢复的错误,退出代码1"

1 个答案:

答案 0 :(得分:1)

在viewjpeg.ps之后你放了“-c”这个开关意味着“将以下命令行视为PostScript,直到遇到-f”。所以Ghostscript然后尝试解析“5c52 ...... jpg” “作为PostScript操作。由于在PostScript中这是乱码,你会收到错误。

来自viewjpeg.ps的标题:

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

所以你的命令行读取:

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

<强>更新 我觉得问题是你无法让viewJPEG工作。一旦它正常工作,那么,使用viewjpeg对多个文件进行操作并不是非常困难。这是一个例子:

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

显然,您可以根据需要扩展命令行。当然,如果你继续为你的JPEG文件使用超长名称,你可能会用完命令行,所以你需要切换到使用命令文件(参见Ghostscript文档)或将所有文件名放在一个文件中编写PostScript以从文件中提取名称,然后在每个文件上执行viewJPEG。

当然,这会将所有JPEG图像粘贴到一个PDF文件中。如果您不喜欢这样,那么您将不得不对输出文件使用'%d'语法,以便每个页面转到一个单独的编号文件,或者您必须编写一个脚本来为每个页面调用一次Ghostscript列表中的文件。