【问题标题】:Image Library convert from JPEG to图像库从 JPEG 转换为
【发布时间】:2012-09-27 17:09:40
【问题描述】:

我正在尝试将 200 dpi 的 JPEG 文件转换为 PDF 文件,但是,当我将文件另存为 PDF 时,我认为它会将 dpi 更改为 72,从而使图像更大。最初尝试将 JPEG 图像缩放到更小的尺寸时,我遇到了类似的问题,并且能够通过在保存图像时指定 dpi 来解决该问题。

im = Image.open("Image.jpg")

dpi=im.info['dpi']

if im.size == (2592, 1728):
    out = im.resize((1188,792), Image.ANTIALIAS)
elif im.size == (1728,2592):
    out = im.resize((792,1188), Image.ANTIALIAS)

out.save(project, dpi=dpi)

现在,当我尝试将此 JPEG 保存为 PDF 时,指定 dpi 似乎没有任何区别,并且我得到的图像比我的原始图像大,看起来它具有较低的 dpi。使用 PIL 从 JPEG 转换为 PDF 时,有没有办法保持一致的分辨率?还是有更好的方法让我这样做?

这就是我将文件目录从 JPEG 转换为 PDF 的方法:

for infile in listing:

    outfile = destpath + os.path.splitext(infile)[0] + ".pdf"
    current = path + infile

    if infile != outfile:
        im = Image.open(current)
        dpi=im.info['dpi']

        im.save(outfile, "PDF", Quality = 100)

【问题讨论】:

  • PIL 从 jpeg 中读取的 dpi 值是多少?实际上是 200 吗?
  • @jedwards 是的,我在里面扔了一个打印声明,上面说 jpeg 的 dpi 是 (200,200)。
  • 我很惊讶 PIL 完全支持 PDF。我确定这是原始转换。

标签: python pdf image-processing python-imaging-library resolution


【解决方案1】:

PIL 1.1.7 来源的 CHANGES 文件中可以阅读:

  • 为 PDF 文件添加了分辨率保存选项。

    Andreas Kostyrka 写道:我已经包含了一个修补过的 PdfImagePlugin.py
    基于 Ubuntu 中包含的 1.1.6,支持“分辨率”
    保存选项。不是很好,但它使 PDF 保存更有用
    允许不完全是 72dpi 的 PDF。

所以你应该可以做到:

im.save(outfile, "PDF", resolution=100.0)

(似乎在我的 Ubuntu 机器上运行良好)。

【讨论】:

  • 你确定它有效吗?在我的系统上,使用 identify -verbose (ImageMagick) 我得到:Resolution: 72x72
  • @jedwards,它在 Windows 上也适用于我。请记住,Python 区分大小写,我第一次使用大写字母R,但它不起作用。我也用了一个整数作为参数,我不知道这是否有区别。
  • @MarkRandom,原来 ImageMagick 在撒谎(有点)。 PDF 本身没有 DPI,所以我想 ImageMagick 默认报告 72 是有道理的。相反,PDF 中包含的单个元素可以。使用 Acrobat 的预检检查,您可以查看各个元素的 DPI——这证实了这确实有效 (Image.VERSION = 1.1.7)。很抱歉造成混乱。
  • 这成功了!尽管我必须将分辨率设置为 200.0 以使 pdf 的尺寸与 jpeg 相同。设置为 100.0,尺寸翻倍。
【解决方案2】:

您可以使用reportlab 库。

import sys

from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, flowables

__jpgname = str()
def drawPageFrame(canvas, doc):
    width, height = letter
    canvas.saveState()
    canvas.drawImage(
    __jpgname, 0, 0, height, width,
    preserveAspectRatio=True, anchor='c')
    canvas.restoreState()

