Имя: Пароль:
1C
 
Ascii85 encode & decode, может пригодиться (оптимизируйте если нада)...
0 smaharbA
 
26.10.06
10:04
Собственно вот -

//*******************************************
Функция Индикатор(к,Кол,Ограничение=64)
   Ч=к/Кол;
   Возврат СтрЗаменить(Формат(СтрЗаменить(Формат("","С"+Цел(Ограничение*Ч))," ","|"),"С"+Ограничение)," ",".")+Формат(Окр(100*Ч,2),"Ч6.2")+"%";
КонецФункции    // Индикатор

//****** Кодер85 (Начало)
Функция Начало()
   Позиция=2;
   Стр="<~";
   Возврат Стр;
КонецФункции    // Начало

Функция Кодирование()
   Перем МассивСимв[5];
   Для к=1 По 5 Цикл
       МассивСимв[к]=Кортеж % 85;
       Кортеж=Цел(Кортеж/85);
   КонецЦикла;
   Для к=1 По Количество+1 Цикл
       Стр=Стр+Симв(МассивСимв[6-к]+33);
       Если Позиция>=Ширина Тогда
           Позиция=0;
           Стр=Стр+РазделительСтрок;
       Иначе
           Позиция=Позиция+1;
       КонецЕсли;
   КонецЦикла;
КонецФункции    // Кодирование

Функция Конец()
   Если Количество>0 Тогда
       Кодирование();
   КонецЕсли;
   Если Позиция+2>Ширина Тогда
       Стр=Стр+РазделительСтрок;
   КонецЕсли;
   Стр=Стр+"~>"+РазделительСтрок;
КонецФункции    // Конец

Функция Применить85(Знач с)
       Количество=Количество+1;
       Кортеж=Кортеж+(с*МассивСдвига[Количество]);//ПобитноеИли(Кортеж,с);
       Если Количество=4 Тогда
           Если Кортеж=0 Тогда
               Стр=Стр+"z";
               Если Позиция>=Ширина Тогда
                   Позиция=0;
                   Стр=Стр+РазделительСтрок;
               Иначе
                   Позиция=Позиция+1;
               КонецЕсли;
           Иначе
               Кодирование();
               Кортеж=0;
           КонецЕсли;
           Количество=0;
       КонецЕсли;
КонецФункции    // Применить85

Функция Копи85(Файл)
   Перем РазмерФайла;
   ФС.АтрибутыФайла(Файл,РазмерФайла);
   ФайлОбъект=ФСО.OpenTextFile(Файл);
   к=0;
   Пока ФайлОбъект.atendofstream()=0 Цикл
       Символ=""+ФайлОбъект.read(1);
       Если Символ="" Тогда
           Байт=0;
       Иначе
           Байт=КодСимв(Символ);
       КонецЕсли;
       Применить85(Байт);
       к=к+1;
       Состояние(Индикатор(к,РазмерФайла));
   КонецЦикла;
   ФайлОбъект.Close();
КонецФункции    // Копи85
//****** Кодер85 (Конец)

//****** ДеКодер85 (Начало)
Функция ВПрименить(Байт)
   Для к=1 По Байт Цикл
       Скрипт.ExecuteStatement("S=S & chr("+(Цел(Кортеж/МассивСдвига[к]) % 256)+")");//ПобитныйСдвигВПраво(Кортеж,(4-к)*8)
   КонецЦикла;
КонецФункции    // ВПрименить

Функция ДеКодер85(Пар)
   Кол=СтрДлина(Пар);
   Для к=1 По Кол Цикл
       с=КодСимв(Сред(Пар,к,1));
       Если с=КодСимв("z") Тогда
           Для ш=1 По 4 Цикл
               Скрипт.ExecuteStatement("S=S & chr(0)");
           КонецЦикла;
       ИначеЕсли Кол=к Тогда
           Если Количество>0 Тогда
               Кортеж=Кортеж+МассивДекодера[Количество];
               ВПрименить(Количество);
           КонецЕсли;
           Прервать;
       Иначе
           Количество=Количество+1;
           Кортеж=Кортеж+(с-33)*МассивДекодера[Количество];
           Если Количество=5 Тогда
               ВПрименить(4);
               Количество=0;
               Кортеж=0;
           КонецЕсли;
       КонецЕсли;
       Состояние(Индикатор(к,Кол));
   КонецЦикла;
КонецФункции    // ДеКодер85

