Конвертировать RTF в HTML

У нас есть кристаллический отчет, который нам нужно отправить по электронной почте, но HTML, сгенерированный из кристаллического отчета, в значительной степени просто уродлив и вызывает проблемы с некоторыми почтовыми клиентами. Я хотел экспортировать его как форматированный текст и преобразовать его в HTML, если это возможно.

Какие-либо предложения?

Отправить PDF-файл - это не выход?

stiduck 13.01.2009 18:21

Нет, мы отправляем другие документы в виде вложений в формате PDF, но мы хотим, чтобы у сообщения электронной почты было тело. Часть, для которой мне нужен HTML, - это тело.

Aaron Smith 13.01.2009 18:29

Я не могу ответить, так как это закрыто как не по теме, но благодаря GNU я рекомендую использовать UnRTF. brew install unrtf, затем unrtf --html input.rtf > output.html.

GabLeRoux 02.05.2017 16:56

Не уверен, почему люди говорят о случайных утилитах командной строки в вопросе C# (или каким образом это считается «не по теме» !?) - но короткий ответ: просто используйте RtfPipe через NuGet, синтаксис просто var html = Rtf.ToHtml(rtf); , и он поддерживает массу функций. Более подробный ответ см .: stackoverflow.com/a/59572912/398630

BrainSlugs83 03.01.2020 06:43

Как видите, я задал этот вопрос более 10 лет назад, когда Nuget еще не существовало. Спасибо за комментарий / ответ. Также не знаю, почему / когда это было закрыто как не по теме, потому что я, очевидно, прошу способ сделать это, а не использовать библиотеку. В любом случае, добрый день всем.

Aaron Smith 04.01.2020 07:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
49
5
111 608
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Мне не известны какие-либо библиотеки для этого (но я уверен, что многие могут), но если вы уже можете создать HTML из отчета Crystal, почему бы не использовать XSLT для очистки разметки?

XSLT предназначен для преобразования XML, а не HTML.

james.garriss 03.12.2012 18:36

Я думаю, вы можете загрузить его в объект документа Word, используя поддержку офисного программирования .NET и инструменты Visual Studio для офиса.

А затем используйте экземпляр документа для повторного сохранения как HTML-документа.

Я не уверен, как это сделать, но я считаю, что это возможно полностью в .NET без какой-либо сторонней библиотеки.

Слово? Он пытается Избавиться плохой разметки! ;)

Daniel Schaffer 13.01.2009 18:26

о, я забыл об этом ... но это должно дать некоторый контроль над разметкой результата, нет?

chakrit 13.01.2009 18:31

Просто эффективно экспортируя это из слова? Я не использовал автоматизацию офиса в ... 3 версиях ... но, тем не менее, я сомневаюсь в этом.

Daniel Schaffer 13.01.2009 18:33

Я имею в виду, что вы можете редактировать текстовый документ перед его экспортом ... например, удаление определенных элементов и т. д.

chakrit 13.01.2009 18:42

Вы можете попробовать загрузить его в 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, так как он не нужен.

Andrew Hare 13.01.2009 20:18

Майк Столл разместил здесь код для одного, написанного на C#:

http://blogs.msdn.com/jmstall/archive/2006/10/20/rtf_5F00_html.aspx

Этот почти сработал. Я мог бы добавить то, что мне было нужно, но это не стоило усилий.

Aaron Smith 12.03.2009 18:45

Да, это было так близко - но я думаю, что спецификации RTF могли измениться с тех пор, как он это написал ... так что это исказило мой текст. Как жаль!

Shaul Behr 10.03.2011 23:06
Ответ принят как подходящий

Я бы посмотрел на этот инструмент на CodeProject RTFConverter. Этот парень дает отличную разбивку того, как работает программа, а также детали преобразования.

Написание собственного конвертера RTF

Большое спасибо. Это было полезно. Надеюсь, это решит проблемы, которые у нас были. Это произошло снова сегодня, идеальное время. :-)

Aaron Smith 12.03.2009 18:53

В галерее образцов кода MSDN также есть образец под названием Преобразование между RTF и HTML, который позволяет конвертировать между HTML, RTF и XAML.

Я пробовал это, работает хорошо, но есть проблема с пробелами в начале строки: в таких случаях он просто оставляет "" вместо того, чтобы преобразовывать его в Ampersand + nbsp; или добавление пустого тега SPAN. Таким образом, в результирующем html-коде вообще нет начальных пробелов.

Jack Griffin 07.06.2013 21:38

Это сработало хорошо, но я заметил, что при преобразовании из Xaml в HTML (часть процесса RTF в HTML) отсутствует значение единиц (px) в свойстве CSS margin. Простое исправление в методе ParseXamlThickness (толщина строки) просто добавьте '+ "px" (без одинарных кавычек) к каждому из возвращаемых значений в операторе switch.

RyanfaeScotland 21.01.2016 15:12

ОБНОВЛЕНО:

Я пришел домой и попробовал приведенный ниже код, но он не работает. Кому-нибудь интересно, буфер обмена не просто волшебным образом преобразует вещи, как я надеялся. Скорее, он позволяет приложению типа «загружать» объект данных с различными форматами вставки, а затем вы вставляете (что в моей метафоре было бы «загрузкой»), в которую вставляемая программа указывает ее предпочтительный формат. Я лично в конечном итоге использовал этот код, который рекомендовался ранее, и он был чрезвычайно простым в использовании и очень эффективным. После того, как вы импортировали код (в 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 03.01.2020 06:29

@ BrainSlugs83 Согласен! Отвратительный взлом, но да, может сработать.

Max von Hippel 03.01.2020 10:16

Другие вопросы по теме