LINUX.ORG.RU

вопрос по RTF


0

1

пересохраняем odt в rtf с помощью либреофиса. файл без изображения - 80кб, со вставленным jpg изображением в 100кб - 5,28Мб. Это из-за того, что в rtf изображения не сжатые вставляются, что-то типа bmp.

В файле видим изображение в виде большого текстового блока, в котором много раз повторяется буква f, в основном от 80 до 120 раз подряд. По поводу замены повторяющегося символа нашел только совет http://stackoverflow.com/a/4532759 однако замена 20 f подряд на f[20] не помогла - файл стал меньше размером, но побился - изображение пропало.

Спецификация есть вот тут http://www.boumphrey.com/rtf/rtfspec.pdf но она мне не помогла, не нашел, куда смотреть.

Вопрос - как правильно заменить повторяющиеся символы, чтобы файл нормально открывался?

Перемещено post-factum из talks


Ответ на: комментарий от Bad_ptr

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

закачка идет через интеренет и хоть все и работает, пять мегабайт через слабый канал загружаются куда дольше, чем 200-300 килобайт.

Cargo
() автор топика

Да, забыл - попробовали под виндой пересохранить файл после изменения параметра согласно http://support.microsoft.com/kb/224663 , файл стал поменьше почти на полтора мегабайта, но размер все равно неудовлетворительный.

Cargo
() автор топика

Вопрос - как правильно заменить повторяющиеся символы, чтобы файл нормально открывался?

Никак. Повторяющиеся подряд одинаковые символы - это, вероятно, фон. В rtf нельзя какой-нибудь png с сжатием без потерь вставить?

Alex_A_V ★★
()

Вам так необходимо прищемлять яйца дверью?

Xellos ★★★★★
()
Ответ на: комментарий от Cargo

Определитесь, что для вас важнее - слабый канал и время закачки, или древний убогий формат?

Xellos ★★★★★
()
Ответ на: комментарий от Alex_A_V

Да, наверное это фон. Мне кажется, есть путь заменит ьповторы - но надо понять, где в спецификации об этом сказано, а я найти не могу :(

Насколько я понимаю, png нельзя - сам бы рад, но не нашел, как можно сменить изображение внутри, он его в любом случае конвертирует в несжатое и вставляет.

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

Cargo
() автор топика
Ответ на: комментарий от Cargo

>но файл потом закачивают в другую систему
В винде же zip открывается из коробки. Или что там у тебя за велосипед?

Deleted
()

пересохраняем odt в rtf с помощью либреофиса. файл без изображения - 80кб, со вставленным jpg изображением в 100кб - 5,28Мб. Это из-за того, что в rtf изображения не сжатые вставляются, что-то типа bmp.

Используйте tiff.

Igron ★★★★★
()
Ответ на: комментарий от CYB3R

Сравни, что wordpad и writer пишут в файл.

В вордпаде изображения все съезжают, writer и word - размер файлов почти одинаковый, особых отличий на глаз не видно.

В винде же zip открывается из коробки. Или что там у тебя за велосипед?

велосипедом у нас АБС-ка, которая принимает файл и он должен быть в rtf

Cargo
() автор топика
Ответ на: комментарий от Igron

Используйте tiff

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

проблема в том, как правильно заменить повторяющиеся буковки f в карте изображения внутри rtf. мы это сделаем вручную 1 раз с парой-тройкой шаблонов, этого хватит.

Cargo
() автор топика
Ответ на: комментарий от Cargo

Изображение вставляется вот так:

{\pict\picscalex100\picscaley101\piccropl0\piccropr0\piccropt0\piccropb0\picw2328\pich921\picwgoal1320\pichgoal522\emfblip\bliptag2084379911{\*\blipuid 7c3d1d07e4f2146e2d4452045987b829} 010000006c000000000000000000000057000000220000000000000000000000230c0000cb04000020454d4600000100b4e404000d0000000100000000000000 00000000000000000005000000040000c401000069010000000000000000000000000000e3e306001c83050046000000ec710200e07102004744494301000080 0003000029bb0afb00000000c8710200010009000003e43801000000ca38010000000400000003010800050000000b0200000000050000000c0291006f01ca38 0100430f2000cc00000091006f010000000091006f0100000000280000006f01000091000000010018000000000000000000232e0000232e0000000000000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe8d9d1e1beb4f7e0d7fff9f5ffffffffffffffffffffffffff ...

можно поменять расширение например на \jpegblip. Вопрос - как получить jpeg-картинку в формате «буковки-циферки» как выше, в emf?

Cargo
() автор топика
Ответ на: комментарий от Cargo

почему тех. вопрос в talks

rtf спека открыта, гуглите и читайте там все написано

hizel ★★★★★
()

Может имеет смысл копать в сторону формата WMF в котором сохраняются копии изображений, а не в сторону самого RTF?

Amp ★★★
()
Ответ на: комментарий от Amp

да, наверное лучше перенести топик.

насчет формата изображений - уже занимаюсь.

rtf спека открыта, гуглите и читайте там все написано

вот спецификация http://www.biblioscape.com/rtf15_spec.htm

раз уж там действительно все написано - не могли бы вы объяснить, как вместо emf изорбражения поставить то же самое изображение в jpeg\png\?

Cargo
() автор топика
Ответ на: комментарий от Cargo

emf - это вставленная копия картинки для совместимости с некоторым софтом. Спецификация вроде как не обязывает вставлять копию. Попробуй как-то форсировать процесс сохранения, чтобы обойтись без нее.

Amp ★★★
()
Ответ на: комментарий от hizel

Спасибо огромное! И, надеюсь, последний вопрос: функция

 
sub file_content_as_hex {
  my $in = $_[0];
  open IN, "<", $in or die "Can't read-open $in: $!";
  binmode(IN);
  my $content = '';
  my $buffer;
  while( read(IN, $buffer, 32) ) {
    $content .= unpack("H*", $buffer) . "\n";
    #  Turn 32 bytes into 64 hex characters, and then add a newline.
    #  (If the last chunk of data is under 32 bytes, then the unpack()
    #  does the right thing.)
  }
  close(IN);
  return $content;
}

как на виндовой машине из файла jpg\png получить то же самое? в перле я ни бум-бум.

Cargo
() автор топика
Ответ на: комментарий от Cargo

я в винде не бум-бум, один байт преобразуется к hex числу в ascii представлении, для читабельности перенос строк вставляется через любимое число символов

а что в винде перл не работает?

hizel ★★★★★
()
Ответ на: комментарий от Cargo

все ок - поставил strawberry perl, поставил через cpan Image::Size & Image::Magick

конвертировал файлы, итог - вместо 5Мб+ получил размер файла 120Кб. Победа, все отлично, на этом и успокоимся, наверное.

Одна проблема - изображение немного потеряло в цвете. Оно было в 24 битах, возможно, сейчас 16. буду ковырять, может png поможет.

Cargo
() автор топика
Ответ на: комментарий от Cargo

Действительно, в png стало получше, но все же немного отличается от оригинала.

Всем большое спасибо за помощь, особенно hizel ! :)

Cargo
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.