от Лъчезар Георгиев / Тодор Стаматов (8-05-2002)

рейтинг (17)   [ добре ]  [ зле ]

Printer Friendly Вариант за отпечатване

Лъчезар Георгиев <lucho@maverick2000.com>
Тодор Стаматов <tssdigital@yahoo.com>
02 май 2002
версия 0.9

(c) 2002 busbg.com

Статията и кода към нея може да свалите от:
http://www.linux-bg.org/download/programs/efaxCyr.zip


1.1 Цели
1.2 Няколко думи за факсовете, факс-модемите и Линукс
2.  Подготовка за купона: какъв софтуер ни е необходим
2.1.efax - програмата, която върши черната работа
2.2.Кирилските шрифтове в ghostscript - без тях не можем
2.3.hml2ps - слабото място
2.4.function cp1251: Хак-ът
2.5.В орбита: факс от web-сървъра
2.5.1 Описание на функциите
2.5.2 Сорсовете


1. Въведение

1.1 Целта на този документ е да опише "кирилизацията" на пакета efax 0.9 както и някои трикове за изпращане на  html-файлове с факс модем. Също така са дадени няколко функции на php за обработка и изпращане на факсове  съдържащи текст в cp1251 енкодинг, както и кратко описание на това, как можете да добавите постскрипт кирилски шрифтове в ghostscript интерпретатора. Изпращането на факсове от web-сървър изисква root достъп (или +s флаг) на някои от описаните скриптове.
Извън обсега на този документ е как да се предпазим от пробиви по сигурността. Също така функциите от сорса не са предвидени да се изпълняват от няколко потребители на уеб-сървъра едновременно - това може да предизвика срив на сървъра. Използването им в мулти-юзер режим ще бъде описано в бъдещите версии на този документ. Текста и сорсовете към него са лицензирани под GPL2.



1.2 Няколко думи за факсовете, факс-модемите и Линукс

Както може би ви е известно от безбройните WinModem-HOWTO и LinModem-HOWTO, когато става думи за "софтуерни" модеми под Линукс, нещата могат да станат драматични. Аз ви съветвам, ако все още нямате модем при покупката му да направите предварителна уговорка с фирмата от която го купувате, че ако не работи под Линукс ще ви го сменят. Първото нещо, което ви е необходимо за да започнете естествено е факс-модема. И тъй като повечето модеми вече си имат вграден факс, оттук нататък ще ги наричаме само модем. Аз съм тествал следните марки модеми с Red Hat (версии от 4.2 до 7.2):

Motorola Modem Sfr 56.6
Lucent-Venus Fax Modem - този е PCMCA
TrendNET TFM-560X
И няколко вътрешни, ISA с неустановен произход, но хардуерни.

Линукс ги познава и работи без проблем с тях в режим факс. Някои софтуерни Conexeant  също "работят" под Линукс, но за целта ви трябват драйвери, а те нямат поддръжка на факс режим. Моето мнение е че, повечето външни модеми ще ви свършат работа. Този документ предполага наличието на инсталиран и готов за работа в факс режим модем. Марката, модела и инсталацията на модема не са целите на това ръководство. Можете да проверите дали модемът ви поддържа факс по следния начин:

Инсталирате и/или включвате модема, "палите" minicom или някакъв друг терминален емулатор:

[user@host lucho]# minicom

резултата би трябвало да изглежда така:

Welcome to minicom 1.83.1

OPTIONS: History Buffer, F-key Macros, Search History Buffer, I18n
Compiled on Aug 28 2001, 15:09:33.

Press CTRL-A Z for help on special keys
                                                     
atz                                                  
OK      
AT+FCLASS=?
0,1,8

OK

0,1,8 означава че вашият модем поддържа факс режим.

Ако отговорът е само :
О
ОК

Това означава че вашият модем не поддържа факс режим. Това се отнася и за драйверите с които  работят Конексант-модемите. Единственото решение, което мога да ви предложа е да си смените модема с хардуерен. Предполагаме че всичко е минало както трябва и сега вече разполагаме с хардуера.

