iText로 PDF에 절대 좌표 지정의 문자·괘선 그리기
아무래도이 레이아웃으로 출력! 라는 것이 요구되는 경향이 있는 업무 시스템 장표를 만들 때 참고가 될까 생각합니다.
기본적으로 PdfContentByte 객체에 대해 작업을 수행합니다. 이 경우라면, BaseFont 밖에 사용할 수 없다(Font 객체를 사용할 수 없다)입니다만. . .
굵게, 문자의 스트로크를 그리는 것으로 표현.
기울임꼴을 TextMatrix에 지정하는 변환 행렬로 표현합니다.
시도한 환경은 다음과 같습니다.
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
Reference
이 문제에 관하여(iText로 PDF에 절대 좌표 지정의 문자·괘선 그리기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/shuetsu@github/items/243b880ad52469bb1c08텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)