zipper упаковка ODT файлов[Решено]

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

zipper упаковка ODT файлов[Решено]

Сообщение Maxizar » 19.08.2010 10:53:11

Возникла задачка о создании ODT документа из уже готовых файлов (подфайлов). Как известно, ODT – это zip архив из (подфайлов xml разметки и т.п.).
Эксперимент:
Создаем простенький файл ODT при помощи Open Office v 3.2 OS = WinXP Sp3 Update 20.02.2010. Сохраняем его.
- Открываем его в любом архиваторе (да хоть тотал командоре) распаковываем все файлы.
- Запаковываем в zip архив, даем расширение ODT открываем файл О чудо все РАБОТАЕТ.

Сложности:
- Теперь сама задача: так вот эти файлы (распакованные). нужно запаковать средствами FPC. Тобишь просто все данные файлы загнать в Zip архив и все. Но самое главное без средств Open Office. Т.е Open Office на ПК может и не быть.
См Эксперемент. Все запаковывал при помощи Zipper архивчег получился хороший все архиваторы его понимают. Но вот сам Open Office говорит что файл поврежден. Пытается восстановить и говорит че за Х… ты мне суешь..
Различные наблюдения дали такой результат при распаковки родного ODT все архиваторы говорят что это zip архив версии 2.
Все архивы созданные Zipper имеют версию 1. Как быть???. Где взять более новый Zipper или другую более новую версию библиотеки работы с Zip (именно для упаковки).

Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var Zip: TZipper;
    F:TZipFileEntries;
begin
//В папке C:\2 как раз и лежат распакованные файлы из ODT
   F:=TZipFileEntries.Create(TZipFileEntry);

    F.AddFileEntry('C:\2\mimetype','mimetype');
    F.AddFileEntry('C:\2\Pictures\100002000000002000000020801EDE22.png','Pictures\100002000000002000000020801EDE22.png');
    F.AddFileEntry('C:\2\Thumbnails\thumbnail.png','Thumbnails\thumbnail.png');
    F.AddFileEntry('C:\2\manifest.rdf','manifest.rdf');
    F.AddFileEntry('C:\2\content.xml','content.xml');
    F.AddFileEntry('C:\2\Configurations2\accelerator\current.xml ','Configurations2\accelerator\current.xml');


    F.AddFileEntry('C:\2\META-INF\manifest.xml','META-INF\manifest.xml');
    F.AddFileEntry('C:\2\meta.xml','meta.xml');
    F.AddFileEntry('C:\2\settings.xml','settings.xml');
    F.AddFileEntry('C:\2\styles.xml','styles.xml');


   zip:=TZipper.Create;
   zip.FileName:='C:\1.odt';
   zip.ZipFiles(F);
   Zip.Free;
   F.Free;

end;



PS. Данные распакованные файлы изменяются при помощи Lazarus и вот эти изменения нужно сохранить и запаковать чтоб Open Office не догадался :)
Последний раз редактировалось Maxizar 04.03.2011 21:46:27, всего редактировалось 1 раз.
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: zipper упаковка ODT файлов

Сообщение Vadim » 19.08.2010 13:40:39

А если воспользоваться любым консольным zip-архиватором?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: zipper упаковка ODT файлов

Сообщение Odyssey » 19.08.2010 13:44:55

Ещё можно попробовать http://wiki.freepascal.org/Zlibar или http://wiki.freepascal.org/ZipFile. Второй не поддерживает сжатие файлов, только объединение в архив. Или глянуть исходники PeaZip, там наверняка как-то сделано.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: zipper упаковка ODT файлов

Сообщение Maxizar » 19.08.2010 15:51:59

Zlibar создает архив но Open Office его не ест.
ZipFile - Почему то создает не правильный архив, открываться в Open Office не желает, но вот загадка открываем этот же архив в WinRar тот говорит мол архив то битый (неправильный конец файла) востонавить? Да и что вы думаете, Open Office уже востановленный архив открывает как свой родноый файл. Но я боюсь что именно винрар его и делает правильным те Zip архивом... Который как раз я и желаю сделать...
Так что проблема осталась как ее решить не понятно вроде я не требую чего-то сверх, не ужели нет простой либы для сжатия в Zip для FPC, все что есть Open Office просто не любит.///
Хотя возможно я что то не так делаю вот привожу процедуры:

Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
begin   

  ZipFile1.FileName:='C:\zipFile.odt';
  ZipFile1.Activate;

    ZipFile1.AppendFileFromDisk('C:\2\mimetype','mimetype');
    ZipFile1.AppendFileFromDisk('C:\2\Thumbnails\thumbnail.png','Thumbnails\thumbnail.png');
    ZipFile1.AppendFileFromDisk('C:\2\manifest.rdf','manifest.rdf');
    ZipFile1.AppendFileFromDisk('C:\2\content.xml','content.xml');
    ZipFile1.AppendFileFromDisk('C:\2\Configurations2\accelerator\current.xml ','Configurations2\accelerator\current.xml');
    ZipFile1.AppendFileFromDisk('C:\2\META-INF\manifest.xml','META-INF\manifest.xml');
    ZipFile1.AppendFileFromDisk('C:\2\meta.xml','meta.xml');
    ZipFile1.AppendFileFromDisk('C:\2\settings.xml','settings.xml');
    ZipFile1.AppendFileFromDisk('C:\2\styles.xml','styles.xml'); 
