Как вставить картинку в rtf файл

Обновлено: 04.07.2024

Оператор запятой оценивает каждый из своих операндов (слева направо) и возвращает значение последнего операнда.

Итак, посмотрим пример:

Теперь в foo метод this равен a (потому что foo присоединен к a ). Поэтому, если вы вызываете a.foo( ), он будет записывать false в консоли.

Но если вы звонили (0, a.foo)() . Выражение (0, a.foo) будет оценивать каждый из его операндов (слева направо) и возвращает значение последнего операнда. Другими словами, (0, a.foo) эквивалентен

. Поскольку эта функция больше не привязана ни к чему, ее this является глобальным объектом window . Вот почему он записывает true в консоли при вызове (0, a.foo)() .

Самый простой способ - изменить код RTF, чтобы вставить картинку самостоятельно.

В формате RTF изображение определяется следующим образом:

'' A знак вопроса указывает, что контрольное слово является необязательным. «данные» - это просто содержимое файла в шестнадцатеричном формате. Если вы хотите использовать двоичный файл, используйте управляющее слово \ bin.

\ pict = запускает группу изображений, \ pngblip = png picture \ picwX = ширина изображения (X - значение пикселя) \ pichX = высота картинка \ picwgoalX = желаемая ширина картинки в твипах

Итак, чтобы вставить картинку, вам просто нужно открыть свою картинку, преобразовать данные в шестнадцатеричный формат, загрузить эти данные в строку и добавить коды RTF вокруг него, чтобы определить картину RTF. Теперь у вас есть отдельная строка с данными изображения, которую вы можете вставить в код RTF документа. Не забывайте закрывать ">"

Далее вы получаете код RTF из вашего RichTextBox (rtbBox.Rtf), вставляете картинку в нужное место и устанавливаете код rtbBox.Rtf

Вы можете вставить некоторое содержимое RTF (например, из Word) в левое поле RTF и нажать «Показать коды RTF», чтобы отобразить коды RTF в правом окне RTF, или вставить код RTF. в правом RTB и нажмите «Применить коды RTF», чтобы увидеть результаты с левой стороны.

Конечно, вы можете редактировать коды по своему усмотрению, что делает его очень удобным для проверки того, поддерживает ли RichTextBox нужные вам команды или узнать, как использовать контрольные слова RTF.

Вы можете скачать полную спецификацию для RTF онлайн.

NB Это всего лишь небольшая вещь, которую я собрал за 5 минут, поэтому я не реализовал открытие или сохранение файлов, перетаскивание и другие цивилизованные вещи.

Нужно вставить BMP-шное изображение в конец или начало файла RTF.
Конкретного метода не нагуглил как это сделать, узнал только, что сам RTF понимает лишь EMF изображения. Конвертировать BMP в EMF не проблема, если это действительно так.

Подскажите пожалуйста, как вставить изображение в RTF файл?
Может быть есть в C++ Builder стандартные функции в RichEdit или нечто подобное? Мне не удалось найти, либо поправьте, плохо гуглил.

Очень жду ответа, спасибо большое!

Добавлено через 13 часов 27 минут
UP!
ну неужели никто не подскажет.

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь


Вставка изображения в файл Excel
у меня следующая проблема, необходимо вставить изображение в файл EXCEL, для этого я воспользовался.


RichTextBox и вставка кирилицы в RTF из буфера обмена
Всем привет. Попытался из SQL Server Management Studio скопировать запрос и вставить в свой.

Вставка закладки в шаблон формата RTF с последующей отгрузкой данного шаблона в richTextBox
Всем доброго дня. подскажите следующий момент. У меня есть шаблон файла формата RTF, в данном.

Создание rtf файла и запись в него текста и изображения
Доброго вам здоровичка. Помогите паж-ста с задачкой: На форме есть пикчербокс с фото, текстбокс.

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

стандартный RichEdit этого не умеет

