Добрый день.
Недавно решал задачу - сделать вывод результатов программы в формате PDF. Сначала посмотрел, есть ли какие-то библиотеки на С, но потом всё же решил ознакомиться с PDF 32000-1:2008 и посмотреть, как всё устроено изнутри. Сама структура оказалась не такой уж и сложной в рамках решения простых задач, однако, некоторые нюансы заставили выдать быстрое решение методом подгона, что я считаю стратегически неправильным. Дело вот в чём, вывод текстовой информации осуществляется заранее определённым шрифтом, пути тут, как понял, два: использовать стандартные, либо загружать внутрь файла свои. Естественно, для простоты было принято первое:
9.6.2.2 Standard Type 1 Fonts (Standard 14 Fonts)
The PostScript names of 14 Type 1 fonts, known as the standard 14 fonts, are as follows: Times-Roman, Helvetica, Courier, Symbol, Times-Bold, Helvetica-Bold, Courier-Bold, ZapfDingbats, Times-Italic, Helvetica-Oblique, Courier-Oblique, Times-BoldItalic, Helvetica-BoldOblique, Courier-BoldOblique
21 0 obj
<< /Font <</F1 22 0 R>> >>
endobj
22 0 obj
<< /Type /Font /Subtype /Type1 /BaseFont /Courier >>
endobj
Далее, в качестве теста была задана размеченная в сетку (5х5мм) страница с текстом:
30 0 obj
<< /Type /Page /Parent 20 0 R /MediaBox [0 0 210 297]
/Resources 21 0 R /Contents 31 0 R /UserUnit 2.8346>>
endobj
Коэффициент 2.8346 переводит базовую единицу измерения с 1/72 дюйма на 1мм. Собственно 210х297 - формат А4 в явном виде.
31 0 obj
<< /Length ... >>
stream
BT /F1 20 Tf 25 11 Td (Example.) Tj ET
...
endstream
endobj
Здесь "20 Tf" - размер шрифта в определённых страницей единицах, то есть по идее высота текста должна быть 20мм от базовой линии до верхней границы заглавных букв, однако, вместо этого фактическая величина примерно равна 12мм. "25 11 Td" указывает на координату начала текста, с некоторыми оговорками всё чётко - миллиметры работают. Замена шрифта другим типом изменяет фактическую высоту букв. Как правильно производить контроль высоты шрифта? Есть ли шрифты где следуют какому-то "стандарту"?