Обработка COM-объектов ColdFusion в MS Word 2000 завершается через 100 секунд

Я использую ColdFusion 7 на сервере Windows 2003, чтобы общаться с установкой Microsoft Word 2000 по умолчанию, используя COM-объекты. Цель состоит в том, чтобы сгенерировать документ с несколькими таблицами в нем.

Это я умею. Процессор загружается до 100% на время, но мой код работает, и если он короткий, он работает. Проблема, с которой я сталкиваюсь, заключается в том, что код, используемый для создания документа Word, достигает размера около 25 КБ+ (скрипт генерирует много повторяющегося кода).

После того, как сервер потратит 1 минуту 40 секунд на попытки сгенерировать документ:

  • Использование ЦП падает до 0 (ЦП был разделен между jrun.exe для ColdFusion и winword.exe для Word 2000).
  • winword.exe остается в памяти.
  • Время ожидания ColdFusion велико, поэтому клиентский браузер считает, что страница все еще обрабатывается, однако...
  • Если я убью процесс winword.exe, ColdFusion немедленно вернет клиенту ошибку.

Таким образом, эти длинные страницы никогда не заканчиваются. Я пробовал много вариаций.

  • ColdFusion 8 не работает.
  • Использование обновленной JVM для ColdFusion 7/8 не работает.
  • Содержание кода, который я запускаю, не имеет значения. Я делаю много причудливых раскрасок стола, но миллион строк «Hello world» также умирает.
  • Удивительно, но пробная версия Word 2007 действительно работает. Форматирование немного шаткое, поскольку по умолчанию используется Calibri и другие новые шрифты, но сервер будет ждать, скажем, 7 минут, пока оно не будет завершено. А затем перезагрузите сервер, попробуйте выполнить тот же код, и Word 2007 настаивает, что не понимает ни одной команды, которую я ему отправляю. Я сделал пробную активацию, я даже запустил Word 2007 с помощью удаленного рабочего стола после перезагрузки. Слово становится полностью кататоническим после первого перезапуска.

Что я не пробовал:

  • Ворд 2003

Мои поиски в сети были бесплодны, кроме «вот как подключиться к API Word» в стране ColdFusion и «вот как указать количество страниц в нижнем колонтитуле» в стране ASP.NET. Кажется, что никто, использующий продукты Adobe, не пытается это сделать, и ни у кого, использующего продукты Microsoft, нет моей проблемы. И поэтому я бросаюсь на ваши берега, истекая кровью и истощенный, в поисках понимания этой сводящей с ума проблемы тайм-аута.

Вот как выглядит фрагмент кода ColdFusion:

<cfset clientMatterCellStart = myDoc.Tables.Item(1).Cell(2,1)>
<cfset clientMatterCellEnd = myDoc.Tables.Item(1).Cell(2,7)>
<cfset clientMatterCellStart.Merge(clientMatterCellEnd)>
<cfset clientMatterCellStart.Range.Font.Bold = true>
<cfset clientMatterCellStart.Range.Font.Name = "Times New Roman">
<cfset clientMatterCellStart.Range.Font.Size = 14>
<cfset clientMatterCellStart.Range.ParagraphFormat.Alignment = 1><!--- Centered --->
<cfset clientMatterCellStart.Range.Text = "#MySubjects.subject_name[q]#">
<cfset clientMatterCellStart.Shading.BackgroundPatternColor = 13421772><!--- Grey 20% --->

person Jordan Roher    schedule 10.06.2009    source источник


Ответы (7)


Хорошо, ответ номер 2. Поскольку .Net вайнеры говорят, что это работает, вам, возможно, больше повезет при создании документа с помощью внешнего сценария vb.net и передаче любых специальных требований через файл конфигурации и/или аргументы командной строки. В качестве альтернативы, если вы предпочитаете реальный язык, вы можете сделать это на python с модулем win32com.

Короче говоря, ваша проблема может заключаться в том, что Coldfusion имеет дрянную реализацию COM.

person SpliFF    schedule 10.06.2009
comment
может быть, у Coldfusion дерьмовая реализация COM. С моей головой в моих руках, я очень хочу в это поверить. - person Jordan Roher; 10.06.2009
comment
Я хотел бы узнать, знает ли знаток ColdFusion, действительно ли я обречен с этим подходом (если реализация COM CF имеет реальную проблему с длинными запросами). - person Jordan Roher; 10.06.2009
comment
Я вам сочувствую, потому что вы действительно обречены с таким подходом. Я очень старался заставить маршрут COM-объекта работать, потому что было бы быстрее написать код, но я отказался от него после слишком большого количества проблем. - person Jayson; 10.06.2009

