TelecomUral
Silver Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Если кратко, то так: -выбрал одну страничку -понизил версию стандарта с 1.6 до 1.3. Потому что шрифты вообще не видны в структуре файла, объекты не ищутся по номерам. Это в акробате 9.3 это "Дополнительно\Оптимизация PDF ..." и выбрать в выпадающем списке "Сделать совместимым с:" поменьше номер. -перевёл файл в некомпрессированный pdf с помощью qpdf (qpdf --qdf --object-streams=disable in.pdf out.pdf) -отдельной логической веткой выдрал все шрифты Type1 древней утилитой из комплекта myFontsTools (только через waybackmachine их раскопал) через постскрипт (причём дока на утилитку говорит что извлекать в ps надо строго в xpdf, сейчас он xpdfreader). Шрифт выбрал по имени и разглядел внимательно в FontLab Studio 5. -поискал описание шрифта в файле, понял, что тут в шрифтах pdf вообще нет сопоставления кода глифа юникоду. Нет блока /ToUnicode в описании font. -нашёл пример неупакованной таблицы CMap из своих старых экспериментов с pdf-recode-ttf, вставил ее в конец pdf вручную, сопоставил кодам русских букв юникодовские коды. Пришлось CMap сильно подрихтовать, там похоже постскрипт-команды массива с кодами. По наитию работал. Ну и в описание курсивного шрифта ввёл /ToUnicode со ссылкой на CMap. Всё. В принципе, если человек понимает perl, то на гитхабе есть прекрасный инструмент вставки CMap. _https://github.com/sv99/pdf-recode-ttf UPD вообще говоря, вручную подправить некомпрессированный pdf очень просто. в самом конце файла есть табличка xref, это данные обо всех объектах: адрес начала каждого объекта, с первого и до последнего. Ниже неё, вообще в самом-самом конце файла, есть адрес начала самой xref, всё в байтах. Называется startxref. То есть добавляем после последнего объекта новые два: первый объект, CMap, и второй объект длины этого CMap. Дополняем xref-табличку в конце адресами этих объектов, подправляем в startxref адрес xref, и это в общем-то всё. Но только если файл pdf не сильно правился. Потому что по стандарту таблиц xref может быть не одна, они друг на друга могут ссылаться. Тогда наверное вначале pdf надо было оптимизировать в акробате, скорее всего тогда xref обновится и структура станет "наипростейшей". И ещё в xref есть количество строк, в самом начале таблички прописано. Также пришлось поправить увиденное число объектов в блоке trailer: "Size". Я всё делал в notepad++. Но из-за изображений, которые всё-таки не могут быть текстовыми символами, возможно что notepad++ не справится с редактированием большого двоичного файла. Тогда hex-редактор понадобится, типа winhex. Пример подправленного файла вместе с исходной страничкой, и парой промежуточных. Можно "сравнить по содержимому" в тоталкоммандере _https://disk.yandex.ru/d/k-jf2M2Ko4FZEg UPD2 Чтобы составить CMap, нужно посмотреть на блок /Differences у шрифта pdf. Там в квадратных скобках перечислены сначала номер первого глифа, а потом имена глифов из самого шрифта. Имена видны в FontLab Studio. В данном случае оказалось самое примитивное: имя глифа это буква G плюс шестнадцатиричный номер места глифа в таблице. Типа такого: 30 0 obj <</Differences[1 /G31/G32/G33/G34 /G35/G36/G37/G38 /G39/G30]/Type/Encoding>> Русские буквы оказались в конце таблички глифов. Я нашёл место в pdf, где пишется конкретный текст выбранным шрифтом, там были не символы (обычные буквы в круглых скобках) а шестнадцатиричные коды сплошняком. Вот так: 0a09230f0c09230919>52<181d280902050b110619>52<0806030f11060d Разбил на двойки пробелами, сопоставил каждому коду символ, глядя файл акробатридером А дальше дело техники. Из вики взял юникод символа и в CMap его вписал в паре "<шестнадцатиричный символ, два знака> <номер юникода, четыре знака>. Но не впрямую, а через трансляцию Differences и имя и внешний вид глифа. | Всего записей: 3064 | Зарегистр. 15-07-2010 | Отправлено: 10:02 18-11-2021 | Исправлено: TelecomUral, 14:00 18-11-2021 |
|