Я столкнулся с проблемой, пытаясь разработать веб-приложение, часть которого преобразует загруженные файлы docx в файлы pdf (после некоторой обработки). С python-docx и другими методами мне не требуется машина Windows с установленным word или даже libreoffice на linux для большей части обработки (мой веб-сервер pythonanywhere - linux, но без libreoffice и без разрешений sudo или apt install). Но для преобразования в pdf, похоже, требуется один из них. Изучая вопросы здесь и в других местах, вот что у меня есть на данный момент:
import subprocess
try:
from comtypes import client
except ImportError:
client = None
def doc2pdf(doc):
"""
convert a doc/docx document to pdf format
:param doc: path to document
"""
doc = os.path.abspath(doc) # bugfix - searching files in windows/system32
if client is None:
return doc2pdf_linux(doc)
name, ext = os.path.splitext(doc)
try:
word = client.CreateObject('Word.Application')
worddoc = word.Documents.Open(doc)
worddoc.SaveAs(name + '.pdf', FileFormat=17)
except Exception:
raise
finally:
worddoc.Close()
word.Quit()
def doc2pdf_linux(doc):
"""
convert a doc/docx document to pdf format (linux only, requires libreoffice)
:param doc: path to document
"""
cmd = 'libreoffice --convert-to pdf'.split() + [doc]
p = subprocess.Popen(cmd, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
p.wait(timeout=10)
stdout, stderr = p.communicate()
if stderr:
raise subprocess.SubprocessError(stderr)
Как видите, для одного метода требуется comtypes, для другого - libreoffice в качестве подпроцесса. Есть ли какое-нибудь решение, кроме перехода на более сложный хостинг-сервер?
@ usr2564301 Конечно проще, но для меня это не вариант без переключения серверов
Затем найдите чистую реализацию Python для создания PDF-файлов (рекомендовать одну - это противоречие рекомендациям по переполнению стека, но, конечно, вы можете использовать поисковую систему и найти ту, которая подходит для ваших целей и уровня программирования), или сверните свою собственную. Но будьте осторожны, есть веские причины, по которым «все» используют внешние утилиты - прочтите вышеупомянутые спецификации, чтобы понять, почему.
почему бы не использовать api, запускаемый с помощью python, например. convertapi.com/docx-to-pdf? Также проверьте этот вопрос stackoverflow.com/questions/3815983/…
Вместо этого попробуйте pandoc.






Страницы справки PythonAnywhere предлагают информацию по работе с файлами PDF здесь: https://help.pythonanywhere.com/pages/PDF
Описание: PythonAnywhere имеет несколько установленных пакетов Python для работы с PDF, и один из них может делать то, что вы хотите. Однако мне кажется проще всего перейти на abiword. Команда оболочки abiword --to=pdf filetoconvert.docx преобразует файл docx в PDF и создаст файл с именем filetoconvert.pdf в том же каталоге, что и docx. Обратите внимание, что эта команда выведет сообщение об ошибке в стандартный поток ошибок с жалобой на XDG_RUNTIME_DIR (или, по крайней мере, у меня), но она по-прежнему работает, и сообщение об ошибке можно игнорировать.
Мне нужно будет провести несколько тестов, чтобы увидеть, работает ли он, не испортив файлы, но это именно тот ответ, который я хотел услышать :) сообщит о результатах
У меня это тоже работает. Он создает файл pdf (с тем же именем файла), но я также получил ошибку XDG_RUNTIME_DIR. Чтобы обуздать эту ошибку, я использовал export XDG_RUNTIME_DIR=/tmp/ в консоли bash, и со второй попытки ошибка исчезла. Наконец, чтобы проверить, было ли преобразование успешным, я загрузил файл pdf из Pythonanywhere на свой компьютер локально и открыл файл, чтобы увидеть его содержимое. Весь контент отображается успешно.
Отчетность: это работает достаточно хорошо (некоторые проблемы с языками с письмом справа налево), но на данный момент это лучшее решение для меня (в конце концов, я, вероятно, перейду на облако Google). Спасибо!
С веб-сайта Abiword: «Обратите внимание, пользователи Windows: из-за отсутствия разработчиков Windows в проекте больше нет версии, доступной для загрузки».
@ThomIves Хотя это может быть правдой, речь идет об использовании Linux через PythonAnywhere, поэтому версии Windows здесь не актуальны.
@ jcgoble3 Согласен, и, хотя я бы предпочел все делать в Linux, иногда мне приходится работать в Windows, поэтому я решил сообщить другим, кто ищет общие решения.
Большое спасибо! Эта подсказка с abiword изумительна!
Еще один, который вы можете использовать, - это libreoffice, однако, как сказал первый респондент, качество никогда не будет таким хорошим, как при использовании реальных типов.
в любом случае, после того, как вы установили libreoffice, вот код для этого.
from subprocess import Popen
LIBRE_OFFICE = r"C:\Program Files\LibreOffice\program\soffice.exe"
def convert_to_pdf(input_docx, out_folder):
p = Popen([LIBRE_OFFICE, '--headless', '--convert-to', 'pdf', '--outdir',
out_folder, input_docx])
print([LIBRE_OFFICE, '--convert-to', 'pdf', input_docx])
p.communicate()
sample_doc = 'file.docx'
out_folder = 'some_folder'
convert_to_pdf(sample_doc, out_folder)
похоже, это не работает параллельно. Я создаю 10 экземпляров Popen для преобразования 10 файлов docx, но получаю только 5 pdf и без каких-либо ошибок.
интересно, я сделал это некоторое время назад, но, может быть, выложите свой код?
Я разместил вопрос со своими кодами: stackoverflow.com/questions/66719566/… @ dfresh22
Python-docx не требует Word (или Windows), потому что практически всю работу он выполняет внутри своего исходного кода. («Практически все», за исключением нескольких внешних стандартных модулей, таких как XML, файлы ZIP и обработка изображений.) Поскольку Python является полным по Тьюрингу языком, вы можете сделать то же самое для создания PDF из ничего без внешнего программного обеспечения. . Прочтите официальные спецификации от начала до конца, и вы поймете, почему гораздо проще использовать внешнюю программу.