2

我想使用 GS 从 pdf 文件中生成缩略图。

  • 缩略图必须适合 90x120 像素的矩形
  • 图像不应旋转
  • 图像应调整大小以适应矩形并保持纵横比

我使用以下命令:

gswin32 -dPDFFitPage -dPARANOIDSAFER -dBATCH -dNOPAUSE -dNOPROMPT 
-dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=0 
-dDEVICEWIDTH=90 -dDEVICEHEIGHT=120 -dORIENT1=true 
-sDEVICE=jpeg  -dTextAlphaBits=4 -dGraphicsAlphaBits=4 
-sOutputFile=output.%d.jpg input.pdf

结果:

如果我使用一些带有纵向页面 PDF ,您可以下载,那么缩略图是正确的,您可以在此处看到:

在此处输入图像描述

如果我将它用于带有横向页面的 PDF,则 devicewidth 以某种方式被视为高度

在此处输入图像描述

我怎样才能防止这种行为?我希望我的保时捷也是 90x120。我想也许我需要为 Ghostscript 提供一些 Postscript 代码(带有 -c 命令行参数),但我没有这方面的经验。有人可以帮我吗?

EDIT1:我尝试了KenS 的建议。使用 -dFIXEDMEDIA,我的保时捷会被裁剪,如下所示:

在此处输入图像描述

EDIT2: Kurt Pfeifle 的第一个解决方案不适用于肖像图像(右侧的白色部分,未正确使用空间)。见下文:

在此处输入图像描述

EDIT3: Kurt Pfeifle的第三个解决方案几乎是好的。对于风景图像,它是完美的:

在此处输入图像描述

但是,纵向页面存在尺寸问题,背景也变得完全灰色:

在此处输入图像描述

所以库尔特,我想我可以将 pdf 拆分为页面(使用 GS -dFirstPage 和 -dLastPage),然后如果您有一些想法,如何确定页面是横向还是纵向,那么我可以进行一些条件处理。任何想法?至于背景颜色,我认为它并不重要,但如果您在这里也有想法,那么欢迎他们。

4

4 回答 4

2

好的,现在尝试一个更详细的答案,基于上面提到的“首先操作 PDF(以便它使用纵向媒体格式来显示其横向图像内容)”的想法......

请注意,由于您的原始 PDF 并未对所有页面使用通用尺寸(它们都不同),因此我仅对第一页进行了概念验证。

第 1 步:从原始(横向)中提取第 1 页

我正在使用pdftk这个:

porsches.pdf  cat 1  output porsche-page1.pdf

第 2 步:在较大的纵向页面上居中横向内容

为此,我正在使用 Ghostscript 和-c ...PostScript 命令行片段:

gs \
 -o porsche-page1-on-portrait-medium.pdf \
 -sDEVICE=pdfwrite \
 -dPDFSETTINGS=/prepress \
 -g1920x2560 \
 -r72 \
 -c "<</PageOffset [0 560]>> setpagedevice" \
 -f porsche-page1.pdf

这些/PageOffset值源自我将 1120 点添加到 1440 点的原始页面高度这一事实。因此,我将内容向上移动一半的值,使图片再次居中。

第 3 步:创建 JPEG 缩略图(纵向)

gs \
 -sOutputFile=proofofconcept-thumb_%03d.jpg \
 -dPDFFitPage \
 -dDEVICEWIDTH=90 \
 -dDEVICEHEIGHT=120 \
 -sDEVICE=jpeg \
  porsche-page1-on-portrait-medium.pdf

除非我没有完全误解你的意图:这应该是你想要的结果。(注意:我在缩略图中添加了一个黑框,以使其真实尺寸即使在 Stackoverflow 的白色 HTML 背景上也可见。

概念验证缩略图

于 2012-07-05T10:22:51.600 回答
1

我认为如果不首先处理 PDF (以便它使用纵向媒体格式来显示其横向图像内容),您目前想要的东西是不可能的。

由于您似乎主要对所获得的 120 像素宽度提出问题,因此我自己处理未修改输入的解决方法是更改​​高度/宽度设置,如下所示:

-dDEVICEWIDTH=90 -dDEVICEHEIGHT=89 

这将创建 90 像素宽、未旋转的 JPEG,它们将适合您的 90x120 像素矩形(根据您的需要)。:-)