Добавлено через 1 минуту
можно попытаться использовать компонент WordApplication c закладки MS Office, только предварительно надо в опциях-пакеты - отметить эти компоненты, по умолчанию они отключены из-за копирайтов

Тоже не вариант, погуглил,

Надо чтобы был установлен на компе Word. Это не то, нужно, чтобы картинка в RTF впихивалась без привязки к столь громоздким библиотекам.

Если бы просто узнать алгоритм и как вообще хранятся файлы в rtf, я ничего не нагуглил подобного
Я бы просто втупую вставил бы по битикам картинку прямо в файл или в каком месте она там хранится. Но из RTF я лишь текст умею форматировать, а о картинках ничего нет.

Может еще варианты? кто что подскажет? Выкопировки кода?
буду очень благодарен


ЗЫ если же попытаюсь статически влинковать библиотеку Word'a, я могу только представить до каких размеров возрастет моя софтинка

погуглите про ричєдит версии 3

Добавлено через 6 минут
нашлось у меня такое

У меня TurboC++ никакого КвикРепорта или тому подобного нет.
Решил отчетики в RTF генерировать в ручтую.
В TStrings просто записываю Потом сохраняю с расширением rtf и все
В принципе вполне все сносно - и шрифт разного размера и таблички многострочные.
Все было хорошо до того момента пока не понадобилось вставлять картиночки.
Код нашел. Проверил. ВордПад открывает.
Но все оказалось не так то просто.
ВордПад единственный кто открывает.
Остальные программы (OO WordViewer Abiword и компоненты RichView, RichEdit) не хотят
Причем если ВордПадом пересохранить все открвают.

Вопрос во том как это починить?

То что я делаю в ручную dibitmap , то как сохраняет при пересохранении вордпад wmetafile8

Причем уже смотрел The Rich Text Format (RTF) Specification
Вроде там dibitmap дозволенный формат.

Видимо дело в том, что версии как RTF, так и RichEdit могут быть разные. Не знаю как в TurboC, а например в BCB6 и Delphi7 юзается древнейший RichEdit 1.0 (riched32.dll), хотя уже в Win98 поддерживался 2.0 (riched20.dll), а в WinXP и вовсе 4.1 (msftedit.dll).
Разумеется в вордпаде юзается последняя версия, а в RichView\RichEdit возможно более древняя, не понимающая dibitmap в RTF

Дак в Турбе тоже что и в билдере 6 с Richedit
Я уже с этим встречался.
Чтоб таблички отображать красиво надо подключать с программой RICHED20.DLL таскать.
А есть из 2003 офиса вытащит этот RICHED20.DLL дак даже мышкой можно ширину столбиков таблицы менять - круче ВордПада из ХР
Плюс Юникод открывает Richedit тоже как хочет (в зависимости от 9х или 2000/XP).

А вот если конвертнуть BMP в EMF - все утро придумывал Ж)
и вставить как
\par <\pict\emfblip\picw3219\pich1125\picwgoal1545\pichgoal545
то тут Ворд-Пад не видит, зато все остальные видят

Может кому пригодится простейший код BMP -> EMF для RTF ниже, примеры RTF прикрепил
ЗЫ: Что-то идея генерировать RTF разонравилась.. буду пробывать подключать freereport к этой ТурбеС++

У меня почему-то остаётся метафайл пустой. Сохранял отдельно - 0 байт.

Добавлено через 4 часа 33 минуты
С метафайлом помогли разобраться. Удалять метаканву нужно перед загрузкой в поток.
А вот, что эта часть кода у Вас значит?

Зачем проверка на длину, если в IntToHex задаёте вывод в 2 символа?
Ну, и следующая строчка кажется абсурдной. Зачем брать подстроку в 2 символа с конца, если, по идее, их всего 2?
И потом посимвольно последовательно присваивать первый символ к первому, второй к второму. Не понимаю.
Не будет ли равноценным этот более простой код? Или я что-то упустил?