2. Подготовка за купона: какъв софтуер ни е необходим

2.1. efax - програмата, която върши черната работа Ако вашата дистрибуция не го е инсталирала, можете да намерите efax пакет-а на адрес: http://casas.ee.ubc.ca/efax/. Разпакетирайте сорсовете в /usr/src/efax- . Ние ще предположим че пътят към сорсовете е: /usr/src/efax-0.9/

cd /usr/src/efax-0.9/
[user@host efax-0.9]#make След като мине компилацията, редактирайте /usr/src/efax-0.9/fax. Това е шел-скрипт, в който можете да укажете вашето име, организацията, как да набира и още много неща които са описани в документацията на пакета. За да го инсталирате изпълнете командата:

[user@host efax-0.9]#make install

ако нещо не ви хареса в последствие, винаги можете да промените настройките в /usr/bin/fax. Сега вече efax е готов за работа ;). Нека да го тестваме:

Направете един "тестов" факс с командата:

[user@host efax-0.9]# fax make COPYING

това ще генерира в текущата директория няколко файла:

[user@host efax-0.9]# ls -l COPYING*
-rw-r--r--    1 lucho    root        18007 Feb 20  1999 COPYING
-rw-r--r--    1 root     root        58562 May  1 15:21 COPYING.001
-rw-r--r--    1 root     root        53418 May  1 15:21 COPYING.002
-rw-r--r--    1 root     root        45348 May  1 15:21 COPYING.003
-rw-r--r--    1 root     root        37731 May  1 15:21 COPYING.004
-rw-r--r--    1 root     root        26217 May  1 15:21 COPYING.005
-rw-r--r--    1 root     root        16678 May  1 15:21 COPYING.006
[user@host efax-0.9]#

тези с разширения 001-006 са "нашите файлове".

Вижте какво е генерирал fax-скрипта с командата:

[user@host efax-0.9]# file COPYING.001    
COPYING.001: TIFF image data, little-endian
[user@host efax-0.9]#

Като цяло, efax изпраща файлове в формат tiffg3. Не го забравяйте! Независимо какво сте решили да изпращате по факса, ще опрете до този формат. Това е формата, който се използва при факс комуникацията от efax.

Вече можем да се опитаме да изпратим първият си факс:

[user@host efax-0.9]# ./fax send 9744XXXX COPYING.001
efax: Wed May  1 15:28:08 2002 efax v 0.9 Copyright 1999 Ed Casas
efax: 28:08 opened /dev/cua1
efax: 28:10 using CL-MD56xx in class 1
efax: 28:10 dialing T9744XXXXX
....
....

