#vb.net #pdf
#vb.net #PDF
Вопрос:
Я работаю над веб-сайтом, который создает PDF-файлы динамически.
Я поиграл с двумя разными элементами управления pdf — wpcubed и abcpdf — и был удивлен, увидев, что они оба отображают текст по-разному.
wpCubed:
abcpdf:
Они оба используют arial 25pt bold, поэтому я ожидал, что они будут выглядеть одинаково. Кто-нибудь может объяснить, почему они этого не делают.
Комментарии:
1. Возможно, они использовали разные уровни масштабирования / dpi при отображении текста.
2. Уровень масштабирования в программе просмотра pdf определенно тот же. Я убедился, что проверил это.
3. Уровень масштабирования на самом деле зависит от эталонного dpi, используемого для 100%-ного масштабирования. Например, Adobe Reader может использовать 110 точек на дюйм (или другие пользовательские значения, которые можно задать в настройках) в качестве эталона для 100%-ного увеличения, поэтому 100%-ное увеличение в Adobe Reader не будет таким же, как 100%-ное увеличение в Foxit. Если вы можете опубликовать файл где-нибудь, я могу взглянуть на него. Наша компания также разрабатывает программу просмотра PDF, PDFView4NET ( o2sol.com/pdfview4net/overview.htm ), мы приглашаем вас взглянуть на это.
4. Хорошо, спасибо. Файлы теперь там.
5. в wpcubed.pdf используется шрифт Arial Bold, размер 22,5 пункта, а также настраивается интервал между словами. в abcpdf.pdf используется шрифт Arial, размер 25, интервал между словами не регулируется, и он рисует один и тот же текст 4 раза, каждый раз сдвигая позицию X на 0,25 пункта (понятия не имею, почему). Я рекомендую также взглянуть на наш генератор PDF PDF4NET: www.o2sol.com/pdf4net/overview.htm
Ответ №1:
Несколько различных возможностей:
- Уровни масштабирования в вашем представлении PDF. Если ваш вид по умолчанию — fit width, а размер страницы по умолчанию отличается, это может произойти довольно незаметно.
- Кернинг. Интервал между двумя символами можно регулировать в зависимости от того, что это за символы. В «Ti» буква «i» часто намного ближе к «T», чем могла бы быть в противном случае. Если один поддерживает это, а другой нет, ваш вывод будет иметь разную ширину.
- Лигатуры. Классическим примером является «fi», где точка i и выступ «f» — это одни и те же пиксели. Если один поддерживает это, а другой нет, ваш вывод будет иметь разную ширину.
- Пути против шрифтов. Можно нарисовать заданную строку текста, используя текстовые операторы или операторы преобразования строки в кривую. Последний вариант крайне неэффективен, но иногда это единственный способ правильно отобразить заданный фрагмент текста. Текст с путями может страдать из-за отсутствия «намеков» на шрифт… различные приемы, используемые для выравнивания текста по пикселям.
Без доступа к вашим выводам PDF невозможно быть уверенным.
С учетом сказанного, пропорции некоторых из этих символов выглядят по-разному. Сравните букву «e» в «test» из двух строк. Буква «e» из abcpdf выглядит «шире», чем буква из wbCubed. Это не кернинг, лигатуры или уровни масштабирования. Возможно, это даже не пути к шрифтам.
Итак, можем ли мы просмотреть ваши PDF-файлы?
Вот поток содержимого из wpcubed
BT 1 0 0 1 0 0 Tm /F1 22.500 Tf 0 Ts 0 g -2.667 Tw 452 -18 Td (это тест)Tj ET
А вот поток содержимого из abcpdf:
BT 0 0 0 rg /Fabc5 25 Tf 1 0 0 1 444.825 822 Tm (Это тест) Tj 0.25 0 Td (Это тест) Tj 0.25 0 Td (Это тест) Tj 0.25 0 Td (Это тест) Tj ET
Хех: «Бедняга выделен жирным шрифтом». Позвольте мне проверить ресурсы шрифта… Да.
wpcubed использует «Arial, жирный шрифт». abcpdf использует «ArialMT» и печатает одни и те же слова с небольшим смещением несколько раз.
Вероятно, вы можете убедить abcpdf использовать «Arial, bold», и в этом случае я бы ожидал, что два выходных данных будут выглядеть идентично. Я раньше не смотрел abcpdf, но, вероятно, это возможно.
Я только что проверил их документы, и, похоже, XFont.findFamily("Arial")
это правильный путь. Вы бы проверили возвращаемый массив XFonts
на предмет того, что «действительно» выделено полужирным шрифтом Arial, а не какой-либо искусственной техникой выделения жирным шрифтом в обычном Arial. Вероятно, вы также захотите посмотреть на XFont.names
, а не XFont.name
на.
Этот конкретный трюк с «выделением жирным шрифтом» имеет серьезный недостаток: функция Copy-n-paste выделит все 4 экземпляра текста. Более удобным методом выделения является определение толщины линии на основе некоторой небольшой доли размера точки шрифта (в iText используется 1/30), а также обводка и заливка шрифта. Шрифты обычно просто заполняются, поэтому толщина этой линии добавляется к внешней стороне шрифта, без лишних слов, которые могут сбить с толку кого-либо, кто выбирает / читает текст на экране.
Ага. Слепые люди с программами чтения с экрана, должно быть, ненавидят это.
Комментарии:
1. Спасибо. Уровни масштабирования определенно одинаковы — я проверил это. Я рассмотрю другие возможности.
2. Я добавил ссылки на PDF-файлы.
3. Спасибо. Теперь я перешел с использования «Arial» с выделением жирным шрифтом на «Arial Bold». И это работает. (Также это делает мои белые цвета вдвойне чистыми!)