2013-07-16 1 views
0

Я использую машину Linux с iText и JFreeChart. Я заметил после внедрения диаграммы, что шрифт Helvetica (un-embedded) теперь появляется в файле PDF. Вот код, я использую:Как можно вставить шрифт iText, используемый JFreeChart для заголовка и ярлыков диаграмм?

import com.itextpdf.text.Font; 

// create chart using JFreeChart 
final XYPlot plot = jchart.getXYPlot(); 
final LogAxis xAxis = new LogAxis("x axis"); 
final NumberAxis yAxis = new NumberAxis("y axis"); 
... 
java.awt.Font cFont = new java.awt.Font("/home/fonts/jigsaw.otf",java.awt.Font.PLAIN,10); 
xAxis.setLabelFont(cFont); // set axis label font 
... 

// add chart to PDF 
PdfTemplate chart = canvas.createTemplate(chartWidth, chartHeight); 
Graphics2D g2d1 = new PdfGraphics2D(chart, chartWidth, chartHeight); 
Rectangle2D r2d1 = new Rectangle2D.Double(0,0,chartWidth,chartHeight); 
jchart.draw(g2d1, r2d1); 
g2d1.dispose(); 
canvas.addTemplate(chart,document.left(),100); 

jigsaw.otf шрифт не наблюдается в PDF, который получает созданный, хотя размер шрифта 10 (производный от cFont) используется (и изменение этого значения делает управление размер шрифта Helvetica, который заменяется здесь).

Моя конечная цель - вставить все шрифты. Это означает, что (1) вложение jigsaw.otf так, чтобы Helvetica не появлялось без внедрения, или (2) вложение Helvetica и забывание об использовании jigsaw.oft. Любой из них является приемлемым, если я могу контролировать размер шрифта, используемый в диаграмме JFreeChart.

Как это сделать (простейший способ)?

Существует раздел в книге iText 2-е издание 14.5.2 «Рисование текста в PdfGraphics2d», но я считаю, что это добавление текста в существующую графику, а не вложение текста, используемого JFreeChart в его диаграмме. Поправьте меня если я ошибаюсь. Очень смутно. Надеясь, что кто-то может предоставить простой пример того, как это делается.

+0

Возможно, вы захотите _подмножить подмножество шрифта_ (используемых символов): 'FontFactory.defaultEmbedding = true;'. Если это работает без JFreeChart, он, вероятно, также работает. –

ответ

2

Нашел ответ на мой собственный вопрос выше в книге iText, 2-е издание, листинг 14.20 «Text2ToPdf1.java».

Один из вопросов, чтобы быть в курсе является использование Font класса для AWT в Java против IText - оба они один и то же имя класса шрифта, так что будьте уверены, чтобы держать их организовали в своем коде (например, связанный Font в http://itextpdf.com/examples/iia.php?id=254 для import java.awt.Font; указывает на com.itextpdf.text.Font). Я включил путь java.awt.Font в коде ниже, чтобы избежать путаницы:

// Create a custom font mapper that forces Graphics2D to use a specific font 
    FontMapper myChartFont = new FontMapper() { 
     public BaseFont awtToPdf(java.awt.Font font) { 
      try { 
       return BaseFont.createFont("/path/to/your/font/myFontName.ttf",BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 
      } catch (DocumentException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     public java.awt.Font pdfToAwt(BaseFont font, int size) { 
      return null; 
     } 
    }; 

    ... 
    // include code posted in original question here, with the following substitution: 
    Graphics2D g2d1 = new PdfGraphics2D(chartY, chartWidth, chartHeight, myChartFont); 
    ... 

Таким образом, шрифт всегда встраивается в окончательном PDF для всех объектов JFreeChart.

Спасибо, Бруно, за отличную книгу! http://itextpdf.com/book/

Смежные вопросы