Как встроить шрифты в существующий PDF?
Фон:
У меня есть PDF, которые я генерирую программно. Мне нужно иметь возможность отправлять PDF напрямую на принтер с сервера (не через промежуточное приложение). На данный момент я могу выполнить все вышеперечисленное (сгенерировать PDF, отправить на принтер), но поскольку шрифты не встроены в PDF, принтер выполняет замену шрифта.
Почему шрифты не встраиваются при генерации:
Я создаю PDF-файлы с использованием SQL Reporting Services 2008. Существует известная проблема со службами SQL Reporting Services, заключающаяся в том, что они не будут встраивать шрифты (если не выполняется ряд требований - http://technet.microsoft.com/en-us/library/ms159713%28SQL.100%29.aspx). Не спрашивайте меня, почему, PDF отвечает всем перечисленным требованиям MS, и шрифты все еще отображаются как не встроенные - нет никакого реального контроля над тем, внедрены ли шрифты, поэтому я согласился, что это не работает, и перешел на, Предлагаемый обходной путь от Microsoft ( http://blogs.msdn.com/b/donovans/archive/2007/07/20/reporting-services-pdf-renderer-faq.aspx разделе "Когда службы Reporting Services будут выполнять встраивание шрифтов") это опубликовать PDF-файл для ручной вставки шрифтов.
Цель Возьмите уже созданный PDF-документ, программно "откройте" его и вставьте шрифты, сохраните PDF-файл.
Подход Я указал на iTextSharp, но большинство примеров относится к версии Java, и у меня возникают проблемы с переводом на версию iTextSharp (я не могу найти документацию для iTextSharp).
Я работаю над этим сообщением для того, что мне нужно сделать: встроить шрифт Itext в PDF.
Однако я не могу использовать объект ByteArrayOutputStream. Кажется, он не может его найти. Я исследовал и исследовал, но никто, кажется, не говорит, в каком классе он находится или где я его нахожу, чтобы я мог включить его в операторы использования. Я даже взломал Reflector и, похоже, нигде не могу его найти.
Это то, что у меня есть, и оно компилируется и т. Д. И т. Д. (Результат - мой байт [] сгенерированного PDF).
PdfReader pdf = new PdfReader(result);
BaseFont unicode = BaseFont.CreateFont("Georgia", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
// the next line doesn't work as I need a ByteArrayOutputStream variable to pass in
PdfStamper stamper = new PdfStamper(pdf, MISSINGBYTEARRAYOUTPUTSTREAMVARIABLE);
stamper.AcroFields.SetFieldProperty("test", "textfont", unicode, null);
stamper.Close();
pdf.Close();
Так кто-нибудь может мне помочь с использованием iTextSharp для встраивания шрифтов в PDF или указать мне правильное направление?
Я более чем счастлив использовать любые другие решения, кроме iTextSharp, для достижения этой цели, но он должен быть бесплатным и использоваться бизнесом для внутреннего применения (например, Affero GPL).
5 ответов
Это может быть не тот ответ, который вы ищете (поскольку вы хотите, чтобы ваши проблемы решались программно, а не с помощью внешнего инструмента).
Но вы можете использовать командную строку Ghostscript для встраивания отсутствующих шрифтов в ретроспективу в PDF-файлы, в которые они не встроены:
gs \
-sFONTPATH=/path/to/fonts:/another/dir/with/more/fonts \
-o output-pdf-with-embedded-fonts.pdf \
-sDEVICE=pdfwrite \
-dPDFSETTINGS=/prepress \
input-pdf-where-some-fonts-are-not-embedded.pdf
Одна важная вещь заключается в том, что все отсутствующие шрифты доступны в одном из каталогов, на которые указывает -sFontPath=...
переключатель.
Помимо Ghostscript, также можно использовать Poppler и Cairo. Есть команда pdftocairo
из Poppler, который конвертирует PDF в PDF через pdftocairo -pdf input.pdf output.pdf
, Он также учитывает замены шрифтов, заданные в файле конфигурации Fontconfig. Это очень полезно, если в вашей системе нет всех шрифтов, на которые есть ссылки в PDF-файле, но вы знаете, какой другой установленный вами шрифт является хорошей заменой. После обработки замещающий шрифт внедряется.
Сегодня у меня возникла эта проблема с существующим PDF-файлом, который я загрузил на lulu.com, чтобы сделать распечатанную копию. Он был отклонен из-за того, что не были встроены все шрифты.
Я обнаружил, что если я открыл его в Acrobat X и сохранил как файл.ps postscript, то, когда я дважды щелкнул этот файл.ps в проводнике, он открылся в Acrobat X Distiller, и это автоматически создало новый файл PDF со всеми шрифтами. встроенный!
Естественно, это будет означать, что на вашем компьютере должны быть все необходимые шрифты. В противном случае такая программа, как InFix, может выполнять замену шрифтов.
У меня была эта проблема на Mac с PDF-файлом, который я отправлял в IEEE. Используя Adobe Reader и Preview, я смог обойти это. Я думаю, что любой PDF-принтер может работать вместо Preview, если вы используете ПК.
Вот шаги, которые я предпринял. Вы можете исправить каждую фигуру индивидуально или исправить весь документ.
Откройте файл в формате pdf с помощью Adobe Reader.
Щелкните изображение правой кнопкой мыши и выберите "Свойства документа".
Щелкните "Шрифты". Проверьте, не встроен ли шрифт. Должно быть написано "Courier" или другое название шрифта.
Если ваш PDF-файл не имеет стандартного размера страницы, нажмите "Описание" и посмотрите на размер страницы. Запишите это. Ex. 19,4 x 5,22 дюйма
Откройте PDF-файл в режиме предварительного просмотра. Перейдите в Файл-> Печать. Если используется PDF-файл, размер страницы которого отличается от стандартного, нажмите "Размер бумаги" и выберите "Пользовательский". Вам нужно будет создать нестандартный размер страницы, равный тому, который вы записали на шаге 4. Не забудьте обнулить поля до 0 для всех сторон. После этого вам необходимо установить масштаб печати в диалоговом окне печати на 100%.
В левом нижнем углу диалогового окна печати (в режиме предварительного просмотра на Mac) нажмите "PDF", чтобы распечатать PDF-файл в новый PDF-файл. Выберите место назначения и распечатайте.
Откройте новый PDF-файл в Adobe Reader и убедитесь, что шрифты теперь встроены.
Надеюсь, это поможет.
Если вам повезло (или вы достаточно богаты) и владеете Adobe Acrobat (а не программой Reader), вы можете сделать это следующим образом: откройте файл, сохраните его в формате PDF/A. Если вы хотите, чтобы файл был доступен для редактирования, вы можете сразу нажать «Разрешить редактирование» и сохранить еще раз.