使用ghostscript将jpgs列表转换为pdf
本文关键字:转换 pdf 列表 jpgs ghostscript 使用 | 更新日期: 2023-09-27 18:26:03
GhostScript v9.10 64位版本
我想把jpg的列表变成一个单独的pdf文件,每个图像都有自己的页面。
我试着按照这里使用的方法:使用Ghostscript将JPEG转换为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"
在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)view JPEG"-f
显然,您可以根据需要展开命令行。当然,如果你继续为JPEG文件使用超长的名称,你可能会用完命令行,所以你会想切换到使用命令文件(请参阅Ghostscript文档),或者把所有文件名放在一个文件中,然后写PostScript从文件中提取名称,然后对每个文件执行viewJPEG。
当然,这将把所有JPEG图像粘贴到一个PDF文件中。如果你不喜欢,那么你必须对输出文件使用"%d"语法,这样每个页面都会转到一个单独编号的文件,或者你必须为列表中的每个文件编写一个脚本来调用Ghostscript一次。