def jpg2pdf(pdfname):
    width, height = letter

    # To make it landscape, pagesize is reversed
    # You can modify the code to add PDF metadata if you want
    doc = SimpleDocTemplate(pdfname, pagesize=(height, width))
    elem = []

    elem.append(flowables.Macro('canvas.saveState()'))
    elem.append(flowables.Macro('canvas.restoreState()'))

    doc.build(elem, onFirstPage=drawPageFrame)

if __name__ == '__main__':
    if len(sys.argv) < 3:
    print("Usage: python jpg2pdf.py <jpgname> <pdfname>")
    exit(1)
    __jpgname = sys.argv[1]
    jpg2pdf(sys.argv[2])

【讨论】:

    【解决方案3】:

    重要的是PIL参数是小写的。

    im.save(outfile, "PDF", quality = 100)

    质量 = 100 ----不起作用。

    【讨论】:

      【解决方案4】:

      这是一个代码,可以将任何带有.jpg或.JPG扩展名的文件转换为pdf,然后删除已转换的图像。抱歉,cmets 是法语。

      import os #necessaire pouvoir supprimer l'image une fois converti et parcourir les fichers dans le dossier
      from fpdf import FPDF #necessaire pour convertir les jpg en pdf
      
      
      for file in os.listdir(): # pour chaque fichiers dans le dossier dans lequel se trouve ce fichier python
      if file.endswith(".jpg") or file.endswith(".JPG"): #permet de selectionner les fichers avec l'extension .jpg ou .JPG
          img=os.path.join(file) #convertie le nom du fichier en variable
          pdf = FPDF()
          pdf.add_page()
          pdf.set_font('Arial', 'B', 16)
          pdf.image('%s'%img, 3,3,204 ) # les chiffres permettent de positionner l'image sur le pdf : 3mm de la gauche, 3mm du haut, et 204 mm de la gauche pour la fin de l'image
          img2=img[:-4] #supprime les 4 dernières lettres du nom du ficher, à savoir '.jpg' ou '.JPG'
          pdf.output('%s.pdf'%img2,'F') #convertie en pdf
          os.remove('%s'%img) #supprime les fichier jpg ou JPG
      

      【讨论】:

        【解决方案5】:

        您可能需要使用:

        import PIL
        import PIL.Image
        
        filename = 'filename'
        im = PIL.Image.open(filename)
        
        newfilename = 'path.pdf'
        PIL.Image.Image.save(newfilename,outfile, "PDF", resoultion = 100.0)
        

        我使用的是 Windows,我使用 pip 来安装 PIL。由于某种原因,它切换到 PIL.Image.Image

        【讨论】:

        • 我刚刚检查了最新的文档,看起来它已经清除了您需要 PIL.Image.Image.save(filename, format = ' ') 的地方。
        【解决方案6】:

        这里有一个完整的例子:

        import os
        import PIL.Image
        
        def img2pdf(fname):
            filename = fname
            name = filename.split('.')[0]
            im = PIL.Image.open(filename)
            if not os.path.exists('im2pdf_output'):
                os.makedirs('im2pdf_output')
            newfilename = ''.join(['im2pdf_output/',name,'.pdf'])
            PIL.Image.Image.save(im, newfilename, "PDF", resolution = 100.0)
            print("processed successfully: {}".format(newfilename))
        
        files = [f for f in os.listdir('./') if f.endswith('.jpg')]
        for fname in files:
            img2pdf(fname)
        

        【讨论】:

          【解决方案7】:

          save的正确用法是:

          PIL.Image.Image.save(im, newfilename, "PDF", resolution = 100.0)
          

          示例:

          path='v:/dev/python/mooc/'
          filename = path + '2016_a_milano_001.JPG'
          im = PIL.Image.open(filename)
          newfilename = path+ 'r.pdf'
          PIL.Image.Image.save(im, newfilename, "PDF", resoultion=100.0)
          

          【讨论】:

          • 这种用法并不比 im.save(newfilename, "PDF")“更正确”。
          猜你喜欢
          • 2018-05-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多