Nano Hash - криптовалюты, майнинг, программирование

Преобразование ImageMagick терпит неудачу только при вызове через subprocess.call python

Я пытаюсь преобразовать первую страницу файла PDF в файл миниатюр JPEG. У меня есть код, похожий на следующий код Python.

from tempfile import TemporaryFile, NamedTemporaryFile
import os
from subprocess import call
…
def createThumbnail(reporttempfile, thumbnailtempfile):
    # build the command for executing for extracting thumbnail
    command = "convert -resize 241x344 -background white -gravity center -extent 241x344 -quality 75" 
    csplit = command.split(' ')
    csplit.append("pdf:"+reporttempfile.name + "[0]")
    csplit.append(thumbnailtempfile.name)
    print "csplit = ", csplit
    print "cmd = %s" % " ".join(csplit)
    # run the command convert to create thumbnail
    retval = call(csplit)
    print "retval = %d" % retval
    return retval

Когда я вызываю вышеуказанную функцию, я получаю следующий вывод:

csplit =  ['convert', '-resize', '241x344', '-background', 'white', '-gravity', 'center', '-extent', '241x344', '-quality', '75', 'pdf:/tmp/reportfile0001_zeEJ8B.pdf[0]', '/tmp/thumbnail0001_DTPHGb.jpg']

cmd = convert -resize 241x344 -background white -gravity center -extent 241x344 -quality 75 pdf:/tmp/reportfile0001_zeEJ8B.pdf[0] /tmp/thumbnail0001_DTPHGb.jpg
   **** Error: Cannot find a 'startxref' anywhere in the file.
   **** Warning:  An error occurred while reading an XREF table.
   **** The file has been damaged.  This may have been caused
   **** by a problem while converting or transfering the file.
   **** Ghostscript will attempt to recover the data.
   **** Error:  Trailer is not found.

Requested FirstPage is greater than the number of pages in the file: 0
   No pages will be processed (FirstPage > LastPage).

   **** This file had errors that were repaired or ignored.
   **** Please notify the author of the software that produced this
   **** file that it does not conform to Adobe's published PDF
   **** specification.

convert.im6: Postscript delegate failed `/tmp/reportfile0001_zeEJ8B.pdf': No such file or directory @ error/pdf.c/ReadPDFImage/677.
convert.im6: no images defined `/tmp/thumbnail0001_DTPHGb.jpg' @ error/convert.c/ConvertImageCommand/3044.
retval = 1
1

Однако, когда я вызываю команду напрямую, набрав в оболочке, конвертировать удается без каких-либо проблем, и я вижу, что файл .jpg конвертируется правильно. Используемая команда (то, что также напечатано в выводе выше):

convert -resize 241x344 -background white -gravity center -extent 241x344 -quality 75 pdf:/tmp/reportfile0001_zeEJ8B.pdf[0] /tmp/thumbnail0001_DTPHGb.jpg

Я видел такое поведение на Mac (10.9.5) с ImageMagick 6.9.0-0 Q16 x86_64 2015-04-09, а также с Ubuntu 14 с ImageMagick 6.7.7-10 2014-03-06 Q16.

Я в недоумении, почему это происходит. Может кто-нибудь помочь?

С уважением,

SN


  • Не уверен, что вы ожидаете от команды, когда вы просите ее изменить размер чего-либо, когда вы еще ничего не прочитали. Попробуйте изменить размер и, возможно, расширить после чтения PDF, чтобы у вас было что изменить. -background и -quality имеют значение Settings, поэтому они сохраняются до тех пор, пока не будут изменены, но -resize и -extent имеют значение Operators, поэтому им нужно что-то для работы. Попробуйте запустить man convert и найти Settings, а затем Operators. 06.08.2015
  • У вас действительно есть пробел, отделяющий имя входного файла от имени выходного файла - я его не вижу. Можете ли вы временно создать одностраничный PDF-файл и упростить имя входного файла с pdf:something[0] до simple.pdf на тот случай, если вы не соблюдаете правила цитирования и разделения? 06.08.2015
  • Я пытаюсь изменить размер первой страницы PDF на миниатюру. Я не знаю, почему вы говорите, что оперировать нечего. Посмотрите на аргумент pdf, добавленный оператором python csplit.append(pdf:+reporttempfile.name + [0]). И проблема в том, что эта проблема возникает только при вызове convert через подпроцесс python. Если я вызываю команду непосредственно в оболочке, она работает хорошо, так что не может быть и речи о том, что там нет места. И при вызове из подпроцесса пробела не должно быть, поскольку аргументы должны быть отправлены в виде списка, что я и делаю. 07.08.2015
  • Я упростил команду для преобразования ‹‹различных аргументов ›› simple.pdf simple.jpg и попытался вызвать через python subprocess.call, но это все равно не сработало. Конечно, он работает при прямом вызове в оболочке. 07.08.2015
  • Итак, существовал ли простой PDF-файл до того, как программа Python запустилась, или это был именованный временный файл? 08.08.2015

Ответы:


1

Вы должны закрыть временный файл, прежде чем он будет прочитан convert. Вы можете открыть временный файл с параметром delete=False, чтобы избежать его удаления при закрытии с помощью метода close(). Чтобы удалить его вручную после завершения обработки, используйте его метод unlink(), который совпадает с функцией os.unlink (вы должны передать атрибут name временного файла в качестве первого аргумента).

26.08.2015
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..