Как уменьшить размер RTF со встроенными изображениями?
У нас есть код, который создает RTF-документ из шаблона RTF. Он в основном выполняет строковый поиск и заменяет специальные теги в RTF файле. Это доступно через веб-страницу.
Как правило, время обработки для этого действительно быстрое.
Однако нам нужно встроить изображение в шаблон. Мы вставляем их в виде изображений JPEG, используя функцию Word "Вставить/Изображение/Из файла...". Но мы обнаружили, что результирующий размер файла RTF в значительной степени зависит от изображения.
Например, я вставил 20-килограммовый логотип JPEG (который в основном представляет собой сплошной фон с некоторым текстом). Файл RTF увеличился в размере от 390 тыс. (Без изображения) до 510 тыс. (С изображением).
Затем мы вставили JPEG, содержащий скриншот, то есть изображение содержит текст, несколько цветов и т.д. JPEG составляет около 150 тыс. Используя это изображение, файл RTF увеличился в размере от 390 К до 3,5 МБ.
Таким образом, кодировка, которую Word использует для хранения изображений в RTF, не выполняется линейно. Я предполагаю, что это зависит от того, что находится в изображении JPEG.
Мне нужно сохранить размер шаблонов RTF до минимума, чтобы попытаться сократить время обработки файлов до минимума.
- Есть ли у кого-нибудь идеи о том, как минимизировать размер файлов RTF со встроенными изображениями?
- Есть ли способ управления кодировкой, которую использует Word? Я не вижу никаких параметров нигде.
- Кто-нибудь знает, какой тип двоичной кодировки использует Word/RTF?
Спасибо заранее.
Ответы
Ответ 1
Изображение в RTF файле сохраняется в формате WMF без сжатия. На mac, это было бы macpict. Лучше всего сохранить размер файла, чтобы связать изображение с документом, а не вставить копию в документ. Компромисс заключается в том, что вы должны хранить файлы вместе.
ИЗМЕНИТЬ
Сжимает ли RTF опцию? Используя zip/rar, вы вернете размер своего файла, но сначала вам придется распаковать его. Предполагается, что будут инструменты, которые будут выполнять сжатие rtf, но я никогда не использовал их.
Ответ 2
Вот лучшее решение
http://support.microsoft.com/kb/224663
Выдержки:
СИМПТОМЫ
При сохранении документа Microsoft Word, содержащего EMF, PNG, GIF или JPEG в качестве другого формата файла (например, Word 6.0/95 (.doc) или Rich Text Format (.rtf)), размер файла документ может значительно увеличиться.
Например, документ Microsoft Word 2000, содержащий JPEG графическое изображение, которое сохраняется как документ Word 2000, может иметь размер файла 45 568 байт (44,5 КБ). Однако при сохранении этого файла в Word 6.0/95 (.doc) или в формате Rich Text Format (.rtf), размер файла может увеличиться до 1,289,728 байт (1,22 МБ).
ПРИЧИНА
Эта функциональность разработана в Microsoft Word. Если EMF, PNG, GIF или графический файл JPEG вставляются в документ Word, при сохранении документа две копии графического изображения сохраняются в документ. Графика сохраняется в соответствующих EMF, PNG, GIF или JPEG формат и также преобразуются в формат WMF (Windows Metafile).
Решение
Предупреждение. Если вы используете Редактор реестра неправильно, вы можете вызвать серьезные проблемы, которые могут требуют переустановки операционной системы. Microsoft не может гарантируйте, что вы можете решить проблемы, возникающие в результате использования реестра Редактор неправильно. Используйте редактор реестра на свой страх и риск.
Чтобы Word не сохранял две копии графического объекта в документе, и уменьшить размер файла документа, добавьте ExportPictureWithMetafile = 0 строковое значение для Microsoft Windows реестр.
Ответ 3
Мы проделали аналогичный проект на работе. Только мы не используем эту функциональность "Вставить/Изображение/Из файла...". У нашего шаблона есть тег с именем [photos], как я полагаю, ваш собственный тоже. Когда мы обрабатываем документ, мы заменяем тег на коды RTF, необходимые для отображения изображений. Мы помещаем их в таблицу, и мы показываем два изображения в каждой строке, а также строку сверху для заголовка.
Итак, вы можете поместить тег [фотографии] в свой шаблон. Затем вы заменяете тег на RTF-коды. Вы можете найти хорошие ссылки на эти коды в Интернете. Напр. здесь
.
Теперь мой код выглядит примерно так:
\ par {\ rtf1\ansi\deff0 {\ trowd\cellx8810 { title}\intbl\qc\cell\row} {\ trowd\cellx4405\cellx8810 {\ pict\jpegblip\picwgoal4000\pichgoal3000\piccropl-50\piccropr-50\piccropt-50\piccropb-50\шестигранной Ваше изображение как массив байтов в шестнадцатеричном}\intbl\cell {\ pict\jpegblip\picwgoal4000\pichgoal3000\piccropl-50\piccropr-50\piccropt-50\piccropb-50\hex Другое изображение}\intbl\cell\row}
если вы получите изображение в массив байтов, вы можете использовать BitConverter.ToString(массив), чтобы получить ваш шестнадцатеричный код. только вам нужно будет заменить тире "-" на "";
Наши файлы занимают менее 1/10 места, где будет "нормальный" RTF. Если мы откроем код документа с помощью редактора, такого как Notepad ++, мы увидим коды RTF, но если мы откроем документ и сохраним его как RTF (сменив его имя), он будет идти от 1.5Mb до 50Mb!!
Я предполагаю, что ответ DaveParillo оправдывает это: я пишу только одно изображение.
Надеюсь, это поможет.
Приветственный приятель
Ответ 4
Изначально помните, что каждый байт хранится с использованием двух символов (два байта), это означает, что приращения, по крайней мере, представляют собой двойной размер исходного изображения.
Другие вещи, которые вам нужны, это то, что Word и Word Pad вставляют разные (аромат или формат) одного и того же изображения и другие поля (что RTF может отображаться без них).
Вот несколько сценариев, используемых для вставки изображений в RTF (https://joseluisbz.wordpress.com/2011/06/22/script-de-clases-rtf-para-jsp-y-php/) и один пример использования (https://joseluisbz.wordpress.com/2011/07/16/subiendo-imagenes-png-y-jpg-y-archivos-a-mysql-con-php-y-jsp-y-mostrarlos-en-rtf-usando-clases/)
Теперь, возможно, вам понадобится заменить исходное изображение на другое (http://joseluisbz.wordpress.com/2013/07/26/exploring-a-wmf-file-0x000900/).
Ответ 5
Ответ Swartbees отлично работал у меня. Сначала я уменьшил качество изображения до "0", используя G.I.M.P. Сохранить как функцию jpeg. После выполнения решения Microsoft для Microsoft, предложенного Swartbees выше, я снова ввел изображение в файл, и увеличение размера было пренебрежимо малым 229 к 279k (в отличие от 29000kb).
Спасибо за ваши предложения, ребята.
Ответ 6
Да, удалив лишние символы. И для этого вы должны вставить их обратно в свой поток.
Например, если у вас более двадцати символов f в одной строке, вы можете заменить f [20] в вашем потоке. Это начало.
- Самое удачное.