ImageMagick将pdf转换为具有固定宽度或高度的png

ami*_*dar 1 pdf imagemagick imagemagick-convert

我正在使用ImageMagick的convert将PDF文件转换为PNG:

convert -density 150 file.pdf -quality 100 res.png
Run Code Online (Sandbox Code Playgroud)

问题是结果图片的大小根据文件内容而不同。如何为结果图片选择特定的最大高度和最大宽度(以像素为单位)?

Mar*_*ell 5

更新的答案

从您的评论中,我想我会更好地了解您现在想要什么。所以,我认为您需要的身份是:

Required Resolution       Required Height
-------------------    =  ---------------
Current Resolution        Current Height
Run Code Online (Sandbox Code Playgroud)

但是请记住,这在X和Y方向上都适用。因此,让我们让ImageMagick得出获得所需输出大小所需的x分辨率和y分辨率-使用ImageMagick的fx方法更容易做到这一点,因为它在Windows和Linux上均适用,而我碰巧知道您拥有ImageMagick已安装,而您可能没有bc在Windows上进行任何数学工作:

#!/bin/bash
# New width and new height that you want
nh=1000
nw=500

# Calculate Resolution needed in Height
rh=$(identify -format "%[fx:int(($nh*resolution.y)/h)]" doc.pdf)
echo $rh

# Calculate Resolution needed in Width
rw=$(identify -format "%[fx:int(($nw*resolution.x)/w)]" doc.pdf)
echo $rw
Run Code Online (Sandbox Code Playgroud)

因此,如果我在名为doc.pdf595x842 的文件中使用该文件,则它会针对x和y密度输出85和60。如果我再用

convert -density 85 doc.pdf a.jpg
Run Code Online (Sandbox Code Playgroud)

它的尺寸为702x994,接近我想要的高度1000

如果我用

convert -density 60 doc.pdf a.jpg
Run Code Online (Sandbox Code Playgroud)

它的尺寸为496x702,接近我想要的宽度500。

在前面的内容中,您可以使用:

identify -format "%[fx:int(($nh*resolution.y)/h)]" doc.pdf
Run Code Online (Sandbox Code Playgroud)

而不是像我一样将结果分配给变量-之所以这样做,是因为我通常想稍后使用该变量。

原始答案

只需-resize WIDTHxHEIGHT在转换后在其中添加即可设置所需的大小。因此,具体来说,如果您希望保留原始宽高比不超过1500x2000,请执行以下操作:

convert -density 150 file.pdf -quality 100 -resize 1500x2000 res.png
Run Code Online (Sandbox Code Playgroud)

如果您希望宽度不超过800像素,并且不关心高度,请执行以下操作:

convert -density 150 file.pdf -quality 100 -resize 800x res.png
Run Code Online (Sandbox Code Playgroud)

如果您希望它的高度不超过1000px,并且不关心宽度,请执行以下操作:

convert -density 150 file.pdf -quality 100 -resize x1000 res.png
Run Code Online (Sandbox Code Playgroud)

如果您喜欢“镜厅”效果,并希望它达到1200x1800,那么可以采用宽高比,请执行以下操作:

convert -density 150 file.pdf -quality 100 -resize 1200x1800! res.png
Run Code Online (Sandbox Code Playgroud)