end; 


Код: Выделить всё

procedure TForm1.Button1Click(Sender: TObject);
var
Zar: TZlibWriteArchive;
Stream: TMemoryStream;
begin

   Stream := TMemoryStream.Create;
   Zar := TZlibWriteArchive.Create;
   Zar.OutStream := Stream;

    Zar.InputFiles.Add('C:\2\mimetype');
    Zar.InputFiles.AddPath('C:\2\Thumbnails\thumbnail.png','Thumbnails\thumbnail.png');
    Zar.InputFiles.Add('C:\2\manifest.rdf');
    Zar.InputFiles.Add('C:\2\content.xml');

    Zar.InputFiles.AddPath('C:\2\META-INF\manifest.xml','META-INF\manifest.xml');
    Zar.InputFiles.Add('C:\2\meta.xml');
    Zar.InputFiles.Add('C:\2\settings.xml');
    Zar.InputFiles.Add('C:\2\styles.xml');

   Zar.CreateArchive;

   Stream.SaveToFile('C:\Zlibar.odt');
   Zar.Free;
   Stream.Free;
end;
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: zipper упаковка ODT файлов

Сообщение Vadim » 19.08.2010 15:57:25

Maxizar
Вы мой вопрос заметили?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: zipper упаковка ODT файлов

Сообщение Maxizar » 19.08.2010 16:33:05

Vadim да заметил.. но хочеться чтоб из программы, ведь эти же
консольные zip-архиваторы
как то пишут. и потом если скажем использовать тот же 7z блин таскать в сумме 1 метр.... кстати PeaZip так и делает на основе консольного 7z.
Я просто в программе можно сказать генерирую картинки и надписи к ним... вот хотелось бы чтоб сразу можно было сохранить в зипе и тогда дока будет готова. а то все генерится и все работает если сжимать тем же консольным архиватором. Но хочеться сделать почеловечески. глядишь можно потом будет сделать компонент для генерации ODT но до этого нужно разобраться с зипом.. :(
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: zipper упаковка ODT файлов

Сообщение Vadim » 19.08.2010 17:19:40

Maxizar писал(а):но хочеться чтоб из программы,
...
Но хочеться сделать почеловечески.

Я Вас вполне понимаю, но не поддерживаю. ;)
Давайте подумаем, как вообще работают написаные нами программы. Они работают не сами по себе, а основываясь на многочисленных динамических библиотеках, которые есть в системе. Согласитесь, зачем выдумывать велосипед, если есть уже готовые и работающие функции? Не хотите дополнительные программы и DLL'ки? Да ради Бога. Винда, в одной из своих DLL'ек, поддерживает формат zip'а, надо лишь найти модуль взаимодействия с этой DLL'кой. И такие модули есть, надо только залезть на http://www.torry.net. ;)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: zipper упаковка ODT файлов

Сообщение Sergei I. Gorelkin » 19.08.2010 18:17:15

http://bugs.freepascal.org/view.php?id=7604
За последние четыре года ни у кого руки пока не дошли...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1395
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: zipper упаковка ODT файлов

Сообщение скалогрыз » 19.08.2010 18:41:26

Sergei I. Gorelkin писал(а):http://bugs.freepascal.org/view.php?id=7604

могу исправить за 500 рублей.
кто-нибудь заинтересован?
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: zipper упаковка ODT файлов

Сообщение Timid » 20.08.2010 12:45:11

скалогрыз писал(а):
Sergei I. Gorelkin писал(а):http://bugs.freepascal.org/view.php?id=7604

могу исправить за 500 рублей.
кто-нибудь заинтересован?


Сильно, и в репозитарий сможешь положить?
Timid
постоялец
 
Сообщения: 290
Зарегистрирован: 21.11.2007 21:33:15

Re: zipper упаковка ODT файлов

Сообщение скалогрыз » 20.08.2010 14:35:27

Timid писал(а):Сильно, и в репозитарий сможешь положить?

буду настойчиво предлагать патч!
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: zipper упаковка ODT файлов

Сообщение Maxizar » 20.08.2010 16:25:59

