Как уменьшить размер RTF со встроенными изображениями? - PullRequest
14 голосов
/ 10 сентября 2009

У нас есть некоторый код, который создает документ RTF из шаблона RTF. Он в основном выполняет поиск строк и заменяет специальные теги в файле RTF. Это доступно через веб-страницу.

Как правило, время обработки для этого действительно быстро.

Однако нам нужно встроить изображение в шаблон. Мы встраивали их как изображения в формате JPEG, используя функцию Word «Вставка / Изображение / Из файла ...». Но мы обнаружили, что размер файла RTF в значительной степени зависит от изображения.

Например, я вставил логотип JPEG размером 20 тыс. (Который в основном представляет собой сплошной фон с некоторым текстом). Размер файла RTF увеличился с 390 КБ (без изображения) до 510 КБ (с изображением).

Затем мы вставили JPEG, содержащий скриншот, то есть изображение содержит текст, несколько цветов и т. Д. Размер JPEG составляет около 150 тыс. С помощью этого изображения размер файла RTF увеличился с 390 КБ до 3,5 МБ.

Так что кодирование, которое Word использует для хранения изображений в формате RTF, не работает линейно. Я предполагаю, что это зависит от того, что находится в изображении JPEG.

Мне нужно свести размер шаблонов RTF к минимуму, чтобы попытаться сократить время обработки наших файлов до минимума.

  • У кого-нибудь есть идеи, как минимизировать размер файлов RTF со встроенными изображениями?
  • Есть ли способ управления кодировкой, которую использует Word? Я не вижу никаких вариантов нигде.
  • Кто-нибудь знает, какой тип двоичной кодировки использует Word / RTF?

Заранее спасибо.

Ответы [ 6 ]

17 голосов
/ 18 января 2010

Вот лучшее решение

http://support.microsoft.com/kb/224663

Выдержка:

СИМПТОМЫ

При сохранении документа Microsoft Word, который содержит EMF, Графические изображения в формате PNG, GIF или JPEG в другом формате (например, Word 6.0 / 95 ( .doc) или расширенный текстовый формат ( .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 реестр.

5 голосов
/ 10 сентября 2009

Изображение в файле RTF сохраняется в формате WMF без сжатия. На Mac, это было бы macpict. Лучше всего сохранить размер файла, чтобы связать изображение с документом, а не вставить копию в документ. Компромисс в том, что вы должны хранить файлы вместе.

EDIT Сжатие RTF вариант? Используя zip / rar, вы получите размер файла обратно, но вам, очевидно, придется распаковать его. Предполагается, что существуют инструменты, которые будут выполнять сжатие RTF, но я никогда не использовал их.

1 голос
/ 16 августа 2013

Изначально имейте в виду, что каждый байт хранится с использованием 2 символов (двух байтов), это означает, что по крайней мере приращения составляют двойной размер исходного изображения.

Другие вещи, которые вам нужны, это то, что 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/).

1 голос
/ 13 марта 2012

Мы сделали похожий проект на работе. Только мы не используем эту функцию "Вставить / Изображение / Из файла ...". В нашем шаблоне есть тег с именем [photos], как я полагаю, и у вашего. Когда мы обрабатываем документ, мы заменяем тег на коды RTF, необходимые для отображения изображений. Мы помещаем их в таблицу и показываем по два изображения в каждой строке, а также строку сверху для заголовка.

Итак, вы можете разместить тег [photos] в вашем шаблоне. Затем вы заменяете тег кодами RTF. Вы можете найти некоторые хорошие ссылки на эти коды в Интернете. Например, здесь .

Теперь мой код выглядит примерно так:

\ par {\ rtf1 \ ansi \ deff0 {\ trowd \ cellx8810 { title } \ intbl \ qc \ cell \ row} {\ trowd \ cellx4405 \ cellx8810 {\ пикт \ 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 \ шестигранной Ваше другое изображение } ​​\ intbl \ cell \ row}

если вы получаете ваше изображение в байтовый массив, вы можете использовать BitConverter.ToString (array) для получения вашего шестнадцатеричного кода. только вам нужно заменить тире "-" на "";

Наши файлы занимают менее 1/10 пространства, чем «нормальный» RTF. Если мы откроем код документа с помощью редактора, такого как Notepad ++, мы увидим коды RTF, но если мы откроем документ и сохраним его как RTF (изменив его имя), он перейдет с 1,5 МБ до 50 МБ !! Я предполагаю, что ответ DaveParillo оправдывает это: я пишу каждое изображение только один раз.

Надеюсь, это поможет. Ура приятель

0 голосов
/ 16 января 2013

Ответ Swartbees отлично сработал для меня. Сначала я снизил качество изображения до «0», используя G.I.M.P. Сохранить как функциональность JPEG. После использования решения Microsoft, предложенного Swartbees выше, я снова вставил картинку в файл, и увеличение размера было незначительным с 229 до 279 КБ (вместо 29 000 КБ).

Спасибо за ваши предложения, ребята.

0 голосов
/ 26 декабря 2010

Да, удалив лишние символы. И для этого вы должны вставить их обратно в ваш поток. Например, если в одной строке более двадцати символов f, вы можете заменить на f [20] в своем потоке. Это начало.

- Удачи.

...