有効なPDF/Xドキュメントを生成するには、すべてのフォントを埋め込む必要があります。どうにか私はGraphics2Dコンテキストでこれらのフォントを使用することはできません。埋め込みフォントを使用してGraphics2D.drawString(...)をiTextで呼び出す方法(DefaultFontMapper?)
このユニットテストは(コメント行は、私が作ったいくつかのテストです)問題を示しています
import java.awt.Font;
import java.awt.Graphics2D;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.Map.Entry;
import org.junit.Test;
import com.itextpdf.awt.DefaultFontMapper;
import com.itextpdf.awt.DefaultFontMapper.BaseFontParameters;
import com.itextpdf.awt.PdfGraphics2D;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfWriter;
public class TestFont
{
@Test
public void shouldBeAbleToAddFountsAndDrawOnCanvas() throws FileNotFoundException, DocumentException
{
final DefaultFontMapper mapper = new DefaultFontMapper();
mapper.insertDirectory(".");
final PrintStream out2 = new PrintStream(System.out);
for (final Entry<String, BaseFontParameters> entry : mapper.getMapper().entrySet())
{
out2.println(String.format("%s: %s", entry.getKey(), entry.getValue().fontName));
}
out2.flush();
final float width = 150;
final float height = 150;
final Document document = new Document(new Rectangle(width, height));
final PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("fonts.pdf"));
writer.setPDFXConformance(PdfWriter.PDFX32002);
document.open();
final Graphics2D g2d = new PdfGraphics2D(writer.getDirectContent(), width, height, mapper);
g2d.setFont(new Font("Comicate", Font.PLAIN, 12));
g2d.drawString("Hello world", 5, 24);
g2d.dispose();
document.close();
}
}
それはメッセージでがスローされます:「すべてのフォントが埋め込まれている必要がありますこの1つはありません:ヘルベチカ。
私はすでにsetFont()
実装をチェックするPdfGraphics2D
クラスものの閲覧と私はすでに上でユニットテストにこれを追加しました。FontMapper
が使用されること、が分かった。
public void setFont(Font f) {
if (f == null)
return;
if (onlyShapes) {
font = f;
return;
}
if (f == font)
return;
font = f;
fontSize = f.getSize2D();
baseFont = getCachedBaseFont(f);
}
private BaseFont getCachedBaseFont(Font f) {
synchronized (baseFonts) {
BaseFont bf = (BaseFont)baseFonts.get(f.getFontName());
if (bf == null) {
bf = fontMapper.awtToPdf(f);
baseFonts.put(f.getFontName(), bf);
}
return bf;
}
}
UnittestはiText in Actionの本のthis exampleに基づいています。 Hereは、FontMapperの他の例です。ユニットテストを実行するには
あなたはこの依存関係が必要になります(「」にあります)
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.3.2</version>
</dependency>
カスタムフォントあなたがhereを見つけます。
コンソール出力が私にこの(たfontNameを識別するために)示しています
Comicate: ./COMICATE.TTF
こんにちは、あなたの提案に感謝。残念ながら私はあなたの回避策を利用することはできません:(それはg2d.drawText(...)を呼び出すのではなく、JFreechartです。 – d0x