Пакетное преобразование изображений TIFF в PDF ImageMagick Python

Я пытаюсь преобразовать несколько изображений tiff в один файл PDF, используя следующий код, но он не работает. os.system('convert "G:\xyz\abc\TitleDocumentsDownload\Output\abc\2009033100558001\1.tiff" "G:\xyz\abc\TitleDocumentsDownload\Output\abc\2009033100558001\2.tiff" "G:\xyz\abc\TitleDocumentsDownload\Output\abc\2009033100558001\3.tiff" "G:\xyz\abc\TitleDocumentsDownload\Output\abc\PDFs\2009033100558001.pdf"')

Но я получаю следующее сообщение об ошибке при вызове os.system:
Неверный параметр — "G:\Reonomy\ACRIS\TitleDocumentsDownload\Output\QN_15_65\2009033100558001\2.tiff"

И когда я запускаю точно такую ​​же команду в командной строке в Windows, PDF-файл успешно создается со следующим предупреждающим сообщением:
convert.exe: обнаружено неизвестное поле с тегом 33000 (0x80e8). `TIFFReadDirectory' @warning/tiff.c/TIFFWarnings/824.

Я не знаю, почему это происходит в Python. Любое быстрое решение будет оценено.


person Sibtain Norain    schedule 18.09.2013    source источник


Ответы (2)


Вот чистая реализация Python, которую я сделал на скорую руку, которая не полагается на ImageMagick. Он опирается только на PIL и reportlab. Он может работать в средах с ограниченным доступом, таких как Google App Engine.

def TIFF2PDF(tiff_str, max_pages = 200):
  '''
  Convert a TIFF Image into a PDF.

  tiff_str: The binary representation of the TIFF.
  max_pages: Break after a number of pages. Set to None to have no limit.
  '''
  import PIL
  import reportlab
  import reportlab.lib.pagesizes as pdf_sizes
  from cStringIO import StringIO
  logging.info("TIFF2PDF")

  # Open the Image in PIL
  tiff_img = PIL.Image.open(StringIO(tiff_str))

  # Get tiff dimensions from exiff data. The values are swapped for some reason.
  height, width = tiff_img.tag[0x101][0], tiff_img.tag[0x100][0]

  # Create our output PDF
  out_pdf_io = StringIO()
  c = reportlab.pdfgen.canvas.Canvas(out_pdf_io, pagesize = pdf_sizes.letter)

  # The PDF Size
  pdf_width, pdf_height = pdf_sizes.letter

  # Iterate through the pages
  page = 0
  while True:
    try:
        tiff_img.seek(page)
    except EOFError:
        break
    logging.info("Converting tiff page: %s"%page)
    # Stretch the TIFF image to the full page of the PDF
    if pdf_width * height / width <= pdf_height:
      # Stretch wide
      c.drawInlineImage(tiff_img, 0, 0, pdf_width, pdf_width * height / width)
    else:
      # Stretch long
      c.drawInlineImage(tiff_img, 0, 0, pdf_height * width / height, pdf_height)
    c.showPage()
    if max_pages and page > max_pages:
      logging.error("Too many pages, breaking early")
      break
    page += 1

  logging.info("Saving tiff image")
  c.save()
  return out_pdf_io.getvalue()
person speedplane    schedule 12.02.2016

Это хорошо работает для меня:

import os
os.system('convert G:\xyz\abc\TitleDocumentsDownload\Output\abc\2009033100558001\1.tiff G:\xyz\abc\TitleDocumentsDownload\Output\abc\2009033100558001\2.tiff G:\xyz\abc\TitleDocumentsDownload\Output\abc\2009033100558001\3.tiff G:\xyz\abc\TitleDocumentsDownload\Output\abc\PDFs\2009033100558001.pdf')

Можете ли вы попробовать и посмотреть, есть ли ошибка? Вы запускаете первую команду на Linux-машине?

Это может происходить из-за того, что convert — это утилита Windows для изменения файловых систем. Прочтите это ссылка. Вы запускаете командную строку из папки ImageMagick?

Самым простым решением было бы переименовать файл convert.exe (ImageMagick) во что-то другое, например convertMagick.exe, а затем использовать то же самое в параметре os.system.

person Sahil M    schedule 18.09.2013
comment
Нет, я запускаю его на Windows 7-64bit - person Sibtain Norain; 18.09.2013
comment
Если вы работаете с Linux, вы можете использовать os.system('tiff2pdf -o test.pdf test.tiff'). Возможно, вам придется сначала установить его. - person Tommy J; 20.07.2018