2009-08-20 5 views
1

Я работаю над продуктом, который создает вывод MS Word, создавая документ HTML с соответствующими битами Word CSS и встроенной в него магией XML. Теперь мне нужно вставить RTF (изображения и стилизованный текст) в документ, и поэтому я рассматриваю многопотоковые функции генерации HTML в .NET.Многостраничные HTML и встроенные изображения из .NET без доступа к диску?

Я хотел бы сгенерировать документ MHTML, преобразовывая фрагменты RTF в изображения в памяти, а затем просто вставляя данные, закодированные в Base64, непосредственно в объект MHTML. До сих пор я не могу найти .NET-решений для этого.

MS CDO stuff многообещающий, но похоже, что единственный способ создать вложение - предоставить URL-адрес данных и использовать AddRelatedBodyPart(), чтобы добавить его в объект.

Пакет System.Net.Mail также выглядит убедительным (как задокументировано here и в предыдущем вопросе here), но я не вижу простого способа конвертировать сгенерированный почтовый объект в строку - API, похоже, сосредоточиться на отправке почтовых сообщений, а не генерировать файлы.

Прямо сейчас, я продвигаюсь с использованием подхода, который использует CDO и временные каталоги, но я недоволен этим как долгосрочный подход. Любые лучшие предложения?

ответ

1

Не было большого спроса на способность System.Net.Mail отправлять свой вывод на определенный поток, определенный пользователем, но об этом говорили. Можете ли вы дать мне больше информации о вашем сценарии? Я хотел бы знать, как люди используют это с точки зрения обоснования для добавления этой функции.

Я думаю, вы могли бы использовать отражение, чтобы перенаправить выходной поток из FileStream в другой поток до отправки сообщения. Большая часть кода в System.Net.Mail использует декораторы вокруг объектов Stream, поэтому я подозреваю, что это было бы возможно, но я не знаю достаточно хорошо, чтобы дать вам хороший фрагмент кода о том, как это сделать. Кроме того, System.Net.Mail использует собственный кодировщик base64, поэтому он достаточно быстрый. Я изменил некоторые вещи для .Net 4.0, так что вы, вероятно, получите еще лучшую производительность, хотя я сомневаюсь, что это будет примечательно.

+0

Фон: Мне нужно сгенерировать Word (и вскоре, Excel) вывод из настольного приложения. MS Office имеет большую поддержку HTML + XML + CSS в качестве формата файла, что означает, что если я могу создать тщательно обработанный HTML-документ, я могу сгенерировать вывод Word. Я предпочитаю это создавать собственный вывод Word по нескольким причинам, не в последнюю очередь потому, что мне также нужно генерировать вывод HTML. Word правильно обрабатывает файлы MHTML, что позволяет использовать однотипное решение для вывода со встроенными изображениями. Итак, я хотел бы динамически генерировать MHTML для потока, используя вызовы API (а не файлы) для построения ввода. –

+0

Спасибо за информацию. У нас было много отзывов от людей, желающих поддерживать MHTML в System.Net.Mail, и, к сожалению, он не добавляется для .Net 4.0, однако он довольно высок в списке функций для будущих выпусков System.Net.Mail.Я передам информацию о вашем сценарии нашему премьер-министру. –

+0

Обновление: наша команда официально отслеживает этот запрос для будущей разработки, поэтому это, вероятно, каким-то образом будет поддерживаться в будущем в System.Net.Mail. Проверьте блог NCL (blogs.msdn.com/ncl) на наличие обновлений этой и других новых функций. –

0

Поддержка кодировки Base64 в .NET не очень проста, а System.Net.Mail не является универсальным. Я закончил с помощью CHilkat S/MIME, и он отлично работал.

+0

На самом деле System.Net.Mail использует свою собственную кодировку base64, и это очень быстро в соответствии с нашими перфомансами. Это также довольно общая цель, но я признаю, что вокруг есть некоторые недостатки. –

+0

Jeff, я просто дважды проверил реализацию Convert.ToBase64String, и похоже, что вы правы: он правильно разворачивает внутренний цикл, поэтому он должен быть быстрым. Странно, что я помню, как выглядел родной метод преобразования .NET Base64, который этого не делал, но я не знаю, где. Это ранние симптомы Альцгеймера или вы можете подумать о том, где это может быть? –