Добавлено через 1 час 26 минут
Только BYTE tBt, естественно.

Добавлено через 1 час 49 минут
Я так понимаю, дело в кодировке. Метафайл, который отображается и в WordPad'е и в MS Word'e, при той же картине внутри имеет другой код.
Заметил, что генерируемый мною текст кода начинается с 010000006C. а тот, что сохраняется текстовыми процессорами - 010009.
Кто знает, где про структуру метафайлов почитать можно?

Добавлено через 42 минуты
Так, от тестовых редакторов шапка перед моим кодом:
010009000003c607000008003c05000000003c05000026060f006e0a574d 464301000000000001
00952300000000010000004c0a0000000000004c0a0000

Ещё хвост отличается, но я там не нащупал стык пока.

Добавлено через 2 часа 0 минут

TMP тут AnsiString, которую потом сохраним в rtf-файл.
Видит картинку в Word'е, а вот в WordPad нет, как и в RichEdit с поддержкой OLE.
Проблема в структуре метафайла, т.к. другие метафайлы видят все.
Надеюсь, у кого-нибудь будут соображения по этой теме.

Хвост тоже нащупал!

0400000003010800050000000b0200000000050000000c02570157010500 000014020000000007
000000fc020000ffffff000000040000002d010000050000000102ffffff 000400000002010200
040000002d0100000c00000040092100f0000000000000005a015a010000 0000040000002d0100
0008000000fa0200000100000080808000040000002d0101000400000004 010d00070000001804
4b014b010f000f0008000000fa0200000000000000000000040000002d01 020008000000fa0200
0001000000c0c0c000040000002d0103000400000004010d000700000018 041701170143004300
070000001804e200e200780078000500000014025e003601050000001302 fc0024000500000014
022400fc0005000000130236015e000500000014020f00ad000500000013 024b01ad0005000000
140224005e000500000013023601fc000500000014025e00240005000000 1302fc003601040000
002d01020004000000f0010300050000001402ad000f00040000002d0101 000400000004010d00
050000001302ad004b010500000014020f00ad000500000013024b01ad00 1c000000fb02f5ff00
0000000000900100000001000000005461686f6d6100003f4700003f3f00 006937213f3f123f3f
3f123f3f3f613f12040000002d010300050000000902808080000a000000 320aa8004e01020000
0030b006000500050000001402a80059010c000000320a0100a800030000 003930b00006000600
05000500000014020100b9000d000000320a4b01a300040000002d3930b0 040006000600050005
00000014024b01b8000d000000320aa800010004000000313830b0060006 000600050005000000
1402a8001800040000002d01020007000000fc0201000000000000000400 00002d0104001c0000
00fb021000070000000000bc02000000cc0102022253797374656d000000 000000000000000000
0000000000000000000000000000040000002d010500050000001402ad00 ad0008000000fa0200
000200000080000000040000002d0106000400000004010d0007000000fc 020000800000000000
040000002d01070005000000010280000000040000000201020005000000 130236005500040000
002d01020004000000f001060008000000fa020000010000008000000004 0000002d0106000400
000004010d000a000000240303005e003b00570040005500360004000000 2d01040004000000f0
010700040000002d01030005000000090280000000040000002d01040005 0000000102000000ff
040000000201010009000000320a270055000100000055bb070005000000 140227005c00040000
002d01020004000000f0010600040000002d010400040000002d01050005 0000001402ad00ad00
08000000fa0200000200000000008000040000002d010600040000000401 0d0007000000fc0200
00000080000000040000002d010700050000000102000080000400000002 010200050000001302
b4005800040000002d01020004000000f001060008000000fa0200000100 000000008000040000
002d0106000400000004010d000a000000240303006100af006200b70058 00b400040000002d01
040004000000f0010700040000002d010300050000000902000080000400 00002d010400050000
000102000000ff040000000201010009000000320ab40058000100000049 bb0400050000001402
b4005c00040000002d010200040000002d010400040000002d0105000300 00000000

