Подходящий объект для использования ReportLab - есть PIL - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь открыть файлы .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. Что-то мне не хватает, или лучший способ повернуть изображения при необходимости?

...