图像库从JPEG转换

6

我想将一张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
@jedwards 是的,我在那里添加了一个打印语句,它显示JPEG的dpi为(200,200)。 - AlexGilvarry
1
我相当惊讶PIL居然支持PDF。我确定这只是一种原始的转换方式。 - Mark Ransom
7个回答

11
PIL 1.1.7的更改文件中,可以读到以下内容:
  • 为PDF文件添加了分辨率保存选项。

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

因此,您应该能够执行:
im.save(outfile, "PDF", resolution=100.0)

(在我的Ubuntu电脑上似乎工作正常)。


你确定它有效吗?在我的系统上,使用 identify -verbose (ImageMagick)我得到:Resolution: 72x72 - jedwards
@jedwards,这个在我的Windows上也可以运行。请记住Python是大小写敏感的,我第一次使用了大写的“R”,结果不起作用。我还使用了一个整数作为参数,我不知道这是否有影响。 - Mark Ransom
1
@MarkRandom,事实证明ImageMagick有点说谎了。PDF本身没有DPI,所以ImageMagick默认报告72是有道理的。相反,PDF中包含的各个元素具有DPI。使用Acrobat的预检查,您可以查看单个元素的DPI - 这证实了这确实有效(Image.VERSION = 1.1.7)。对于造成的困惑,我很抱歉。 - jedwards
这个方法可行!不过我必须将分辨率设置为200.0,才能使PDF与JPEG具有相同的尺寸。如果设置为100.0,则尺寸会加倍。 - AlexGilvarry

6

您可以使用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])

2

重要提示:PIL参数需要小写。

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

quality=100 ----无效。


1

这是一个将任何拥有 .jpg 或 .JPG 扩展名的文件转换为 pdf 的代码,并删除已转换的图片。抱歉,注释是法语。

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

0

你可能需要使用:

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。


1
我刚刚查看了最新的文档,看起来已经明确了你需要使用PIL.Image.Image.save(filename, format = ' ')。 - user2723240

0
一个完整的示例在这里:
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)

-1

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")更加正确。 - Manur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接