(之后,您仍然可以使用 ImageMagick 命令行工具之一操作获得的 JPEG,以使它们真正成为 90x120 像素,保时捷以矩形为中心或其他任何东西......)

于 2012-07-04T13:31:42.713 回答
1

这是您可以更轻松地编写整个事情的方法。(我现在才完全意识到,你似乎想要这个用于 Windows ......)

第一步:创建第一个页面大小相同的中间 PDF

gswin32c.exe ^
   -o 1920x1440pts.pdf ^
   -dPDFFitPage ^
   -sDEVICE=pdfwrite ^
   -dPDFSETTINGS=/prepress ^
   -g19200x14400 ^
    porsche.pdf

这是为第二步做准备。“所有页面的大小相同”将允许我们为此使用相同的固定/PageOffset值。

第二步:第二个中间PDF(纵向,横向内容居中)

gswin32c.exe 
   -o 1920x1440-portrait.pdf ^
   -sDEVICE=pdfwrite ^
   -dPDFSETTINGS=/prepress ^
   -g19200x25600 ^
   -c "<</PageOffset [0 560]>> setpagedevice" ^
   -f 1920x1440pts.pdf 

这是为第四步做准备。现在我们在 PDF 中有纵向页面(包含横向图像内容),我们的缩略图创建也将产生纵向缩略图......

第三步:为纵向页面添加灰色背景

gswin32c.exe ^
   -o - ^
   -sDEVICE=pdfwrite ^
   -g1920x2560 ^
   -c ".6 setgray 0 0 192 256 rectfill showpage" ^
| ^
pdftk.exe ^
   1920x1440-portrait.pdf ^
   background - ^
   output 1920x1440-portrait-gray-background.pdf

管道中的第一个命令使用 Ghostscript 将灰色背景的 PDF 页面写入stdout,而第二个命令用于pdftk从其标准输入读取背景信息创建下一个中间输出。

如果您不喜欢那种灰色阴影,请使用其他值而不是.6. 如果您不喜欢灰色,但想要颜色,请使用而不是.6 setgray

  • 1 0 0 setrgbcolor对于红色背景,
  • 0 1 0 setrgbcolor对于绿色背景,
  • 0 0 1 setrgbcolor对于蓝色背景,
  • 1 0 0 0 setcmykcolor对于青色背景,
  • 0 1 0 0 setcmykcolor对于洋红色背景,
  • 0 0 1 0 setcmykcolor黄色背景。

第四步:创建最终的 JPEG 缩略图

gswin32c.exe ^
   -o porsche-thumbnails-portrait_%03d.jpg ^
   -dPDFFitPage ^
   -dDEVICEWIDTH=90 ^
   -dDEVICEHEIGHT=120 ^
   -sDEVICE=jpeg ^
    1920x1440-portrait-gray-background.pdf

我将这些命令复制到批处理文件中并添加一些您可能想要的其他内容是为了您自己的乐趣... :-)


更新: 当然,如果您有一个包含横向页面和纵向页面的文件,则需要应用一些条件处理。要在命令行上发现页面的方向和大小,pdfinfo可能会有所帮助,如果这样调用:

 pdfinfo -f 4 -l 7 some.pdf

这将打印第 4 页(第一个)到第 7页(最后一个)的页面大小。

于 2012-07-05T13:21:33.113 回答
1

设置 -dFIXEDMEDIA 以便 Ghostscript 知道媒体已修复。

再一次你可能会发布一个较小的示例文件,我们真的不需要所有 71 页,尽管我很欣赏它们是漂亮的图片....

于 2012-07-04T13:03:45.593 回答