Docx в pdf, используя openoffice без головы слишком медленно - PullRequest
7 голосов
/ 31 марта 2011

Я использую PHPWord для генерации docx файлов. И это прекрасно работает. Но теперь мне нужно также сделать доступными некоторые из этих файлов в PDF-версии.

После нескольких исследований я обнаружил PyODConverter , которые используют OOo. Казалось, довольно хороший вариант, так как я не хочу зависеть от сторонних веб-сервисов. Я опробовал его на своей машине, и он оштрафован, поэтому я применил его и на своем сервере. Это заняло немного больше времени, но мне тоже удалось заставить его работать там.

Однако есть (плохая) проблема. На сервере это займет около 21 секунды, в то время как на моей машине это займет не больше 2. :( Это слишком много времени для моих нужд, поэтому я пытался определить, что может быть причиной этой задержки. Запуск openoffice в режиме healess с созданием сокета - это нормально. Поэтому я смотрел на скрипт на python, пытаясь выяснить, какая инструкция может вызывать замедление. Я сузил это до этой строки:

context = resolver.resolve("uno:socket,host=127.0.0.1,port=8100;urp;StarOffice.ComponentContext")

Это действие, для выполнения которого требуется около 20 секунд. Код, куда он вставлен:

localContext = uno.getComponentContext()
resolver = localContext.ServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", localContext)
try:
    context = resolver.resolve("uno:socket,host=127.0.0.1,port=8100;urp;StarOffice.ComponentContext")
except NoConnectException:
    raise DocumentConversionException, "failed to connect to OpenOffice.org on port %s" % port
self.desktop = context.ServiceManager.createInstanceWithContext("com.sun.star.frame.Desktop", context)

Есть какие-нибудь подсказки о том, что может быть причиной этой задержки? Я исключил документ, который я пытаюсь преобразовать, поскольку эти операции выполнялись до этого. Может ли это быть проблемой с «Uno»? Или, может быть, отсутствует другая библиотека, которая может вызывать бесполезное тестирование во время операции resol ()?

Любые идеи приветствуются. :)

С наилучшими пожеланиями, беспокойный

Ответы [ 3 ]

4 голосов
/ 05 апреля 2011

Мне удается устранить задержку с помощью труб вместо разъемов для подключения.

context = resolver.resolve("uno:pipe,name=myuser_OOffice;urp;StarOffice.ComponentContext")

У меня все еще есть одна проблема ... пользователь, выполняющий скрипт python, должен быть тем же, который запускает OOo, чтобы все работало нормально. Обычно это не будет большой проблемой, но я пытаюсь запустить python из своего веб-приложения, но мне все еще не удается заставить его работать. Я пытаюсь что-то вроде этого:

exec('sudo -u#1000 -s python path/to/DocumentConverter.py filename.docx filename.pdf');

Я ничего от этого не получаю .. и не понимаю почему. Может быть, пользователь (www-data), выполняющий exec (), не имеет разрешения на выполнение sudo ??

2 голосов
/ 31 марта 2011

Жаль, что openoffice такой тяжелый. Я тоже обдумывал это, но потом нашел более легкое решение - abiword.

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

abiword document.doc --to=ps --exp-props="pages:1-4"
gs -q -dNOPAUSE -dBATCH -dTextAlphaBits=4  -dGraphicsAlphaBits=4 -r72 -sDEVICE=pnggray -sOutputFile=preview%d.png document.ps

Таким образом, вы можете получить последнее abiword и попробовать что-то вроде этого:

abiword document.docx --to=pdf
2 голосов
/ 31 марта 2011

Возможно, распознаватель имен на сервере не знает localhost (что было бы очень странно, но 20 секунд звучат как тайм-аут DNS).Вы можете попробовать заменить его на 127.0.0.1.

В качестве альтернативы, возможно, он хорошо справляется с поиском, возвращает адреса IPv6 и IPv4 для localhost, пытается установить соединение через IPv6 и не работает (т. Е. Компонент может не поддерживать IPv6 или не связываться).к этому интерфейсу по умолчанию) и только затем возвращаться к IPv4.В этом случае средство защиты будет таким же: замените localhost на 127.0.0.1.

...