Как встроить шрифты в существующий 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, если вы используете ПК.

Вот шаги, которые я предпринял. Вы можете исправить каждую фигуру индивидуально или исправить весь документ.

  1. Откройте файл в формате pdf с помощью Adobe Reader.

  2. Щелкните изображение правой кнопкой мыши и выберите "Свойства документа".

  3. Щелкните "Шрифты". Проверьте, не встроен ли шрифт. Должно быть написано "Courier" или другое название шрифта.

  4. Если ваш PDF-файл не имеет стандартного размера страницы, нажмите "Описание" и посмотрите на размер страницы. Запишите это. Ex. 19,4 x 5,22 дюйма

  5. Откройте PDF-файл в режиме предварительного просмотра. Перейдите в Файл-> Печать. Если используется PDF-файл, размер страницы которого отличается от стандартного, нажмите "Размер бумаги" и выберите "Пользовательский". Вам нужно будет создать нестандартный размер страницы, равный тому, который вы записали на шаге 4. Не забудьте обнулить поля до 0 для всех сторон. После этого вам необходимо установить масштаб печати в диалоговом окне печати на 100%.

  6. В левом нижнем углу диалогового окна печати (в режиме предварительного просмотра на Mac) нажмите "PDF", чтобы распечатать PDF-файл в новый PDF-файл. Выберите место назначения и распечатайте.

  7. Откройте новый PDF-файл в Adobe Reader и убедитесь, что шрифты теперь встроены.

Надеюсь, это поможет.

Если вам повезло (или вы достаточно богаты) и владеете Adobe Acrobat (а не программой Reader), вы можете сделать это следующим образом: откройте файл, сохраните его в формате PDF/A. Если вы хотите, чтобы файл был доступен для редактирования, вы можете сразу нажать «Разрешить редактирование» и сохранить еще раз.

Другие вопросы по тегам