Как встроить шрифты в существующий PDF? - PullRequest
27 голосов
/ 20 ноября 2010

Справочная информация:

У меня есть 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).

Ответы [ 3 ]

31 голосов
/ 20 ноября 2010

Возможно, это не тот ответ, который вы ищете (поскольку вы хотите, чтобы ваши проблемы решались программно, а не с помощью внешнего инструмента).

Но вы можете использовать командную строку 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=....

11 голосов
/ 21 декабря 2014

Помимо Ghostscript, также можно использовать Poppler и Cairo.Есть команда pdftocairo от Попплера, которая конвертирует PDF в PDF через pdftocairo -pdf input.pdf output.pdf.Он также учитывает замены шрифтов, заданные в файле конфигурации Fontconfig .Это очень полезно, если в вашей системе нет всех шрифтов, на которые есть ссылки в PDF-файле, но вы знаете, какой другой установленный вами шрифт является хорошей заменой.После обработки замещающий шрифт внедряется.

0 голосов
/ 15 мая 2019

У меня была эта проблема на Mac с PDF, который я отправлял в IEEE. Используя Adobe Reader и Preview, я смог обойти это. Я думаю, что любой PDF-принтер может работать вместо предварительного просмотра, если вы находитесь на ПК.

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

  1. Открыть в формате PDF с помощью Adobe Reader.

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

  3. Нажмите «Шрифты». Проверьте, не установлен ли шрифт. Должен сказать «Курьер» или другое имя шрифта.

  4. Если ваш pdf не стандартный размер страницы, нажмите «Описание» и посмотрите на размер страницы. Запишите это. Ex. 19,4 х 5,22 дюйма

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

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

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

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

...