скалогрыз - если вы сможете решить проблему с Zip то вопервых вы откроете дорогу многим в освоении Lazarus, который последний нужен для работы с Open Office без наличия последнего...
2 - Вы сможете закрыть багу 4 летней давности что будет просто похвально.
3 - даже odfReports в разделе разработки.. будет допилен :) что избавит от всяких консольных прог. Кстати автор odfreports Вы еще с нами?? если да то возможно вы нашли выход из ситуации без применения консольных zip - ов. Если да то отпишитесь. Задача такая же. только работа не с Calc а с Write. и без БД.

И еще может кто то из крутых парней этого форума может вообще обновить библиотеки работы с архивами (расширить допилить тот же zip до версии 3.0) или связатся с автором 7Z, который возможно согласиться написать Unit-ы для работы с архивами без Dll. С возможностью архивировать в 7Z и Zip, нам даже rar не нужен. и т.п. с сохранением прав, ссылок на автора и его сайт... (Ну ладно ладно и помечтать уже нельзя ........)
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: zipper упаковка ODT файлов

Сообщение Odyssey » 20.08.2010 17:43:22

Извиняюсь, если отнял у кого-то работу. ODF вполне сносно собирается TZipper'ом. Как обычно, из-за ерунды большие проблемы: слэши смотрят не в ту сторону. Вот мой пример:
Код: Выделить всё
procedure TestZipper;
var
  Zip: TZipper;
  F: TZipFileEntries;
begin
  DeleteFile('C:\1.odt');
  F := TZipFileEntries.Create(TZipFileEntry);

  F.AddFileEntry('C:\2\Configurations2', 'Configurations2/');
  F.AddFileEntry('C:\2\Configurations2\accelerator', 'Configurations2/accelerator/');
  F.AddFileEntry('C:\2\Configurations2\accelerator\current.xml', 'Configurations2/accelerator/current.xml');
  F.AddFileEntry('C:\2\Configurations2\floater', 'Configurations2/floater/');
  F.AddFileEntry('C:\2\Configurations2\images', 'Configurations2/images/');
  F.AddFileEntry('C:\2\Configurations2\images\Bitmaps', 'Configurations2/images/Bitmaps/');
  F.AddFileEntry('C:\2\Configurations2\menubar', 'Configurations2/menubar/');
  F.AddFileEntry('C:\2\Configurations2\popupmenu', 'Configurations2/popupmenu/');
  F.AddFileEntry('C:\2\Configurations2\progressbar', 'Configurations2/progressbar/');
  F.AddFileEntry('C:\2\Configurations2\statusbar', 'Configurations2/statusbar/');
  F.AddFileEntry('C:\2\Configurations2\toolbar', 'Configurations2/toolbar/');
  F.AddFileEntry('C:\2\content.xml', 'content.xml');
  F.AddFileEntry('C:\2\manifest.rdf', 'manifest.rdf');
  F.AddFileEntry('C:\2\META-INF', 'META-INF/');
  F.AddFileEntry('C:\2\META-INF\manifest.xml', 'META-INF/manifest.xml');
  F.AddFileEntry('C:\2\meta.xml', 'meta.xml');
  F.AddFileEntry('C:\2\mimetype', 'mimetype');
  F.AddFileEntry('C:\2\settings.xml', 'settings.xml');
  F.AddFileEntry('C:\2\styles.xml', 'styles.xml');
  F.AddFileEntry('C:\2\Thumbnails', 'Thumbnails/');
  F.AddFileEntry('C:\2\Thumbnails\thumbnail.png', 'Thumbnails/thumbnail.png');

  Zip:=TZipper.Create;
  Zip.FileName:='C:\1.odt';
  Zip.ZipFiles(F);
  Zip.Free;
  F.Free;
end;

Т.е. все разделители пути в архивированных файлах должны быть "/". Пустые директории можно тоже включать в архив, при этом в конце архивного имени нужно ставить разделитель.

P.S.
При детальном рассмотрении TZipFile и Zlibar оказались хуже чем предполагалось:
* TZipFile не поддерживает пустые директории в архиве (к тому же не умеет сжатие, тянет зависимость от LCL и вообще LGPL, не modified)
* Zlibar имеет свой собственный, ни с чем не совместимый формат.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: zipper упаковка ODT файлов

Сообщение Maxizar » 20.08.2010 18:33:58

Odyssey - Вы и правдо бывалый :) ну что тут сказать ОГРОМНОЕ СПАСИБО...
Действительно ерунда, обратный слеш... Теперь все работает... еще раз спасибо.
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: zipper упаковка ODT файлов

Сообщение скалогрыз » 20.08.2010 18:45:17

Надеюсь Zipper более адекватен в распаковке файлов, чем unzip.
Кстати, патч сделал! http://bugs.freepascal.org/view.php?id=7604

я так смотрю... ЧСВ ради...
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 31

Рейтинг@Mail.ru