Как подмножить шрифты, используемые в pdf? (с iTextSharp)

Я создал отчет в формате pdf с помощью ASP.NET + iTextSharp.
Я использовал в нем несколько типов шрифтов, каждый шрифт применялся к одному или двум словам из соображений искусства.
Таким образом, файл большой.

Как я могу вставлять только те шрифты, которые я действительно использовал? Точно так же, как мы делаем с опциями MS Office.

MS Office Word 2007 выглядит следующим образом:
"Встроить шрифты в файл:
Встроить только символы, используемые в документе (лучше всего для уменьшения размера файла)
Не вставлять общие системные шрифты"

ИЛИ Я также могу принять другое решение.
Свести всю страницу к изображению с высоким разрешением.
Если программирование удобно, я предпочитаю это решение.

Спасибо.


person hbrls    schedule 14.04.2011    source источник
comment
Можете ли вы показать нам, какой код вы используете для создания встроенных шрифтов? Если вы используете BaseFont.IDENTITY_H для кодировки, он должен автоматически подставить шрифт для вас. @mark-storer немного подробнее рассказывает о встраивании шрифтов здесь: /4525170/gdicharset-itextsharp/   -  person Chris Haas    schedule 14.04.2011


Ответы (1)


При создании экземпляра BaseFont с включенным встраиванием вам необходимо вызвать myBaseFont.setSubset(true). Обратите внимание, что с кодировкой «Идентификация-H» (AKA BaseFont.IDENTITY_H) это происходит автоматически:

// find all fonts in the usual places across multiple OSs.
// This can be pretty slow if you have a large number fonts, or the fonts
// themselves are Really Big (ArialUnicodeMS: 23mb).
FontFactory.registerDirectories();

// here's one way to do it, using identity-h forces subsetting
Font myFontSubset1 = FontFactory.getFont(fontName1, BaseFont.IDENTITY_H);

// here's another, explicitly enable subsetting for the underlying BaseFont.
Font myFontSubset2 = FontFactory.getFont(fontName2, FontFactory.defaultEncoding, true);
myFontSubset2.getBaseFont().setSubset(true);

//or you can create the BaseFont yourself, with automagic subsetting
BaseFont myFontSubset3 = BaseFont.createFont(fontPath, BaseFont.IDENTITY_H);

// or create it with some other encoding, and enable subsetting.
BaseFont myFontSubset4 = BaseFont.createFont(fontPath, BaseFont.WINANSI, true);
myFontSubset4.setSubset(true);

Обратите внимание, что это все Java. В C# первая буква имени функции пишется с большой буквы, а setX(newX) и getX() становятся свойствами.

person Mark Storer    schedule 14.04.2011
comment
public static BaseFont bfKaiti = BaseFont.CreateFont(rptResource + "simkai.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); Это то, что вы сказали о BaseFont.IDENTITY_H? - person hbrls; 15.04.2011
comment
Значит большой размер pdf файла не из-за шрифтов? Возможно, я задал неправильный вопрос. Но большое спасибо! По крайней мере, мы исключаем одну причину. - person hbrls; 18.04.2011
comment
Acrobat Pro имеет функцию аудита размера PDF, которую вы можете запустить в PDF, чтобы увидеть, что именно занимает все это пространство. Вы можете скачать бесплатную пробную версию. ;) - person Mark Storer; 18.04.2011
comment
Это была единственная документация по BaseFont.setSubset(), которую я смог найти в Интернете (драматический...). Спасибо. - person NoOne; 11.01.2014