Подтвердить что ты не робот

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

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

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

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

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

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

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

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

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