Функция ДеКодирование(Файл)
   Кортеж=0;с=0;Количество=0;Стр="";
   Текст=СоздатьОбъект("Текст");
   Текст.Открыть(Файл);
   Кол=Текст.КоличествоСтрок();
   Для к=1 По Кол Цикл
       Стр=Стр+Текст.ПолучитьСтроку(к);
       Состояние(Индикатор(к,Кол));
   КонецЦикла;
   Если (Лев(Стр,2)="<~") и (Прав(Стр,2)="~>") Тогда
       Скрипт=СоздатьОбъект("MSScriptControl.ScriptControl");
       Скрипт.language="vbscript";
       Скрипт.ExecuteStatement("S=""""");
       ФайлОбъект=ФСО.OpenTextFile(Файл+".bin",2,-1);
       Стр=Сред(Стр,3,СтрДлина(Стр)-4);//
       ДеКодер85(Стр);
       Скрипт.AddObject("File",ФайлОбъект);
       Скрипт.ExecuteStatement("File.Write(S)");
       ФайлОбъект.Close();
   Иначе
       Сообщить("Файл не Аски85");
   КонецЕсли;
КонецФункции    // ДеКодирование
//****** ДеКодер85 (Конец)

Процедура ПриОткрытии()
   Перем Файл,Каталог;
   МассивСдвига[1]=16777216;
   МассивСдвига[2]=65536;
   МассивСдвига[3]=256;
   МассивСдвига[4]=1;
   Ширина=72;Позиция=0;Кортеж=0;Количество=0;
   ФСО=СоздатьОбъект("Scripting.FileSystemObject");
   Если ФС.ВыбратьФайл(0,Файл,Каталог,"","Все файлы (*.*)|*.*","")=1 Тогда
       Начало();
       Копи85(Каталог+Файл);
       Конец();
       Текст=СоздатьОбъект("Текст");
       Текст.ДобавитьСтроку(Стр);
       Текст.Записать(Каталог+Файл+".ascii85");
   Иначе
       Возврат;
   КонецЕсли;
   МассивДекодера[1]=85*85*85*85;
   МассивДекодера[2]=85*85*85;
   МассивДекодера[3]=85*85;
   МассивДекодера[4]=85;
   МассивДекодера[5]=1;
   ДеКодирование(Каталог+Файл+".ascii85");
   СтатусВозврата(0);
КонецПроцедуры    // ПриОткрытии

...
"Дикая смесь" получилась, но можно сделать "штатнее", но еще медленнееее...
1 asady
 
26.10.06
10:16
(0)
By default, the printer driver transfers binary information to PostScript printers; however, you can choose to transfer image data using JPEG or ASCII85 encoding. These options are not available to non-PostScript printers such as many inkjet models.

ASCII85 is a text encoding for binary data that is more compact than ASCII encoding.

JPEG-encoded files are smaller than binary files, and therefore require less time to print; however, using JPEG encoding decreases the image quality. Only PostScript Level 2 (or higher) printers support JPEG encoding; sending a JPEG-encoded file to a PostScript Level 1 output device may result in PostScript language errors.

Some print spooler programs, computer networks, and third-party printer drivers don't support files that are binary or JPEG-encoded, and some PostScript output devices accept binary and JPEG-encoded image data only through their AppleTalk and Ethernet ports, not their parallel or serial ports. In these situations, you can select the ASCII85 encoding method. However, ASCII85 files contain about twice as many characters and require about twice as much time to transfer as binary files.

Во-первых, определим, что такое PostScript. Попробуйте сделать следующее: создайте новый файл в программе Adobe Illustrator и начертите рамку (Tools-Box). Сохраните файл, закройте программу, и просмотрите созданный файл в каком-нибудь текстовом редакторе. То, что вы увидите - является программой, записанной на PostScript языке. В данном случае, эта PostScript-программа описывает страницу и элемент, размещенный на ней. Раньше PostScript программы создавались вручную, программистам приходилось в текстовом редакторе набирать код (используя Руководство к описанию языка) и затем посылать их на принтер для печати. Illustrator был первым "графическим интерфейсом" PostScript языка, который позволял, рисуя графические обьекты, создавать PostScript файлы автоматически. Итак, мы видим, что PostScript язык, подобно языкам Basic, C++, Fortran, является языком программирования. Но он выполняет только одну вещь - очень точно (с заданными параметрами) описывает страницу - как она будет выглядеть.




Как и всякий программный язык, PostScript нуждается в процессоре, который бы запускал на выполнение код. Этот процессор представляет собой набор программно-аппаратных средств, обычно "прописанных" в принтере, и называется RIP (Raster Image Processor). RIP берет PostScript код и переводит его в точечное описание страницы (dots on a page) - битовую карту. То есть, PostScript-принтер является устройством, которое читает и интерпретирует PostScript программу и выводит изображение на бумагу, пленку и т.п. Следует заметить, что AGM (Adobe Graphics Models), используемая в InDesign, также является RIP'ом: выполняя PostScript-команды, AGM "печатает" результат на экран вместо принтера. Таким образом достигается наивысшая точность отображения страницы на экране, ведь в отличие от других программ, которые используют в качестве предварительного просмотра битовую карту (bitmapped preview), у InDesign'а это PostScript preview. Вот уж поистине "настоящая" технология WYSIWYG!




Итак, если PostScript -это программный язык и RIP - обработчик этого языка, то что же такое EPS (Encapsulated PostScript)? Очень просто. EPS файл - это PostScript программа, сохраненная, как одиночный файл со встроенным "просмотром" (preview) низкого разрешения ("encapsulated"). Кстати, InDesign'у - это "preview" не нужно, так как механизм RIP встроен в самой программе, что позволяет ей открывать PostScript и Illustrator- файлы, как "родные".

Отсюда можно сделать следующие выводы:


- вы можете использовать PostScript для сервисного бюро по печати;


- вы можете использовать EPS для сохранения и распространения графики.



Вот что я накопал чтобы понять какую фишку сделал Аксакал.

Спасибо за науку.
2 smaharbA
 
26.10.06
10:21
(1) хорошая инфа.
+ аски85 в ПДФ использован для хранения бинарных данных (картинок и прочего)...
Но и не только...
+ аски85 компактнее тогоже UU что в майл используется, и еще - бинарные данные это не только картинки :)
3 smaharbA
 
26.10.06
20:03
Кто напишет продолжение ? плохо без структур всеже, но можно...