ImageMagick使用固定宽度或高度将pdf转换为png

ImageMagick使用固定宽度或高度将pdf转换为png,pdf,imagemagick,imagemagick-convert,Pdf,Imagemagick,Imagemagick Convert,我正在使用ImageMagick的convert将PDF文件转换为PNG,转换方式如下: convert -density 150 file.pdf -quality 100 res.png 问题在于,结果图片的大小因文件内容而异。如何为结果图片选择特定的最大高度和最大宽度(以像素为单位)?更新答案 从你的评论中,我想我更了解你现在想要什么。所以,我认为你需要的身份是: Required Resolution Required Height -------------------

我正在使用ImageMagick的convert将PDF文件转换为PNG,转换方式如下:

convert -density 150 file.pdf -quality 100 res.png

问题在于,结果图片的大小因文件内容而异。如何为结果图片选择特定的最大高度和最大宽度(以像素为单位)?

更新答案

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

Required Resolution       Required Height
-------------------    =  ---------------
Current Resolution        Current Height
但请记住,这适用于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
因此,如果我在一个名为
doc.pdf
的文件中使用它,它测量595x842,它输出85和60的x和y密度。如果我使用

convert -density 85 doc.pdf a.jpg
它的售价是702x994,接近我想要的1000的高度

如果我使用

convert -density 60 doc.pdf a.jpg
它是496x702,接近我想要的500的宽度

在上述情况下,您只需使用:

identify -format "%[fx:int(($nh*resolution.y)/h)]" doc.pdf
而不是像我那样将结果分配给变量-我这样做是因为我通常希望以后使用该变量

原始答案

转换后,只需在其中添加一个
-resize WIDTHxHEIGHT
,即可设置所需的大小。因此,具体而言,如果您希望在保持原始纵横比的同时不超过1500x2000,请执行以下操作:

convert -density 150 file.pdf -quality 100 -resize 1500x2000 res.png
convert -density 150 file.pdf -quality 100 -resize 1200x1800! res.png
如果您希望其宽度不超过800px,并且不关心其高度,请执行以下操作:

convert -density 150 file.pdf -quality 100 -resize 800x res.png
如果您希望它的高度不超过1000像素,并且不关心宽度,请执行以下操作:

convert -density 150 file.pdf -quality 100 -resize x1000 res.png
如果您喜欢“镜厅”效果,并希望它达到1200x1800,请选择以下选项:

convert -density 150 file.pdf -quality 100 -resize 1500x2000 res.png
convert -density 150 file.pdf -quality 100 -resize 1200x1800! res.png

更新的答案

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

Required Resolution       Required Height
-------------------    =  ---------------
Current Resolution        Current Height
但请记住,这适用于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
因此,如果我在一个名为
doc.pdf
的文件中使用它,它测量595x842,它输出85和60的x和y密度。如果我使用

convert -density 85 doc.pdf a.jpg
它的售价是702x994,接近我想要的1000的高度

如果我使用

convert -density 60 doc.pdf a.jpg
它是496x702,接近我想要的500的宽度

在上述情况下,您只需使用:

identify -format "%[fx:int(($nh*resolution.y)/h)]" doc.pdf
而不是像我那样将结果分配给变量-我这样做是因为我通常希望以后使用该变量

原始答案

转换后,只需在其中添加一个
-resize WIDTHxHEIGHT
,即可设置所需的大小。因此,具体而言,如果您希望在保持原始纵横比的同时不超过1500x2000,请执行以下操作:

convert -density 150 file.pdf -quality 100 -resize 1500x2000 res.png
convert -density 150 file.pdf -quality 100 -resize 1200x1800! res.png
如果您希望其宽度不超过800px,并且不关心其高度,请执行以下操作:

convert -density 150 file.pdf -quality 100 -resize 800x res.png
如果您希望它的高度不超过1000像素,并且不关心宽度,请执行以下操作:

convert -density 150 file.pdf -quality 100 -resize x1000 res.png
如果您喜欢“镜厅”效果,并希望它达到1200x1800,请选择以下选项:

convert -density 150 file.pdf -quality 100 -resize 1500x2000 res.png
convert -density 150 file.pdf -quality 100 -resize 1200x1800! res.png

非常感谢你。我试图使事情更快,以你的方式,它正在转换为大文件,然后调整大小,这可能需要很多时间。例如,密度为600,调整大小为100x100仍然需要很多时间,直到大图像准备就绪,然后调整大小,相反,首先要以正确的大小创建图片。对不起,我将您的问题解释为您知道要使用
-density 150
(因为这是您编写的代码)然后你想调整你的图像大小,而不是仅仅通过使用最小密度来加快处理速度。。。如果对文件使用ImageMagick命令
identifite-verbose someFile.pdf
,它们的分辨率是否相同?是72x72吗?因为输出文件的大小与密度成正比。我已经更新了我的答案-请再看一看。此外,如果性能是一个很大的问题,你有很多PDF要转换,请考虑使用<代码> GNU并行< /代码>如果你是在一个体面的操作系统,如Linux或OSX。非常感谢。我试图使事情更快,以你的方式,它正在转换为大文件,然后调整大小,这可能需要很多时间。例如,密度为600,调整大小为100x100仍然需要很多时间,直到大图像准备就绪,然后调整大小,相反,首先要以正确的大小创建图片。对不起,我将您的问题解释为您知道要使用
-density 150
(因为这是您编写的代码)然后你想调整你的图像大小,而不是仅仅通过使用最小密度来加快处理速度。。。如果对文件使用ImageMagick命令
identifite-verbose someFile.pdf
,它们的分辨率是否相同?是72x72吗?因为输出文件的大小与密度成正比。我已经更新了我的答案-请再看一看。此外,如果性能是一个很大的问题,你有很多PDF要转换,请考虑使用<代码> GNU并行< /代码>,如果你在一个体面的操作系统,如Linux或OSX。