2013-10-01 2 views
0

Я пытался внедрить все отсутствующие шрифты в pdf, чтобы избежать «сюрпризов» при печати или рендеринге их из-за замены шрифта.Pdf встроенные шрифты, игнорируемые pdftops

Таким образом, я создал документ, содержащий только текст «Бергамо-стд», используя шрифт BergamoStd. После этого использовал Pdf Creator для создания pdf без вставки шрифтов: BergamoStd.pdf

Использование C#/iText i встроить шрифт в pdf. (BergamoStd-embedded.pdf) Я могу правильно визуализировать встроенный PDF с или без шрифта, присутствующего в системе. Adobe reader, qpdfview, evince визуализируют pdf без проблем, а читатель Acrobat сообщает, что шрифт встроен, а также pdffonts.

qpdf не сообщает ничего плохого с этим pdf.

Если я использую ghostscript (9.07) для создания файла ps из встроенного pdf, я получаю ps, который можно отобразить и распечатать в порядке, а шрифт также встроен в этот файл ps. pdf2ps, конечно же, получает то же самое, что и ghostscript. даже xpdf в окнах создает действительный файл ps с встроенным шрифтом.

но если я использую pdftops из poppler-utils (v0.24), чтобы сгенерировать файл ps, я получаю небольшой файл ps без встроенного шрифта.

Еще больше; pdftops не может вставлять шрифт в .ps, даже если файл bergamoStd.ttf присутствует в системе, независимо от того, входит ли входной файл pdf с встроенным шрифтом или без него.

Может кто-нибудь объяснить, почему pdftops не может вставить этот шрифт? Я что-то не хватает?

Мои тестовые файлы доступны here, если вы не хотите создавать свои собственные файлы в соответствии с описанными выше шагами.

TIA.

+0

Как именно вы разместили шрифт с помощью iTextSharp? – mkl

+0

Я следил за тем же примером, что вы упомянули (используя itextSharp), поскольку шрифт не является TrueType. Вместо этого я использовал PdfName.FONTFILE3. Поэтому мне нужно указать требуемый подтип, для чего я следовал [это сообщение iText] (http://itext-general.2136553.n4.nabble.com/OTF-and-PFM-fonts-not-embedding-in-existing- PDF-td2167028.html). Таким образом, документ «достаточно близко» к правильности, и многие инструменты не сообщают ничего плохого, но pdftops делают, а @VadimR объясняет, почему. – Nomada

ответ

1

У вас возникли проблемы с файлом Bergamo Std-embeded.pdf. Встроенный шрифт помечен как «Type1C» (Type1 Compact или CFF) в FontDescriptor> FontFile3> Подтип записи словаря шрифтов. И это сообщается как таковое, например, pdffonts (poppler-utils) или mutool (из MuPDF). Но на самом деле он встроен без изменений в исходном формате OpenType. Вы можете извлечь его из PDF с помощью, например, mutool и сравнить с BergamoStd-Regular.otf - те же файлы.

Что должно было сделать C#/iText (или вы, если это ответственность разработчика за эту библиотеку), либо явно маркируют подтип встроенного FontFile как OpenType (функция PDF 1.6), либо конвертируют BergamoStd-Regular.otf в pfb (или далее к cff, может быть - если все управляется вручную) перед встраиванием.

Я изменил «Type1C» строку «OpenType» в вашем Бергамо Std-embeded.pdf (с использованием Enfocus PDF Browser, но PoDoFo или PDFedit должен делать эту работу, тоже), а затем pdftops создан правильно (т.е. шрифта встроенный) postscript из фиксированного pdf. Я думаю (но не проверял), что преобразование файла otf в cff и встраивание его на место также исправит оригинальный pdf.

Похоже, что все утилиты, о которых вы упомянули, очень разрешительны в отношении незначительного нарушения синтаксиса PDF, но pdftops - нет.

+0

На самом деле iTextSharp не имеет функции встраивания шрифтов post-facto (т. Е. В существующие документы для существующих, не встроенных шрифтов) как часть своего высокоуровневого API; он имеет публичный низкоуровневый API, хотя он может использоваться практически для любых манипуляций, и действительно есть [пример] (http://itextpdf.com/examples/iia.php?id=288), показывающий как использовать этот низкоуровневый API для такого внедрения post-facto. Конечно, использование API низкого уровня требует от вас знать, что вы делаете, и позволяет вам стрелять по собственной ноге разными способами ...;) Я полагаю, что @Nomada использовал подвеску C# здесь. – mkl

+0

@VadimR, только один свободный конец. Я создал 1.6-версию pdf-клона Bergamo Stf.pdf (без встроенного шрифта), на всякий случай, если pdftops игнорирует 1.6 функции для файла 1.4. Bergamo.otf установлен в моей системе, но pdftops в этом случае не встраивает шрифт. Он может отлично вписаться в ваше решение, чтобы он мог обрабатывать шрифт ... – Nomada

+1

Это, вероятно, не связано - еще одна проблема с этой утилитой. Решение (объяснение) выше было о встроенных шрифтах, когда подтип FontFile был неправильным (хотя **, что ** не было проблемой с pdftops, а скорее с создателем файла PDF). Теперь, если шрифты не встроены, pdftops ищет их в системных шрифтах, и не всегда это удается. Кажется, что он терпит неудачу, если шрифт Type1 или OTF с контурами postscript (как ваш шрифт) - это было в случае с любыми шрифтами, которые я проверил, а не только с BergamoStd-Regular.otf. Но если шрифт TTF или OTF «с истинными контурами типа», он успешно найден и встроен в PS. – user2846289

Смежные вопросы