Естествено, efax ви позволява да изпратите директно текстов файл, като автоматично го конвертира, но тези а и други полезни неща можете да научите ако прочетете документацията на пакета ;). Имайте предвид че кирилицата няма да бъде енкодирана на този етап. Една програма, която конвертира кирилски текст в Postscript, можете да свалите от сайта на Линукс за българи
(http://www.linux-bg.org/download/programs/kir2ps.tgz). В нея са включени вградени шрифтове и ако държите на първо време да имате опростена форма на факсове на кирилица, ще ви свърши работа. Естествено, можете да кирилизирате efax, но за това малко по късно. Целта ни дотук беше да изпратим какъвто и да е факс.


2.2.кирилските шрифтове в ghostscript - без тях не можем

Ghostscript aka gs е постскрипт интерпретатора на GNU. Постскрипт, накратко казано е език за описание на графики и текст, които да бъдат рендирани на екрана или на принтер. Ако държите на подробностите, пълното му описание можете да намерите на адрес http://www.adobe.com:80/products/postscript/pdfs/PLRM.pdf. Ghostscript интерпретатора е много важен за целите ни. Това което ни е  необходимо е просто да включим в файла за описание на шрифтовете такива, който имат във себе си cp1251 енкодинг и са във формат postscript. Аз използвам шрифтовете на Top Team Co, които пакета bglinux-4 ми инсталира. Ако още не сте инсталирали bglinux, ви съветвам да го направите - адски полезен и добре работещ е. Можете да го свалите от адрес ftp://lml.bas.bg/home/anton/linux/bglinux-4.0.tar.gz а сайта на създателя му е http://lml.bas.bg/~anton/linux/bglinux.html. Директорията, в която се намират шрифтовете на ghostscript в RedHat 7.2 е /usr/share/fonts/default/ghostscript. Направете в нея символен линк към тази в която се намират "вашите" постскрипт шрифтове. bglinux ги инсталира /usr/local/share/fonts/type1/scalable-cyrfonts/
Ето как изглежда  на моят компютър:

[user@host ghostscript]# ll c*  
lrwxrwxrwx    1 root     root           47 Apr 29 10:03 cyr -> /usr/local/share/fonts/type1/scalable-cyrfonts/
[user@host ghostscript]# cd cyr/
[user@host cyr]# ll
total 5624
-rw-r--r--    1 root     root        42239 Nov  2 13:40 a010013d.afm
-rw-r--r--    1 root     root        74143 Nov  2 13:39 a010013d.pfb
-rw-r--r--    1 root     root        42211 Nov  2 13:40 a010015d.afm
-rw-r--r--    1 root     root        80727 Nov  2 13:39 a010015d.pfb
-rw-r--r--    1 root     root        42065 Nov  2 13:40 a010033d.afm
....
....

следващото нещо което трябва да направите е да опишете тези шрифтове в файла /usr/share/ghostscript/6.51/lib/Fontmap.GS. В този файл е "картата" на шрифтовете на ghostscript. Това означава че всеки шрифт, който искате да използвате от gs-интерпретатора, трябва да е описан в него. Ние ще добавим шрифтовете на Topteam накрая:

/URWGothicCYR-Book              (cyr/a010013d.pfb) ;
/URWGothicCYR-Demi              (cyr/a010015d.pfb) ;
/URWGothicCYR-BookObli          (cyr/a010033d.pfb) ;
/URWGothicCYR-DemiObli          (cyr/a010035d.pfb) ;
/URWBookmanCYR-Ligh             (cyr/b018012d.pfb) ;
/URWBookmanCYR-DemiBold         (cyr/b018015d.pfb) ;
/URWBookmanCYR-LighItal         (cyr/b018032d.pfb) ;
/URWBookmanCYR-DemiBoldItal     (cyr/b018035d.pfb) ;
/CenturySchCYR-Roma             (cyr/c059013d.pfb) ;
/CenturySchCYR-Bold             (cyr/c059016d.pfb) ;
/CenturySchCYR-Ital             (cyr/c059033d.pfb) ;
/CenturySchCYR-BoldItal         (cyr/c059036d.pfb) ;
/NimbusSanCYR-Regu              (cyr/n019003d.pfb) ;
/NimbusSanCYR-Bold              (cyr/n019004d.pfb) ;
/NimbusSanCYR-ReguItal          (cyr/n019023d.pfb) ;
/NimbusSanCYR-BoldItal          (cyr/n019024d.pfb) ;
/NimbusSanCYR-ReguCond          (cyr/n019043d.pfb) ;
/NimbusSanCYR-BoldCond          (cyr/n019044d.pfb) ;
/NimbusSanCYR-ReguCondItal      (cyr/n019063d.pfb) ;
/NimbusSanCYR-BoldCondItal      (cyr/n019064d.pfb) ;
/NimbusRomCYR-Regu              (cyr/n021003d.pfb) ;
/NimbusRomCYR-Medi              (cyr/n021004d.pfb) ;
/NimbusRomCYR-ReguItal          (cyr/n021023d.pfb) ;
/NimbusRomCYR-MediItal          (cyr/n021024d.pfb) ;
/NimbusMonCYR-Regu              (cyr/n022003d.pfb) ;
/NimbusMonCYR-Bold              (cyr/n022004d.pfb) ;
/NimbusMonCYR-ReguObli          (cyr/n022023d.pfb) ;
/NimbusMonCYR-BoldObli          (cyr/n022024d.pfb) ;
/URWPalladioCYR-Roma            (cyr/p052003d.pfb) ;
/URWPalladioCYR-Bold            (cyr/p052004d.pfb) ;
/URWPalladioCYR-Ital            (cyr/p052023d.pfb) ;
/URWPalladioCYR-BoldItal        (cyr/p052024d.pfb) ;
/Teams-Normal                   (cyr/teams.pfb) ;
/Teams-Bold                     (cyr/teamsb.pfb) ;
/Teams-BoldItalic               (cyr/teamsbi.pfb) ;
/Teams-Italic                   (cyr/teamsi.pfb) ;

/TeamsCYR-Normal /Teams-Normal ;
/TeamsCYR-Bold /Teams-Bold   ;  
/TeamsCYR-BoldItalic    /Teams-BoldItalic  ;
/TeamsCYR-Italic    /Teams-Italic  ;
/Teams                          /Teams-Normal   ;

Просто копирайте горните 2 колони в края на Fontmap.GS

Забележка: Въпреки че според документацията на ghostscript има възможност за използване на truetype шрифтове, аз не успях да пусна кирилицата с тях, въпреки че gs-интерпретатора ги зарежда без проблеми. Ако някой успее - аз ще включа бележките му в следващите версии на това ръководство.
Tествайте "новите" шрифтове":

[user@host /]# cd /usr/share/ghostscript/6.51/lib
[user@host lib]# gs prfont.ps          
GNU Ghostscript 6.51 (2001-03-28)
Copyright (C) 2001 artofcode LLC, Benicia, CA.  All rights reserved.
This software comes with NO WARRANTY: see the file COPYING for details.
Loading NimbusRomNo9L-Regu font from /usr/share/fonts/default/Type1/n021003l.pfb...
2362024 990061 1622424 328124 0 done.
Loading NimbusSanL-Regu font from /usr/share/fonts/default/Type1/n019003l.pfb...
39936 1248856 1642520 335588 0 done.
GS>/Teams DoFont % - това ще ви покаже шрифта Teams-Normal
GS>quit
[user@host lib]#

Ако всичко е минало както трябва, вече можем да пристъпим към кирилизацията на efax:

[user@host lib]# cd /usr/src/efax-0.9/

Като начало, нека да генерираме шрифт-а с кирилица. Опцията на efix -f (забележете че това е помощна програма от пакета, не е efax) позволява използването на външен шрифт. За целта той се генерира от ./fax  с помощта на току-що кирилизирания ghostscript от шрифта на Top Team Co. Това е битмап, съдържащ готови рендирани изображения на всички букви (глифове) в даденият шрифт: [user@hostefax-0.9]# fax makefont  Teams-Normal 8 16 24 efaxfont за да видим какво сме направили:

[user@host efax-0.9]# file efaxfont efaxfont: Netpbm PBM "rawbits" image data
[user@host efax-0.9]# Друг начин е да пуснете някоя програма за преглед на изображения. gqview разпознава .pbm файловете, въпреки че не открих с какво могат да се редактират.

как се използва шрифта за изпращане на "чисти" текстови файлове можете да прочете от man-страниците на fax, efax и efix.



2.3.hml2ps - слабото място

Това е perl-скрипт, който твърди че конвертира html страници в postscript. Има някой ограничения, но като цяло върши работа -за "чист" html. Можете да го свалите от http://www.tdb.uu.se/~jan/ Въпреки че в документацията е описано как да се "интернационализира", в момента в който му кажете да използва шрифт с cp1251 енкодинг, генерираният от него файл вече не работи под ghostscript интерпретатора, като  по този начин ни затваря вратичката към изпращането на факсове с кирилица. Ето защо ние генерираме некирилизиран ps-файл и в последствие с помощта на php го преработваме така че да се рендира с кирилски шрифтове. Ще видите как става това малко по-долу. Както сте видели вече (почти съм сигурен) съобщенията за грешка на gs не са от най-разбираемите. Всеки опит да бъде конвертиран генериран от htm2ps файл с кирилица в tiffg3 завършва с такава грешка. Още една подробност: при конвертирането от html в ps ИЗРИЧНО трябва да викате html2ps с опция -D . Това принуждава html2ps да "парсне" генерирания файл през gs-интерпретатора. По този начин ако html2ps -D мине без съобщения за грешки след това, при конвертирането то tiffg3 няма да има проблеми.

2.4. function cp1251: Хак-ът
Начина който ви предлагам е реализиран с php по разбираеми причини, но може да се направи със всеки друг език за програмиране. Идеята е да се генерира ps-файл, който не е кирилизиран и след това да се обработи
така че gs-интерпретатора да рендира правилно шрифтовете при конвертирането до tiffg3 формат. Решението на проблема е просто: преди всеки оператор за показване на стринг от типа \240\313\350\355\366) S в ps-файла да се сложи указание да се използва някой от шрифтовете, които са кирилизирани. С прости думи:

