将jpg图像以“无损”的方式存储到pdf文件中
给定一个带有几个jpg文件(照片)的目录,我想 想创建一个PDF文件,每页只有一张照片。 但是,我希望将照片保存在pdf文件中不变;即,我想避免解码和重新编码。 理想情况下,我希望能够使用例如pdfimages
等linux命令行从pdf文件中提取原始jpg文件(可能减去元数据)。将jpg图像以“无损”的方式存储到pdf文件中
我的想法而已:
-
imagemagick convert
。不过,我对压缩选项感到困惑:如果我选择100%quality
,这是否意味着jpg内部解码,然后编码无损? (这显然不是我想要的?) -
pdflatex
。 Some people claim表示图形包中包含图像无损,而other dispute that。无论如何,pdflatex会稍微麻烦一些(我首先必须找出照片的尺寸,然后相应地设置页面大小,确保没有边距,标题等)。
你可以使用下面的小脚本,依靠HexaPDF(注意:我是HexaPDF的作者)来做到这一点。
注意:确保您安装了Ruby 2.4,然后运行gem install hexapdf
来安装hexapdf。
下面是脚本:
require 'hexapdf'
doc = HexaPDF::Document.new
ARGV.each do |image_file|
image = doc.images.add(image_file)
page = doc.pages.add
iw = image.info.width.to_f
ih = image.info.height.to_f
pw = page.box(:media).width.to_f
ph = page.box(:media).height.to_f
rw, rh = pw/iw, ph/ih
ratio = [rw, rh].min
iw, ih = iw * ratio, ih * ratio
x, y = (pw - iw)/2, (ph - ih)/2
page.canvas.image(image, at: [x, y], width: iw, height: ih)
end
doc.write('images.pdf')
只需提供该图像作为命令行参数上,输出文件将被命名为images.pdf
。大多数代码处理图像居中和缩放,以适应页面。
非常感谢你。到目前为止,我从未使用过ruby,但现在将安装并尝试脚本。如果它适合我,我会接受答案。 – Jakob
非常棒,非常感谢! 我将修改脚本以禁用缩放等,而是调整每个纸张大小以匹配相应的JPG。 (看来我必须在doc.pages.add这一步做到这一点;我会稍微玩一下) – Jakob
调整页面的大小可以通过提供一个包含四个值的数组来完成 - 媒体框 - - 到'doc.pages.add'。在你的情况下,你会做'doc.pages.add([0,0,iw,ih])''。然后保留所有内容,直到'page.canvas ...'并将其更改为'page.canvas.image(image,at:[0,0])''。 – gettalong
Imagemagick将解码,然后包装在PDF矢量外壳。它不会是无损的。普通JPG的质量100仍然有损。 – fmw42
您可以按照您喜欢的任何方法进行操作,然后*将JPG附加到PDF上。 PDF将提供图像的可视化,而附件应该是无损的,并且可以下载/提取。 [PDF工具包](https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/)可以提供帮助。 – Werner