使用 ghostscript 将 jpg 列表转换为 pdf

Posted

技术标签:

【中文标题】使用 ghostscript 将 jpg 列表转换为 pdf【英文标题】:Convert list of jpgs to pdf with ghostscript 【发布时间】:2014-10-09 23:22:06 【问题描述】:

GhostScript v9.10 64位版

我想获取 jpg 的列表并将它们转换为单个 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】:

在 viewjpeg.ps 之后你放了“-c” 这个开关的意思是“把下面的命令行当作 PostScript,直到遇到 -f”。所以 Ghostscript 然后尝试解析“5c52......jpg " 作为 PostScript 操作。由于这在 PostScript 中是胡言乱语,因此会出现错误。

来自viewjpeg.ps的头文件:

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

所以你的命令行应该阅读:

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

更新 我宁愿认为问题在于您无法让 viewJPEG 工作。一旦它起作用了,那么让 viewjpeg 对多个文件进行操作并不难。这是一个例子:

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

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

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

【讨论】:

我的问题标题提到了文件列表。如何处理多个文件? 好吧,您可以编写一个脚本,为您要处理的每个文件调用一次 Ghopstscript。或者,您可以修改 viewjpeg.ps 程序并为其提供一些文件。例如,您可以提供一个字符串数组,并让 viewjpeg.ps 程序遍历该数组,而不是一个具有单个文件名的字符串。 那么使用 stock viewjpeg.ps,不可能将多个 jpg 文件包装成一个 pdf 文件? 它是一个实用程序,旨在将一个 jpeg 作为输入。所以不,你不能用它来输入多个 jpeg。不过你可以修改它。 我认为我不会接受这个答案(因为它目前是这样),因为它没有回答我关于如何将 list jpg 转换为使用 ghostscript 的 powerpoint。

以上是关于使用 ghostscript 将 jpg 列表转换为 pdf的主要内容,如果未能解决你的问题,请参考以下文章

Ghostscript 设置 - 将任何 jpg 转换为 pdf 时出错

Imagemagick将pptx转换为jpg在ghostscript调用中失败

Ghostscript Tiff / JPG 质量

GhostScript - 从 pdf 转换为 jpg 后文本错位

使用 GhostScript 将图像转换为 PDF

iText PDF;如何使用 Java 将 jpeg2000 转换为 jpg