Ответ 1
Я написал один раньше (для аналогичных потребностей), и я могу сказать следующее: получайте удовольствие. Это довольно сложная задача. спецификация PDF является большой и громоздкой. Существует несколько способов хранения текста внутри него. И кикер состоит в том, что каждый PDF-генератор отличается тем, как он работает. Таким образом, в то время как что-то вроде TFPDF или DOMPDF создает ДЕЙСТВИТЕЛЬНО легко читаемые PDF файлы (с точки зрения машины), Acrobat создает действительно адские документы.
Причина в том, как он пишет текст. Большинство обработчиков, основанных на DOM, которые я использовал, пишут всю строку как одну строку и устанавливаем ее один раз (что очень легко читать). Acrobat пытается быть более эффективным (и это), записывая только одно или, может быть, несколько символов за раз, и позиционируя их независимо. Хотя это ДЕЙСТВИТЕЛЬНО упрощает рендеринг, это делает чтение намного сложнее.
Верхняя сторона здесь заключается в том, что формат PDF сам по себе очень прост. У вас есть "объекты", которые следуют за регулярным синтаксисом. Затем вы можете связать их вместе для создания контента. Спецификация хорошо описывает описание формата файла. Но чтение в реальном мире займет немного мозговой силы...
Некоторые полезные советы, которые я должен был усвоить, если вы сами напишете:
- Adobe любит переквалифицировать шрифты. Таким образом, символ
65
, скорее всего, не будетA
... Вам нужно найти объект карты и вывести, что он делает, на основе того, какие символы там. И это эффективно, поскольку, если символ не отображается в документе для этого шрифта, он не включает его (что затрудняет жизнь, если вы пытаетесь программно редактировать PDF файл)... - Напишите его как можно более абстрактным. Напишите классы для каждого типа объекта и каждого нативного типа (строки, числа и т.д.). Пусть эти классы разобраны для вас. Там будет справедливое количество повторений, но вы сэкономите себя в конце, когда поймете, что вам нужно настроить что-то только для одного конкретного типа)...
- Напишите для конкретной версии или двух спецификаций PDF и применяйте ее. Проверьте номер версии, и если она выше, чем вы ожидаете, залог... И не пытайтесь "заставить ее работать". Если вы хотите поддерживать более новые версии, оттуда выведите спецификацию и обновите парсер. Не пытайтесь пробовать и ошибаться ваш путь (это не весело)...
- Удачи в сжатых потоках. Я обнаружил, что обычно вы не можете доверять аргументам длины, чтобы проверить, что вы разжимаете. Иногда (для некоторых генераторов) он работает хорошо... Другие это один или несколько байтов. Я просто пытаюсь сдуть его, если фильтр соответствует, а затем заставляет длину...
- При тестировании длин не используйте
strlen
. Используйтеmb_strlen($string, '8bit')
, поскольку он будет компенсировать разные наборы символов (и разрешить потенциально недопустимые символы в других кодировках).
В противном случае, удачи...