Как встроить шрифты в существующий PDF-файл?

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

У меня есть PDF-файлы, которые я программно генерирую. Мне нужно иметь возможность отправлять PDF непосредственно на принтер с сервера (а не через промежуточное приложение). На данный момент я могу сделать все вышеперечисленное (создать PDF, отправить на принтер), но поскольку шрифты не встроены в PDF, принтер выполняет подстановку шрифтов.

почему шрифты не встроены при создании:

Я создаю PDF-файлы использование служб SQL Reporting Services 2008. Существует известная проблема со службами отчетов SQL в том, что он не будет вставлять шрифты (если ряд требований - http://technet.microsoft.com/en-us/library/ms159713%28SQL.100%29.aspx). Не спрашивайте меня, почему файл PDF соответствует всем перечисленным требованиям МС и шрифты, как не врезать - нет реального контроля над тем, шрифты встроены, поэтому я принял, что это не работает и перемещается на. Предлагаемые обходной путь от 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. Кажется, он не может его найти. Я исследовал и исследовал, но никто не говорит, в каком классе он находится или где я его нахожу, поэтому я могу включить его в использование заявления. Я даже взломал отражатель и, похоже, нигде не могу его найти.

Это то, что у меня есть до сих пор, и он компилирует и т. д. так далее. (результатом является мой байт[] сгенерированного 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).

2 ответов


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

но вы можете использовать командную строку 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 и Каир. Есть команда pdftocairo из Poppler, который преобразует PDF в PDF через pdftocairo -pdf input.pdf output.pdf. Он также рассматривает замены шрифтов, установленные в Fontconfig файл конфигурации. Это очень полезно, если у вас нет всех шрифтов в вашей системе, на которые ссылаются в PDF-файле, но знаете, какой другой шрифт вы установили, является красивой заменой. После обработки шрифт подстановки встроенный.