Раньше у меня была необходимость создавать документы MS Word, и я провел много исследований, чтобы выяснить, какой способ сделать это лучше всего. В конце концов я обнаружил, что использование MS Word в качестве COM-объекта - очень, очень плохая идея, в основном из-за упомянутых вами проблем с производительностью, а также из-за проблем с безопасностью, которые он вызывает. Это просто плохая идея, и она определенно не будет масштабироваться для нескольких пользователей.

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

  1. Я сохранил документ Word как документ Word XML, открыл его в обычном текстовом редакторе, разобрал на части и использовал ColdFusion для автоматического создания того, что мне было нужно. Это работало хорошо, и проблем с производительностью не было, но разбирать xml и выяснять, как сделать то, что мне нужно, было утомительно и требовало некоторого времени.

  2. Я просто сделал обычный html, спроектировав отчет так, чтобы он выглядел как веб-страница, а затем добавил теги cfheader и cfcontent, чтобы сообщить браузеру, что содержимое представляет собой текстовый документ. Эта опция сработала, но я думаю, что у меня, возможно, были предупреждения о том, что вложение неправильно отформатировано как текстовый документ, вы все равно хотите его открыть? Открытие в MS Word выглядело нормально, и пользователи могли сохранить его на рабочем столе в виде файла документа.

Надеюсь это поможет.

EDIT: Извините, мой фрагмент кода не отображался правильно, вот он...

<cfheader name="content-disposition" value="attachment; filename=report.doc" />
<cfcontent type="application/msword" />
person Jayson    schedule 10.06.2009
comment
Хороший трюк. Я бы не стал полагаться на это сам, потому что HTML-реализация Word — одна из худших (за исключением, может быть, Lotus Notes). Это может сработать, если вы не возражаете против того, чтобы ваш макет был безжалостно уничтожен случайными совершенно непостижимыми способами. - person SpliFF; 10.06.2009
comment
Согласен, к сожалению. Моих клиентов раздражают мельчайшие различия между документами HTML-as-Word и настоящими документами Word. Это должен быть настоящий документ Word. Я также не беспокоюсь ни о безопасности, ни о масштабировании. Сервер находится в стороне, и мы получаем, может быть, 2-3 запроса на эти документы в день. - person Jordan Roher; 10.06.2009
comment
Теперь, когда я думаю об этом, я также раньше делал RTF-документы. Как и в моем подходе с xml, пробовали ли вы генерировать RTF-файлы с помощью ColdFusion? RTF также можно открыть в Word, и он более переносим. - person Jayson; 10.06.2009
comment
Кроме того, если бы я снова столкнулся с этой проблемой, я бы посмотрел, существует ли библиотека .NET, которая может создавать текстовые документы, поскольку ColdFusion может использовать .NET, или я бы посмотрел POI apache для документов Word, чтобы увидеть, есть ли какой-либо прогресс был сделан там с этим проектом. - person Jayson; 10.06.2009
comment
Проверил POI, ничего нет. Кажется, у них нет ведущего разработчика. RTF может быть решением, но я не нашел хорошего руководства о том, как создать сложный файл, кроме как создать его, а затем сохранить и отредактировать исходный код. Кроме того, RTF не могут делать нижние колонтитулы. - person Jordan Roher; 10.06.2009
comment
Ах, я думаю, вы правы насчет верхних/нижних колонтитулов. Теперь я помню, поэтому я выбрал xml-подход. - person Jayson; 10.06.2009

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

person SpliFF    schedule 10.06.2009
comment
Пробовал это. IE 7, 8, Firefox 3, Chrome. Уверен, что проблема не в браузере. - person Jordan Roher; 10.06.2009

Я не думаю, что преобразование HTML в PDF вместо Word является вариантом?

person SpliFF    schedule 10.06.2009
comment
Я уже построил что-то, что генерирует PDF-документы. Нашим клиентам это нравится, но их первый вопрос: могу ли я это отредактировать? Эм... нет... - person Jordan Roher; 10.06.2009

Вероятно, вы правы — вы относитесь к небольшой группе людей, пытающихся делать подобные вещи.

Если у вас есть возможность написать класс .Net или веб-сервис, это может быть выходом, поскольку похоже, что реализация COM в ColdFusion оставляет желать лучшего.

Подумайте о своем процессе и попробуйте реорганизовать часть вашего кода, которая создает документ, затем напишите его в .Net и используйте этот класс/сервис из ColdFusion.

person Adam Tuttle    schedule 10.06.2009

Я полностью согласен со всеми здесь говорящими, что COM - плохая идея.

Что бы это ни стоило, у меня были хорошие результаты при преобразовании очень длинных (сотни страниц) и довольно сложных документов в Word с использованием HTML-файлов, созданных Coldfusion, с таблицами стилей CSS.

Просто отправьте их в Word с помощью:

<cfcontent type="application/msword" file="#filename#" deletefile="Yes" />
person Vincent Buck    schedule 11.06.2009

У меня также были проблемы с ColdFusion и COM (мы использовали его для использования Word и PPT и преобразования в HTML). Я думаю, вам лучше написать страницу .aspx или веб-службу .NET и передать необходимую информацию. Если вы планируете больше манипулировать документами MS Office, стоит обратить внимание на платное решение: http://www.aspose.com/categories/file-format-components/aspose.words-for-.net-and-java/default.aspx

Мы использовали их для файлов PPT и были очень довольны.

person Ryan McIlmoyl    schedule 11.06.2009