Вот что это за "оболочка" для моего файла? Универсальная ли она?

Добавлено через 3 часа 39 минут

The Windows GDI API provides a way to save and load metafiles on disk. This is the CreateMetafile(LPCTSTR filePath) function. But, using it for these purposes not a good idea. This way, a created metafile doesn't work with all versions of MS Word and Picture object (IPicture). To avoid these restrictions, you need to save the metafile in a placeable format. In this case, metafile bits are prefixed with a metafile header structure. This structure contains the metafile dimensions and an indication of the placeable metafile. Its size is 22 bytes. The structure is not defined in standard header files; thus, you need to define it explicitly. The next lines of code show how to use the WMFile class to save a placeable metafile. This part of the code can be used in conjunction with the previous one.

Я пытаюсь добавить изображение в RTF-документ, который я создаю. Я бы предпочел не использовать методы "копировать/вставлять" (которые включают вставку изображения в RichTextBox, а затем доступ к нему .RTF свойство), которые очищают буфер обмена (как это будет хлопот и путаницы для моих конечных пользователей).

код, который у меня есть до сих пор, возвращает строку, которая должна быть вставлена в RTF-документ для печати изображения. Введенное изображение (расположенное в $path) обычно находится в bmp или jpeg формат, но на данном этапе меня не интересует, как изображение хранится в RTF, только то, что я могу заставить его работать.

однако проблема в том, что этот код не работает, потому что, насколько я могу судить, string str не имеет правильного преобразования строк для работы в RTF.

Edit: моя проблема отсутствовала пробел после hex в @ "hex", а также не удаляла символы " - " из возвращаемого значения BitConverter

попробуйте эти ссылки

вы должны изменить "picwgoa" на "picwgoal" и " pichgoa "на"pichgoal"

здесь у вас есть список поддерживаемых форматов изображений

провел день или около того, гугля ответы на это. Собранные вместе лакомые кусочки со всего stackoverflow и других источников. Подайте это изображение, оно вернет строку, которую вам нужно добавить в richtextbox.rtf расширение. Ширина изображения изменяется и должна быть рассчитана, формула приведена.

вы обнаружите, что WordPad игнорирует любое изображение, не сохраненное в правильном формате метафайла Windows. Таким образом, предыдущий пример на этой странице не будет отображаться вообще (хотя он отлично работает в OpenOffice и Word). Формат, который будет поддерживать WordPad есть:

получение соответствующих данных можно сделать следующие процедуры в указанной выше ссылке. Для тех, кто с python ищет решение, вот начало одного (я считаю, что некоторые проблемы с dpi/масштабированием остаются). Это требует PIL(или подушка), ctypes и clr (Python .NET). Используйте PIL / Pillow и сначала откройте изображение. Здесь у меня он открыт как "canv":

я обнаружил, что большинство rtf-ящиков используют следующий формат:

, когда [hex/bin] большое количество шестнадцатеричных строк, представляющих формат изображения. Этот способ работает как для Word rtf, так и для RTF box - поэтому он более эффективен.

в моем компьютере изображение размером 180x320 пикселей было преобразовано в 2699x4799 твипов, что означает 1pix=15 твипов, насколько я могу видеть, это похоже на 3 компьютера, которые я тестировал, между ними WinXP prof, WinXP home и Win 7.

Большинство примеров, которые я вижу, говорят о том, чтобы поместить его в буфер обмена и использовать вставку, но это не кажется очень хорошим, потому что он перезаписывает буфер обмена.

Я видел один метод, который вручную помещал изображение в RTF с помощью pinvoke для конвертировать изображение в WMF. Это лучший способ? Есть ли что-нибудь более простое, что я могу сделать?

Вы можете вставить ( Ctrl + V ) изображение в RichTextBox - хотя забавная вещь; Когда я сохраняю свойство RichTextBox RTF в файл , когда изображение уже вставлено в RichTextBox , кажется, что также сохраняется изображение также в RTF. (я повторно загрузил RTF с помощью RichTextBox.Load() , и он загрузил изображение из сохраненного RTF )

