Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   AlivePDF откуда взять *.AFM? (http://www.flasher.ru/forum/showthread.php?t=157322)

GBee 03.06.2011 19:01

AlivePDF откуда взять *.AFM?
 
Привет,
Пытаюсь сгенерить пдф на русском языке.

Код AS3:

[Embed(source="ARIAL.TTF", mimeType="application/octet-stream")]
private var _fontTtf:Class;
[Embed(source="arial.afm", mimeType="application/octet-stream")]
private var _fontAfm:Class;
 
private var _font:IFont;
private var _pdf:PDF;
 
_pdf = new PDF(Orientation.PORTRAIT, Unit.MM, true, Size.A4);
_pdf.setDisplayMode(Display.FULL_PAGE, Layout.SINGLE_PAGE);
_pdf.setMargins(LM, TM, RM, BM);
_font = new EmbeddedFont(new _fontTtf(), new _fontAfm(), CodePage.CP1251);
_pdf.setFont(_font, DEFAULT_SIZE);
_pdf.addPage();
_pdf.writeText(11, "Съешь этих мягких французских булок да выпей чаю");

И сохраняю
Код AS3:

var fr:FileReference = new FileReference();
fr.save(_pdf.save(Method.LOCAL), getFilename());

Результат в доке:
????? ???? ?????? ??????????? ????? ?? ????? ???

Думаю, что проблема в afm файлике, скачал его в нете, но есть ощущение, что в нем не описаны русские символы. Можно ли как-то генерить эти файлы спецом под свои нужды? Или ошибка в другом месте? (про прокладку не шутите, устал уже)

spacecadet 04.06.2011 14:45

Проблем с afm возникнуть не должно. Если afm некорректен, в созданном pdf будет наблюдаться эффект "пьяных пляшущих символов".
На всякий случай: скачайте вот это - опенсорсная программа для создания afm-описаний шрифтов. Пользоваться так: поместить в один каталог программку и ttf-шрифт (где взять, думаю, сами догадаетесь) и выполнить команду
Код:

ttf2pt1 -a arial.ttf arial
В результате в папке появятся еще два файла, один из них - необходимый arial.afm (PS программка для windows, если пользуетесь другой ОС - поищите свой вариант в гугле).

Проблема с выводом русских символов в том, что строку необходимо конвертировать из utf-8 в win-1251. Я делаю это с помощью функции convert:

Код AS3:

[Embed(source="ARIAL.TTF", mimeType="application/octet-stream")]
private var _fontTtf:Class;
[Embed(source="arial.afm", mimeType="application/octet-stream")]
private var _fontAfm:Class;
 
...
 
public function convert(data:String):String
{
  var byteDataArray:ByteArray = new ByteArray();
  byteDataArray.writeMultiByte(data,"windows-1251");
  return byteDataArray.toString();
}
 
...
 
private function generatePDF():void
{
  var myPDF:PDF = new PDF();
  var myFont:EmbeddedFont = new EmbeddedFont(new _fontTtf(), new _fontAfm(), CodePage.CP1251);
 
  myPDF.setFont(_font, DEFAULT_SIZE);
  myPDF.addPage();
  myPDF.writeText(11, convert("Съешь этих мягких французских булок да выпей чаю"));
 
  //дальше идет сохранение pdf
}

Если вы пользуетесь библиотекой alivepdf в виде исходных кодов, думаю можно модифицировать исходники, так, чтобы все функции записи текста при работе сами конвертировали текст, это будет удобнее. Если вы выводите еще и латиницу или цифры - их можно смело пропускать через convert, они будут отображаться корректно.

Помните, что ЛЮБОЙ кириллический текст, вносимый в pdf нужно конвертить (myPDF.writeText, myPDF.addText, myPDF.addCell, myPDF.addGrid() и т.д.). Единственное, что у меня так и не получилось - прописать кириллицу в свойства pdf (myPDF.setTitle(), myPDF.setCreator(), myPDF.setAuthor(), myPDF.setSubject()), если вам это удастся - отпишите ЛС!

PS: желательно обявление переменных самого pdf и шрифтов внести в локальную область функции, где непосредственно генерируется, наполняется и сохраняется pdf (как в примере выше), иначе могут возникнуть ошибки с повторным сохранением.

GBee 05.06.2011 01:14

Спасибо огромное, программку уже нашел, но вот не получалось все.
Исходниками пользуюсь, уже пару багов нашел в Grid :o) Вроде все, что есть в либе пишется через addCell.

Попробую, отпишусь.

Добавлено через 36 часов 10 минут
Да все получилось, прадва со шрифтом пока борюсь, Arial почему-то как моноширинный выводится

hartman 30.07.2012 15:50

У меня та же проблема с некоторыми шрифтами, например, Arial. Но есть шрифты,котрые отображаются нормально. AFM файлы делал как с помощью ttf2pt1, так и этим сайтом http://onlinefontconverter.com/, результат один.
Возникла другая проблема! PDF хорош как тем, что из него можно копировать текст. А то что получается с помощью AlivePDF копируется как кракозябры. Можно ставить другие кодировки вместо CodePage.CP1251 и соответственно "windows-1251", в PDF все отлично, а кракозябры разные.
Пробовал purePDF с юникодом, текст копируется как квадратики юникода.
Как же нужно кодировать текст, чтобы копировать его в винде?

updart 31.07.2012 18:35

Вложений: 1
у кого какие шрифты нормально отображаются? у меня Arial и Colibri со смещением.
Вложение 28260

если не трудно скиньте хоть один который нормально отображается, с .afm файлом.

GBee 31.07.2012 19:20

Вложений: 2
Вложение 28261
Вложение 28262
Используем такой, но будем искать что-нибудь покруглее :о))

updart 01.08.2012 10:55

Спасибо!