(\240\313\350\355\366) S се подменя с

/Teams-Normal findfont 8 scalefont setfont (\240\313\350\355\366) S

като числата в скобите са, както може би предполагате кодовете на кирилските букви. Това увеличава големината на файла, но премахва възможността да се изпращат факсове на "маймуница".

2.5. В орбита: факс от web-сървъра

2.5.1 Описание на функциите

decode_str($font_arg)
callback функция, която се използва от cp1251() само.


cp1251($psarr) на входа и се подава масив, в който се съдържа цял постскрипт файл, а на изхода е кирилизираният вариант.
Пример:
$fp = popen("$html2ps -D $loc", "r")
or die ("Cannot execute");

$contents = fread($fp, 29999999);
       pclose($fp);  
               set_cyr_font();  
               $r = cp1251($contents); // в $r е "кирилизираният файл"

SendFile($File_Name,$File_Extension, $arr) отваря диалог "save as" на браузера и праща съдържанието на $arr. Нищо особено.  

set_cyr_font($font="/Teams-Normal", $size=8)
установява шрифта който да се използва при енкодиране на ps-файл с cp1251(), като проверява дали шрифта присъства в map-файла на gs-интерпретатора. Името на шрифта трябва да е в постскрипт формат.


set_orientation_Land($file_name)
set_orientation_Port($file_name)