Самый простой способ - изменить код RTF, чтобы вставить изображение самостоятельно.

В RTF изображение определяется так:

'' Вопросительный знак указывает, что контрольное слово является необязательным. «данные» - это просто содержимое файла в шестнадцатеричном формате. Если вы хотите использовать двоичный файл, используйте управляющее слово \ bin.

\ pict = запускает группу изображений, \ pngblip = png изображение \ picwX = ширина изображения (X - значение пикселя) \ pichX = высота изображения \ picwgoalX = желаемая ширина изображения в твипах

Итак, чтобы вставить изображение, вам просто нужно открыть изображение, преобразовать данные в шестнадцатеричный, загрузить эти данные в строку и добавить коды RTF вокруг нее, чтобы определить изображение RTF. Теперь у вас есть автономная строка с данными изображения, которую вы можете вставить в код RTF документа. Не забудьте закрыть ">"

Затем вы получаете код RTF из своего RichTextBox (rtbBox.Rtf), вставляете изображение в нужное место и устанавливаете код rtbBox.Rtf.

Вы можете вставить некоторое содержимое RTF (например, из Word) в левое поле RTF и щелкнуть «Показать коды RTF», чтобы отобразить коды RTF в правом поле RTF, или вы можете вставить код RTF в правое поле RTF и щелкнуть на «Применить коды RTF», чтобы увидеть результаты слева.

Конечно, вы можете редактировать коды по своему усмотрению, что делает его довольно удобным для проверки того, поддерживает ли RichTextBox нужные вам команды, или узнать, как использовать управляющие слова RTF.

Вы можете скачать полную спецификацию RTF онлайн.

NB Это просто мелочь, которую я собрал за 5 минут, поэтому я не реализовал открытие или сохранение файлов, перетаскивание или другие цивилизованные вещи.


Как воткнуть картинку в RTF файл который показыватеся через RichTxt32 я правда не знаю как это сделать для АНИМИРОВАННЫХ gif файлв - хотя можно использовать HTML Control (Shell.Application.2)


------------------
Часто бывает так, что есть над чем задуматься, а нечем.

А кроме WM_PASTE никак ? Для этого ее еще надо в буффер занести, что в даннос случае абослютно не приемлемо. Я просто не знаю как храняться картинки в RTF формате


------------------
Часто бывает так, что есть над чем задуматься, а нечем.

Не думаю что это возможно с RTF control, но в MS Word можно еше вставить картинку как объект created from file, .InlineShapes.AddPicture или как .InlineShapes.AddOLEObject

В RTF Control можно также сделать мышкой drag & drop выделенный файл в директории. По-видимому, для этого можно использовать :

Исправлено: rubinov, 12.11.06 00:51

ActiveX не то чтобы картинок не показывает, он даже работу с таблицами эмулирует едва-едва.


------------------
Совершенство - это не тогда, когда нельзя
ничего прибавить, а тогда, когда нечего убавить.

последовательность в виде текстового представления файла jpeg,gif. в HEX

Исправлено: AlexK, 12.11.06 10:13

Интересно - надо будет попробовать


------------------
Часто бывает так, что есть над чем задуматься, а нечем.

Спасибо Жаль тока они не анимационные получаются в смыcле gif


------------------
Часто бывает так, что есть над чем задуматься, а нечем.

Так что же, RichTxt32 умеет картинки показывать?


------------------
Совершенство - это не тогда, когда нельзя
ничего прибавить, а тогда, когда нечего убавить. Влад Колосов
Так что же, RichTxt32 умеет картинки показывать?

BMP file - может

Исправлено: rubinov, 13.11.06 05:18

А может лучше использовать DHTML Edit Control?

Да именно это я и думаю - проще с анимированными гифами да в ваше с управлением

Читайте также: