iText로 PDF에 절대 좌표 지정의 문자·괘선 그리기

19671 단어 iText자바PDF
Java로부터 이용할 수 있는 PDF 출력 라이브러리의 iText로, 셀이나 테이블등의 구조를 사용하지 않고, 절대 좌표 지정으로의 문자 및 테두리의 렌더링을 실시하는 샘플입니다.

아무래도이 레이아웃으로 출력! 라는 것이 요구되는 경향이 있는 업무 시스템 장표를 만들 때 참고가 될까 생각합니다.

기본적으로 PdfContentByte 객체에 대해 작업을 수행합니다. 이 경우라면, BaseFont 밖에 사용할 수 없다(Font 객체를 사용할 수 없다)입니다만. . .
굵게, 문자의 스트로크를 그리는 것으로 표현.
기울임꼴을 TextMatrix에 지정하는 변환 행렬로 표현합니다.

시도한 환경은 다음과 같습니다.
  • Java8
  • Eclipse4.3
  • iText5.5.9

  • iText는 여기에서 떨어졌습니다.

    itextpdf-5.5.9.jar, itext-asian.jar을 빌드 경로에 추가합니다.
    text-asian.jar는 extrajars-2.3.zip에 포함되어 있습니다.

    출력되는 PDF의 내용은 이런 느낌입니다.



    이하, 소스 코드가 됩니다.

    Main.java
    import java.io.FileOutputStream;
    
    import com.itextpdf.text.Document;
    import com.itextpdf.text.PageSize;
    import com.itextpdf.text.pdf.BaseFont;
    import com.itextpdf.text.pdf.PdfContentByte;
    import com.itextpdf.text.pdf.PdfName;
    import com.itextpdf.text.pdf.PdfWriter;
    
    public class Main {
    
        private static String data[][] = {
                {"45460", "足跡"},
                {"48134", "新しい歌の味ひ"},
                {"48164", "A LETTER FROM PRISON"},
                {"48154", "郁雨に与ふ"},
                {"816", "一握の砂"},
                {"48133", "「一握の砂」広告"},
                {"48135", "一日中の楽しき時刻"},
                {"52298", "公孫樹"},
                {"43031", "一利己主義者と友人との対話"},
                {"48136", "いろ/\の言葉と人"},
                {"48155", "所謂今度の事"},
                {"48156", "歌のいろ/\"},
                {"48137", "歌集「嘲笑」序文"},
                {"43070", "火星の芝居"},
                {"49676", "悲しき思出"},
                {"815", "悲しき玩具"},
                {"48157", "硝子窓"},
                {"49677", "閑天地"},
                {"45461", "菊池君"},
                {"45462", "雲は天才である"},
                {"48138", "雲間寸観"},
                {"48366", "刑余の叔父"},
                {"811", "氷屋の旗"},
                {"47891", "心の姿の研究"},
                {"45463", "札幌"},
                {"50410", "散文詩"},
                {"817", "詩"},
                {"814", "時代閉塞の現状"},
                {"49678", "渋民村より"},
                {"50411", "唱歌"}};
    
        public static void main(String[] args) throws Throwable {
    
            FileOutputStream fos = new FileOutputStream("output.pdf");
            Document doc = new Document();
            PdfWriter writer = PdfWriter.getInstance(doc, fos);
    
            // タイトル,作者の設定
            doc.addTitle("石川啄木作品リスト");
            doc.addAuthor("shuetsu");
    
            // 印刷時に「実際のサイズ」となるようにする。
            writer.addViewerPreference(PdfName.PRINTSCALING, PdfName.NONE);
    
            doc.open();
    
            // ページの設定。
            doc.setPageSize(PageSize.A4);
            doc.setMargins(0, 0, 0, 0);
            doc.newPage();
    
            PdfContentByte cb = writer.getDirectContent();
    
            // ベースフォントの作成。
            BaseFont font = BaseFont.createFont("HeiseiKakuGo-W5", "UniJIS-UCS2-H", BaseFont.NOT_EMBEDDED);
    
            // MSゴシックを埋め込む場合。
            //BaseFont font = BaseFont.createFont("C:\\Windows\\Fonts\\msgothic.ttc,0", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
    
            // タイトルの描画。
            {
                cb.saveState();
    
                // ストロークを描画することで、太字にする。
                cb.setLineWidth(0.2);
                cb.setTextRenderingMode(PdfContentByte.TEXT_RENDER_MODE_FILL_STROKE);
    
                // フォントとフォントサイズの設定。
                cb.setFontAndSize(font, 20);
    
                // タイトル文字の描画。
                cb.beginText();
                cb.setTextMatrix(1f, 0f, 0.3f, 1f, // 変換行列を指定して斜体にしてみる。
                        200, // X座標
                        doc.getPageSize().getHeight() - 50); // Y座標はページ下端が基準。これで「上から50pt」となる。
                cb.showText("石川啄木作品リスト");
                cb.endText();
                cb.restoreState();
            }
    
            // 明細の高さ。
            float h = 20;
    
            // 背景の描画。
            for(int i = 0;i < data.length;i++){
    
                float y = doc.getPageSize().getHeight() - (i * h + 100);
    
                // 1行おきに灰色で背景を塗りつぶす。
                if (i % 2 == 0){
                    cb.saveState();
                    cb.setRGBColorFill(200, 200, 200);
                    cb.rectangle(100, y, 400, h);
                    cb.fill();
                    cb.restoreState();
                }
            }
    
            // 明細の描画。
            for(int i = 0;i < data.length;i++){
    
                float y = doc.getPageSize().getHeight() - (i * h + 100);
    
                // 明細区切りの直線を描画。
                {
                    cb.saveState();
                    cb.moveTo(100, y);
                    cb.lineTo(500, y);
                    cb.stroke();
                    cb.restoreState();
                }
    
                // 明細の内容を描画。
                {
                    cb.saveState();
                    cb.setFontAndSize(font, 10);
                    cb.beginText();
    
                    cb.setTextMatrix(100, y + 5);
                    cb.showText("作品ID : " + data[i][0]);
    
                    cb.setTextMatrix(250, y + 5);
                    cb.showText(data[i][1]);
    
                    cb.endText();
                    cb.restoreState();
                }
            }
    
            doc.close();
        }
    
    }
    

    리포지토리는 여기입니다.
    htps : // 기주 b. 코 m / 슈에츠 / 있어 xt_ 레포 rt

    좋은 웹페이지 즐겨찾기