将jpg图像以“无损”的方式存储到pdf文件中

问题描述:

给定一个带有几个jpg文件(照片)的目录,我想 想创建一个PDF文件,每页只有一张照片。 但是,我希望将照片保存在pdf文件中不变;即,我想避免解码和重新编码。 理想情况下,我希望能够使用例如pdfimages等linux命令行从pdf文件中提取原始jpg文件(可能减去元数据)。将jpg图像以“无损”的方式存储到pdf文件中

我的想法而已:

  • imagemagick convert。不过,我对压缩选项感到困惑:如果我选择100%quality,这是否意味着jpg内部解码,然后编码无损? (这显然不是我想要的?)
  • pdflatexSome people claim表示图形包中包含图像无损,而other dispute that。无论如何,pdflatex会稍微麻烦一些(我首先必须找出照片的尺寸,然后相应地设置页面大小,确保没有边距,标题等)。
+0

Imagemagick将解码,然后包装在PDF矢量外壳。它不会是无损的。普通JPG的质量100仍然有损。 – fmw42

+0

您可以按照您喜欢的任何方法进行操作,然后*将JPG附加到PDF上。 PDF将提供图像的可视化,而附件应该是无损的,并且可以下载/提取。 [PDF工具包](https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/)可以提供帮助。 – Werner

你可以使用下面的小脚本,依靠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。大多数代码处理图像居中和缩放,以适应页面。

+0

非常感谢你。到目前为止,我从未使用过ruby,但现在将安装并尝试脚本。如果它适合我​​,我会接受答案。 – Jakob

+0

非常棒,非常感谢! 我将修改脚本以禁用缩放等,而是调整每个纸张大小以匹配相应的JPG。 (看来我必须在doc.pages.add这一步做到这一点;我会稍微玩一下) – Jakob

+0

调整页面的大小可以通过提供一个包含四个值的数组来完成 - 媒体框 - - 到'doc.pages.add'。在你的情况下,你会做'doc.pages.add([0,0,iw,ih])''。然后保留所有内容,直到'page.canvas ...'并将其更改为'page.canvas.image(image,at:[0,0])''。 – gettalong