Я пытаюсь открыть файлы .jpg и .png, изменить их размер (и иногда повернуть) и вывести их в формате .pdf. Для этого я использую ReportLab, и я использую KeepTogether.
После некоторых головных болей, связанных с правильным вращением изображений, я получил объекты изображений PIL, повернул их к своему удовольствию и изменил размеры доЧто мне нужно. Теперь у меня проблемы с сыпучими материалами. Я не верил, что, поскольку ReportLab требует PIL для установки, образ PIL будет работать.
Я открыт для решений, в которых я использую что-то кроме PIL для изменения размера и поворота изображений, но вот что у меня получилось:
for pic in pics: #this is a list of all of the pictures that need to go into the document
text = Paragraph(pic,
PS(name='Heading1',
fontName = 'Times-Bold',
spaceAfter = 8,
fontSize = 14,
alignment = TA_CENTER))
the_pic = get_maybe_rotate_image(os.path.join(pathname, pic), int(0.9 * landscape_pic_width * inch)) #sends the path for the picture and the required width to a function for resizing and possibly rotating the pic
build_doc.append(KeepTogether([text,the_pic]))
Вот функция, которую он отправляет:
def get_maybe_rotate_image(path, max_width):
img = PIL.Image.open(path)
image_width, image_height = img.size
if image_height > image_width: #basically, rotate if the image is portrait orientation
img = img.rotate(90, expand = True)
wpercent = (max_width / float(img.size[0]))
hsize = int((float(img.size[1]) * float(wpercent))) #thanks tomvon on stack overflow #determine the size to fit it on the page with the same aspect ratio
return img.resize((max_width, hsize), PIL.Image.ANTIALIAS)
и вот мой след ошибки:
Traceback (most recent call last):
File "C:\Photos pdf conversion.py", line 66, in <module>
doc.build(build_doc)
File "C:\Python27\lib\site-packages\reportlab\platypus\doctemplate.py", line 1213, in build
BaseDocTemplate.build(self,flowables, canvasmaker=canvasmaker)
File "C:\Python27\lib\site-packages\reportlab\platypus\doctemplate.py", line 969, in build
self.handle_flowable(flowables)
File "C:\Python27\lib\site-packages\reportlab\platypus\doctemplate.py", line 834, in handle_flowable
if frame.add(f, canv, trySplit=self.allowSplitting):
File "C:\Python27\lib\site-packages\reportlab\platypus\frames.py", line 167, in _add
w, h = flowable.wrap(aW, h)
File "C:\Python27\lib\site-packages\reportlab\platypus\flowables.py", line 690, in wrap
annotateException('\nraised by class %s(%s)@0x%8.8x wrap\n' % (self.__class__.__name__,self.__class__.__module__,id(self)))
File "C:\Python27\lib\site-packages\reportlab\lib\utils.py", line 1390, in annotateException
rl_reraise(t,v,b)
File "C:\Python27\lib\site-packages\reportlab\platypus\flowables.py", line 687, in wrap
W,H = _listWrapOn(self._content,aW,self.canv,dims=dims)
File "C:\Python27\lib\site-packages\reportlab\platypus\flowables.py", line 617, in _listWrapOn
w,h = f.wrapOn(canv,availWidth,0xfffffff)
AttributeError: 'Image' object has no attribute 'wrapOn'
raised by class KeepTogether(reportlab.platypus.flowables)@0x048eefa8 wrap
Я бы предпочел не сохранять новый .jpg или .png только для вызова его в правильном формате. Я не нашел хороший способ превратить изображение PIL в то, что я могу поместить в ReportLab. Что-то мне не хватает, или лучший способ повернуть изображения при необходимости?