hartman 01.08.2012 12:06

Вложений: 2
Calibri
http://www.flasher.ru/forum/attachme...1&d=1343804537
AFM сделан на http://onlinefontconverter.com/
font
надо пробовать с другими шрифтами

hartman 01.08.2012 12:15

Проблема с копированием текста из pdf так и не решена.
В исходниках AlivePDF есть *.map файлы с описаниями кодировок. CodePage.CP1251 ссылается на cp1251.map и т.д. Это наводит на мысль, что можно добавить файл с нужной кодировкой. Но какая нужна?!

GBee 01.08.2012 12:56

Цитата:

Проблема с копированием текста из pdf так и не решена.
Угу, причем purePDF тоже этим грешит.

За калибри спасибо, попробую

hartman 01.08.2012 15:35

Для PurePDF кириллица выводится нормально, причем тем не нужны AFM файлы и никаких проблем со смещением символов шрифта. Но проблема с копированием остается.
Вот у меня два файла: один из инета, копируется все нормально, другой создан purePDF, копируются квадратики непереводимые даже http://www.artlebedev.ru/tools/decoder/. В обоих файлах одинаковое описание шрифта: type: TrueType (CID), Encoding: Identity-H.
В pdf созданных AlivePDF в свойствах шрифта: type: TrueType, Encoding: Custom. Копируются символы cp1252, которые можно потом хотя бы перевести в русскую кодировку (заданную при создании в флэш) - cp1251, koi8-r или ISO-8859-5.
Как ни печально, придется отказаться от кодирования на стороне клиента и отправлять данные php скрипту.

Добавлено через 9 минут
Да кстати в php тоже не так все просто. Вот, например, большая хорошая статья http://www.uamedwed.com/web/fpdf-bib...lov-na-php.htm... А в результате тоже самое, что и в AlivePDF, копируется cp1252.

GBee 01.08.2012 15:49

Цитата:

Для PurePDF кириллица выводится нормально, причем тем не нужны AFM файлы и никаких проблем со смещением символов шрифта.
Серьезно? Я что-то не справился :о(( Шрифты меня всегда бесили. А что лучше Alive или Pure?

hartman 01.08.2012 18:27

Цитата:

Сообщение от GBee (Сообщение 1090554)
Серьезно? Я что-то не справился :о(( Шрифты меня всегда бесили. А что лучше Alive или Pure?

В архиве purePDF_Examples.zip куча примеров, вам нужен HelloWorldTTF.as (можно ставить как класс документа). Там присоединено два шрифта, меняете их на свои (с кириллицей). Дописываете строки с русским текстом и меняете кодировку каждого шрифта с
Код AS3:

bf = BaseFont.createFont("DejaVuSans.ttf", BaseFont.CP1252, BaseFont.EMBEDDED );

на
Код AS3:

bf = BaseFont.createFont("DejaVuSans.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED );

,
и (о чудо!) русские буквы в файле.

Что лучше я не могу определенно сказать, оба вариант сильно увеличивают вес приложения (порядка 1.5 Мб). Вроде бы в PurePDF больше всяких наворотов, косой текст, аннотации, еще куча всего. Но мне это совершенно не нужно все, была задача работать с кириллицей, обе библиотеки с ней справились по разному, и обе плохо.

Я знаю, что принципиальных ограничений нет, можно создать pdf с нормально копируемым текстом. Пруфлик: http://www.levoni.ru/kalkulator/ - кнопка "сохранить расчет" при помощи неведомого php скрипта выдает адекватный файл. Рабочего примера ни на php, ни на чем то еще пока не нашел.

GBee 01.08.2012 19:52

Мне, к сожалению, только на as3. Пока серверщика ломаем на сервере генерить. :о(

hartman 01.08.2012 23:42

Решил задачу при помощи php. Использовал библиотеку tcpdf, нужна работа с utf-8. Можно использовать tfpdf, но там есть один недостаток. Если мы выгружаем из флэша кроме текста еще и картинки, то нет смысла сохранять их на сервере, хорошо бы их сразу впихнуть в pdf, и уже этот pdf отдать пользователю или сохранить. tcpdf позволяет не указывать путь к файлу с картинкой, а сохранить его как байтовый массив, переданный из флэша.
С русскими буквами все отлично + к tcpdf прилагается набор шрифтов с кириллицей.
Я сам на php не пишу, но там все оказалось довольно просто. До этого 3 дня мучился с AlivePDF и PurePDF. Я очень надеюсь что вскоре решение найдется и для этих библиотек. При большом потоке пользователей создание pdf на стороне клиента очень помогло бы снять нагрузку с сервера.

updart 02.08.2012 13:18

я так понял для обработки на сервере использовать это http://www.fpdf.org/ ? или есть что то еще?

hartman 03.08.2012 20:11

Цитата:

Сообщение от updart (Сообщение 1090685)
я так понял для обработки на сервере использовать это http://www.fpdf.org/ ? или есть что то еще?

Если хотите использовать кириллицу, то там же есть расширенная версия (UTF-8) - tfpdf.
Есть что-то еще - http://www.tcpdf.org/. Последний понравился больше.

updart 14.08.2012 23:38

есть еще одна проблемка в AlivePDF, если есть буквы (Á, Č, Ď, É, Ě, Í, Ň, Ó, Ř, Š, Ť, Ú, Ů, Ý, Ž, Û, Ÿ) чешского и/или французского, а шрифт встроен CodePage.CP1251, то все закорлючки над ними не отображает, ставлю CodePage.CP1252, падает кириллица (((
я так понял что надо .map файл для utf-8, только где его взять

вообщем AlivePDF, Давай до свидания! PurePDF все нормально показывает, правда не копирует текст, но мне как то пофиг.


Часовой пояс GMT +4, время: 19:31.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.