0

次のコードは、PDFに出力するJava2Dアプリケーションの簡略化されたケースです。それはどういうわけか'点線の私をトルコ語で印刷しません。' PDFGrahics2Dを使用します。

import com.lowagie.text.pdf.PdfWriter;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfTemplate;
import com.lowagie.text.pdf.DefaultFontMapper;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Rectangle;

import java.io.FileOutputStream;
import java.io.File;
import java.io.IOException;
import java.awt.Graphics2D;
import java.awt.Font;

public class DottedIExampleWithGraphics2D
{

    private static final float WIDTH = 900;
    private static final float HEIGHT = 500;
    private DefaultFontMapper mapper = new DefaultFontMapper();

    public void testWriteOfStringWithFont() throws IOException, DocumentException
    {

        File fontFile = new File("c:/windows/fonts/arialuni.ttf");
        BaseFont bf = BaseFont.createFont(fontFile.getAbsolutePath(),
                BaseFont.IDENTITY_H,
                BaseFont.NOT_EMBEDDED);
        Font theFont = mapper.pdfToAwt(bf, 18);
        Document document = new Document(new Rectangle(WIDTH, HEIGHT));

        File testFile = new File("learning_withfont.pdf");
        FileOutputStream fos = new FileOutputStream(testFile);
        PdfWriter writer = PdfWriter.getInstance(document, fos);
        document.open();

        PdfContentByte cb = writer.getDirectContent();
        PdfTemplate tp = cb.createTemplate(WIDTH, HEIGHT);
        cb.addTemplate(tp, 0, 0);
        Graphics2D graphics = tp.createGraphics(WIDTH, HEIGHT, mapper);

        graphics.setFont(theFont);
        graphics.drawString(" \u0130 , \u0131 ", 25, 50);

        graphics.drawString(bf.getPostscriptFontName(), 25, 100);

        //
        graphics.dispose();
        document.close();

        System.out.println("testFile.getAbsolutePath() = " + testFile.getAbsolutePath());
    }

    /**
     */
    public static void main(String[] args) throws IOException, DocumentException
    {
        new DottedIExampleWithGraphics2D().testWriteOfStringWithFont();
    }
}

出力はこんな感じ。

点線私はこれに欠けています

問題は、そのような文字をPDFGraphics2Dに印刷する方法です。PDFを正常に作成するためのJavaコードは機能します。コードはクイックリファレンスのためにここにあります。

import com.lowagie.text.Chunk;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Font;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfWriter;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class DottedIExample
{

    /**
     * Creates a PDF document. write a string and font name
     */
    public void createPdf(String filename) throws IOException, DocumentException
    {

        Document document = new Document();
        PdfWriter.getInstance(document, new FileOutputStream(filename));

        document.open();
        File fontFile = new File("c:/windows/fonts/arialuni.ttf");
        BaseFont bf = BaseFont.createFont(fontFile.getAbsolutePath(),
                BaseFont.IDENTITY_H,
                BaseFont.NOT_EMBEDDED);
        Font font = new Font(bf, 12);
        document.add(new Paragraph(bf.getPostscriptFontName(), font));
        document.add(new Paragraph("\u0131 , \u0130", font));
        document.add(Chunk.NEWLINE);

        document.close();
    }

    /**
     */
    public static void main(String[] args) throws IOException, DocumentException
    {
        File result = new File("dottedi.pdf");
        new DottedIExample().createPdf(result.getAbsolutePath());
        System.out.println("result at = " + result.getAbsolutePath());
    }
}
4

1 に答える 1

0

問題はマッパーにありました。正しいawtToPdf()/pdf2awt() フォントを返すように設定する必要があります。

参考のために修正されたコード..(マッパーの実際のセットアップはより複雑です)

import com.lowagie.text.pdf.PdfWriter;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfTemplate;
import com.lowagie.text.pdf.DefaultFontMapper;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Rectangle;

import java.awt.*;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.File;
import java.io.IOException;

public class DottedIExampleWithGraphics2D {

    private static final File aFontFile = new File(("c:/windows/fonts/arialuni.ttf"));
    private static final float WIDTH = 90;
    private static final float HEIGHT = 50;
    private DefaultFontMapper mapper = new DefaultFontMapper() {
        @Override
        public BaseFont awtToPdf(Font font) {
            try {
                return BaseFont.createFont(aFontFile.getAbsolutePath(),
                        BaseFont.IDENTITY_H,
                        BaseFont.NOT_EMBEDDED);
            } catch (DocumentException e) {
                e.printStackTrace();  //blah
            } catch (IOException e) {
                e.printStackTrace();  //blah
            }
            return null;
        }

        @Override
        public Font pdfToAwt(BaseFont baseFont, int i) {
            try {
                return Font.createFont(Font.TRUETYPE_FONT, new FileInputStream(aFontFile));
            } catch (FontFormatException e) {
                e.printStackTrace();  //blah
            } catch (IOException e) {
                e.printStackTrace();  //blah
            }
            return null;
        }
    };


    public void testWriteOfStringWithFont() throws IOException, DocumentException {


        Font theFont = mapper.pdfToAwt(null, 18);
        Document document = new Document(new Rectangle(WIDTH, HEIGHT));

        File testFile = new File("learning_withfont.pdf");
        FileOutputStream fos = new FileOutputStream(testFile);
        PdfWriter writer = PdfWriter.getInstance(document, fos);
        document.open();

        PdfContentByte cb = writer.getDirectContent();
        PdfTemplate tp = cb.createTemplate(WIDTH, HEIGHT);
        cb.addTemplate(tp, 0, 0);
        Graphics2D graphics = tp.createGraphics(WIDTH, HEIGHT, mapper);

        graphics.setColor(Color.blue);
        graphics.setFont(theFont);
        graphics.drawString(" \u0130 , \u0131 , \u0049, \u0069", 10, 10);

        graphics.drawString("some", 10, 30);

        //
        graphics.dispose();
        document.close();

        System.out.println("testFile.getAbsolutePath() = " + testFile.getAbsolutePath());
    }

    /**
     */
    public static void main(String[] args) throws IOException, DocumentException {
        new DottedIExampleWithGraphics2D().testWriteOfStringWithFont();
    }
}
于 2012-07-21T06:48:42.003 に答える