Тези 2 функции установяват ориентацията на ps-файл - "Portrait" или "Landcape".

get_orientation($file_name)
Връща ориентацията на файла. Връщаните стойности са:
1 "Portrait"
2 "Landscape"
0 грешка

fetch_location($loc, $fax_number)
Прочита, кирилизира и записва постскрипт файл, който се изпраща на функцията fax_make. Полученият от fax_make списък от файлове се изпраща на функцията fax_send, която праща страниците на факс с номер $fax_number

fax_make($file)
Конвертира в tiffg3 ps-файла $file и връща масив с имената на генерираните файлове в формат file.ps.001, 002... като на всяка страница съответства един файл

fax_send($files_list, $fax_number)
Изпраща на факс с номер $fax_number файловете $files_list, коитo са направени с функцията fax_make.


get_gs_fonts() - връща масив с имената на шрифтовете, описани в Fontmap.GS. Използва се в set_cyr_font(), но може да бъде извиквана самостоятелно.

Пример за използване на горните функции:

<?php

$location="http://някъде.си/нещо.си";
fetch_location($location,95859);

?>

Статията и кода към нея може да свалите от:
http://www.linux-bg.org/download/programs/efaxCyr.zip


<< Пак за преводите на програми | Създаване на потребителски графичен интерфейс с Qt >>