0

我正在使用带有 iText 和 JFreeChart 的 Linux 机器。在嵌入图表后,我注意到 Helvetica 字体(未嵌入)现在出现在 PDF 文件中。这是我正在使用的代码:

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);

在创建的 PDF 中未观察到字体 jigsaw.otf,尽管使用了 10 的字体大小(源自cFont)(并且更改此值确实控制了此处替换的 Helvetica 字体大小)。

我的最终目标是嵌入所有字体。这意味着(1)嵌入 jigsaw.otf 以使 Helvetica 不会显示为未嵌入,或(2)嵌入 Helvetica 并忘记使用 jigsaw.oft。任何一种都可以接受,只要我可以控制 JFreeChart 图表中使用的字体大小。

怎么做(最简单的方法)?

iText book 2nd edition 14.5.2 “Drawing text to PdfGraphics2d”中有一节,但我相信这是向现有图形添加文本,而不是将 JFreeChart 使用的文本嵌入其图表中。如我错了请纠正我。很困惑。希望有人可以提供一个简单的例子,它是如何完成的。

4

1 回答 1

2

在 iText book, 2nd edition 中找到了我自己的问题的答案,列表 14.20“Text2ToPdf1.java”。

需要注意的一个问题是Fontjava 的 AWT 与 iText 的类的使用——它们都共享相同的 Font 类名称,因此请确保将它们组织在您的代码中(例如http://itextpdf.com/Font中的链接examples/iia.php?id=254import 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);
  ...

这样,字体总是嵌入到所有 JFreeChart 对象的最终 PDF 中。

感谢布鲁诺写了一本好书!http://itextpdf.com/book/

于 2013-07-16T14:43:27.237 回答