Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Программы » Редактирование PDF файлов

Модерирует : gyra, Maz

 Версия для печати • ПодписатьсяДобавить в закладки
На первую страницук этому сообщениюк последнему сообщению

Открыть новую тему     Написать ответ в эту тему

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
Открыть новую тему     Написать ответ в эту тему

На первую страницук этому сообщениюк последнему сообщению

Компьютерный форум Ru.Board » Компьютеры » Программы » Редактирование PDF файлов


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru