У нас есть кристаллический отчет, который нам нужно отправить по электронной почте, но HTML, сгенерированный из кристаллического отчета, в значительной степени просто уродлив и вызывает проблемы с некоторыми почтовыми клиентами. Я хотел экспортировать его как форматированный текст и преобразовать его в HTML, если это возможно.
Какие-либо предложения?
Нет, мы отправляем другие документы в виде вложений в формате PDF, но мы хотим, чтобы у сообщения электронной почты было тело. Часть, для которой мне нужен HTML, - это тело.
Я не могу ответить, так как это закрыто как не по теме, но благодаря GNU я рекомендую использовать UnRTF. brew install unrtf, затем unrtf --html input.rtf > output.html.
Не уверен, почему люди говорят о случайных утилитах командной строки в вопросе C# (или каким образом это считается «не по теме» !?) - но короткий ответ: просто используйте RtfPipe через NuGet, синтаксис просто var html = Rtf.ToHtml(rtf); , и он поддерживает массу функций. Более подробный ответ см .: stackoverflow.com/a/59572912/398630
Как видите, я задал этот вопрос более 10 лет назад, когда Nuget еще не существовало. Спасибо за комментарий / ответ. Также не знаю, почему / когда это было закрыто как не по теме, потому что я, очевидно, прошу способ сделать это, а не использовать библиотеку. В любом случае, добрый день всем.





Мне не известны какие-либо библиотеки для этого (но я уверен, что многие могут), но если вы уже можете создать HTML из отчета Crystal, почему бы не использовать XSLT для очистки разметки?
XSLT предназначен для преобразования XML, а не HTML.
Я думаю, вы можете загрузить его в объект документа Word, используя поддержку офисного программирования .NET и инструменты Visual Studio для офиса.
А затем используйте экземпляр документа для повторного сохранения как HTML-документа.
Я не уверен, как это сделать, но я считаю, что это возможно полностью в .NET без какой-либо сторонней библиотеки.
Слово? Он пытается Избавиться плохой разметки! ;)
о, я забыл об этом ... но это должно дать некоторый контроль над разметкой результата, нет?
Просто эффективно экспортируя это из слова? Я не использовал автоматизацию офиса в ... 3 версиях ... но, тем не менее, я сомневаюсь в этом.
Я имею в виду, что вы можете редактировать текстовый документ перед его экспортом ... например, удаление определенных элементов и т. д.
Вы можете попробовать загрузить его в Google docs и загрузить как HTML.
Если вы не против запачкать руки, написать конвертер RTF в HTML не так уж и сложно.
Написание конвертера RTF-> HTML общего назначения было бы несколько сложным, потому что вам нужно было бы иметь дело с сотнями глаголов RTF. Однако в вашем случае вы имеете дело только с теми глаголами, которые используются специально Crystal Reports. Готов поспорить, что стандартное кодирование RTF, созданное Crystal, не сильно отличается от отчета к отчету.
Я написал конвертер RTF в HTML на C++, но он имеет дело только с базовым форматированием, таким как шрифты, выравнивание абзацев и т. д. Мой переводчик в основном удаляет любое специальное форматирование, с которым он не готов справиться. Потребовалось около 400 строк C++. Он в основном сканирует текст на наличие тегов RTF и заменяет их эквивалентными тегами HTML. Теги RTF, которых нет в моем списке, просто удаляются. При написании такого конвертера очень полезна функция регулярного выражения.
Зачем конвертировать из RTF-> HTML, если он уже конвертирует Report-> HTML? Он должен вообще пропустить RTF, так как он не нужен.
Майк Столл разместил здесь код для одного, написанного на C#:
http://blogs.msdn.com/jmstall/archive/2006/10/20/rtf_5F00_html.aspx
Этот почти сработал. Я мог бы добавить то, что мне было нужно, но это не стоило усилий.
Да, это было так близко - но я думаю, что спецификации RTF могли измениться с тех пор, как он это написал ... так что это исказило мой текст. Как жаль!
Я бы посмотрел на этот инструмент на CodeProject RTFConverter. Этот парень дает отличную разбивку того, как работает программа, а также детали преобразования.
Написание собственного конвертера RTF
Большое спасибо. Это было полезно. Надеюсь, это решит проблемы, которые у нас были. Это произошло снова сегодня, идеальное время. :-)
В галерее образцов кода MSDN также есть образец под названием Преобразование между RTF и HTML, который позволяет конвертировать между HTML, RTF и XAML.
Я пробовал это, работает хорошо, но есть проблема с пробелами в начале строки: в таких случаях он просто оставляет "" вместо того, чтобы преобразовывать его в Ampersand + nbsp; или добавление пустого тега SPAN. Таким образом, в результирующем html-коде вообще нет начальных пробелов.
Это сработало хорошо, но я заметил, что при преобразовании из Xaml в HTML (часть процесса RTF в HTML) отсутствует значение единиц (px) в свойстве CSS margin. Простое исправление в методе ParseXamlThickness (толщина строки) просто добавьте '+ "px" (без одинарных кавычек) к каждому из возвращаемых значений в операторе switch.
Я пришел домой и попробовал приведенный ниже код, но он не работает. Кому-нибудь интересно, буфер обмена не просто волшебным образом преобразует вещи, как я надеялся. Скорее, он позволяет приложению типа «загружать» объект данных с различными форматами вставки, а затем вы вставляете (что в моей метафоре было бы «загрузкой»), в которую вставляемая программа указывает ее предпочтительный формат. Я лично в конечном итоге использовал этот код, который рекомендовался ранее, и он был чрезвычайно простым в использовании и очень эффективным. После того, как вы импортировали код (в VStudio, Project -> Add Existing Files), вы просто переходите html в rtf следующим образом:
return HtmlToRtfConverter.ConvertHtmlToRtf(myRtfString);
или в обратном направлении:
return RtfToHtmlConverter.ConvertHtmlToRtf(myHtmlString);
Большинство, если не все вышеперечисленные ответы, предоставляют исчерпывающие, часто основанные на библиотеке, решения возникшей проблемы. Я нахожусь вдали от своего компьютера и поэтому не могу проверить эту идею, но один альтернативный, дешевый и неопределенно хакерский метод был бы следующим.
private string HTMLFromRtf(string rtfString)
{
Clipboard.SetData(DataFormats.Rtf, rtfString);
return Clipboard.GetData(DataFormats.Html);
}
Опять же, не совсем уверен, что это сработает, но просто возился с каким-то html на моем iPhone, я подозреваю, что это так. Документация - здесь. Более подробное объяснение / документы RE получение и настройку моделей данных в буфере обмена можно найти в здесь.
(Да, я полностью осознаю, что я здесь много лет спустя, но я предполагаю, что это тот вопрос, на который некоторые люди все еще хотят получить ответ).
Хммм ... если вы использовали этот подход для вставки в программу, например word, и повторного копирования данных обратно в буфер обмена, это могло бы действительно сработать.
@ BrainSlugs83 Согласен! Отвратительный взлом, но да, может сработать.
Отправить PDF-файл - это не выход?