iText の配布元の設定に従う。日本語を出力するために itext-asian もインストールする
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.snail.exam</groupId>
<artifactId>PrintExam</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>PrintExam</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>itextpdf.com</id>
<name>Maven Repository for iText</name>
<url>http://maven.itextpdf.com/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.1.0</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.1.0</version>
</dependency>
</dependencies>
</project>
package com.snail.exam.printexam;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfPageEventHelper;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.FileOutputStream;
import java.io.OutputStream;
/**
* Hello world!
*
*/
public class ITextExam {
/** 横書き指定. */
private static final String HORIZONTAL = "UniJIS-UCS2-H";
/** 縦書き指定. */
private static final String VERTICAL = "UniJIS-UCS2-V";
/** 横書き指定 & 英数を半角幅で印字. */
private static final String HORIZONTAL_HW = "UniJIS-UCS2-HW-H";
/** 縦書き指定 & 英数を半角幅で印字. */
private static final String VERTICAL_HW = "UniJIS-UCS2-HW-V";
/** 平成明朝体. */
private static final String MINCHO = "HeiseiMin-W3";
/** 平成角ゴシック体. */
private static final String GOTHIC = "HeiseiKakuGo-W5";
public static void main(String[] args) {
try {
OutputStream out = new FileOutputStream("/tmp/iTextExample.pdf");
// 1. Create Document
//
// Paper Size : A4
// Document Body : (50pt,50pt)-(540pt,792pt)
// (Not include the header and the footer)
//
// cf . 1pt = 1/72.27 inch = 0.3514 mm
// A4 = (210mm x 297mm) = (595pt x 842pt)
//
Document doc = new Document(PageSize.A4, 50, 50, 50, 50);
PdfWriter pdfwriter = PdfWriter.getInstance(doc, out);
// 2. Footer And Header
//
// set box area including header and footer.
Rectangle pageSize = doc.getPageSize();
pdfwriter.setBoxSize(
"art", // cf.http://www.prepressure.com/pdf/basics/page_boxes
new Rectangle(
36, 50,
pageSize.getWidth() - 50,
pageSize.getHeight() - 36));
// print header and fotter each when page end.
pdfwriter.setPageEvent(new PdfPageEventHelper() {
private Font fHeader = new Font(
BaseFont.createFont(GOTHIC, HORIZONTAL, BaseFont.NOT_EMBEDDED),
10, Font.NORMAL);
private Font fPage = new Font(
BaseFont.createFont(GOTHIC, HORIZONTAL, BaseFont.NOT_EMBEDDED),
10, Font.NORMAL);
@Override
public void onEndPage(PdfWriter writer, Document document) {
Rectangle rect = writer.getBoxSize("art");
int pageNumber = writer.getPageNumber();
if ((pageNumber % 2) == 0) {
Phrase header = new Phrase("Southland Shipbuild Guild LTD");
header.setFont(fHeader);
ColumnText.showTextAligned(
writer.getDirectContent(),
Element.ALIGN_RIGHT,
header,
rect.getRight(),
rect.getTop(),
0);
} else {
Phrase header = new Phrase("Southland Shipbuild Guild LTD");
header.setFont(fHeader);
ColumnText.showTextAligned(
writer.getDirectContent(),
Element.ALIGN_LEFT,
header,
rect.getLeft(),
rect.getTop(),
0);
}
Phrase page = new Phrase(String.format("- %d -",
writer.getPageNumber()));
page.setFont(fPage);
ColumnText.showTextAligned(
writer.getDirectContent(),
Element.ALIGN_CENTER,
page,
(rect.getLeft() + rect.getRight()) / 2,
rect.getBottom(),
0);
}
});
// 3. Print Body
doc.open();
// 3.1. Line and Text
// The coordinate syste of PDF is same as math. Not as CG.
// The Left-Bottom side is (0,0). And the Right-Top side is (595,842).
PdfContentByte cb = pdfwriter.getDirectContent();
cb.setLineWidth(2f);
cb.setLineCap(PdfContentByte.LINE_CAP_ROUND);
int y = (int) (doc.getPageSize().getHeight() * 0.66f);
int left = 50;
int right = (int) (doc.getPageSize().getWidth()) - 50;
cb.moveTo(left, y);
cb.lineTo(right, y);
cb.stroke();
cb.beginText();
BaseFont fTitle = BaseFont.createFont(MINCHO, HORIZONTAL,
BaseFont.NOT_EMBEDDED);
cb.setFontAndSize(fTitle, 40);
cb.showTextAligned(PdfContentByte.ALIGN_CENTER, "Quoting Price", (left
+ right) / 2, y, 0);
cb.endText();
// 3.2. Document and Table
doc.newPage();
Font fBody = new Font(
BaseFont.createFont(MINCHO, HORIZONTAL, BaseFont.NOT_EMBEDDED),
10, Font.NORMAL);
Font fRed = new Font(
BaseFont.createFont(MINCHO, HORIZONTAL, BaseFont.NOT_EMBEDDED),
10, Font.UNDERLINE);
fRed.setColor(BaseColor.RED);
doc.add(new Paragraph("Dear Ms. Elizabeth,", fBody));
doc.add(new Paragraph(
"Thank you for requesting a quote for our products. "
+ "We truly believe this quote will offer you the best value. "
+ "The quotation is detailed as below.", fBody));
// Table
PdfPTable table = new PdfPTable(4);
table.setSpacingBefore(20);
table.getDefaultCell().setPadding(5);
table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT);
table.setWidthPercentage(80f);
table.setWidths(new int[]{40, 20, 20, 20});
Font fTblBold = new Font(
BaseFont.createFont(GOTHIC, HORIZONTAL, BaseFont.NOT_EMBEDDED),
10, Font.BOLD);
Font fTblThin = new Font(
BaseFont.createFont(GOTHIC, HORIZONTAL, BaseFont.NOT_EMBEDDED),
10, Font.NORMAL);
for (String tblHeader : new String[]{"Model", "QTY", "Unit Price", "TotalPrice}"}) {
PdfPCell cell = new PdfPCell(new Phrase(tblHeader, fTblBold));
cell.setGrayFill(0.8f);
cell.setHorizontalAlignment(Element.ALIGN_MIDDLE);
table.addCell(cell);
}
for (String[] row : new String[][]{
{"Ship of the line (戦列艦)", "13", "£1,000", "£13,000"},
{"Frigate (フリゲート艦)", "36", "£500", "£18,000"},
{"Auxiliary Sloep (特務艦)", "3", "£750", "£2,250"},}) {
for (int colNum = 0; colNum < row.length; colNum++) {
PdfPCell cell = new PdfPCell(new Phrase(row[colNum], fTblThin));
if (colNum == 0) {
cell.setHorizontalAlignment(Element.ALIGN_LEFT);
} else {
cell.setHorizontalAlignment(Element.ALIGN_RIGHT);
}
table.addCell(cell);
}
}
PdfPCell cellTotalLabel = new PdfPCell(new Phrase("Total", fTblBold));
cellTotalLabel.setGrayFill(0.8f);
cellTotalLabel.setColspan(3);
cellTotalLabel.setHorizontalAlignment(Element.ALIGN_RIGHT);
table.addCell(cellTotalLabel);
PdfPCell cellTotalValue = new PdfPCell(new Phrase("£33,250", fTblBold));
cellTotalValue.setGrayFill(0.8f);
cellTotalValue.setHorizontalAlignment(Element.ALIGN_RIGHT);
table.addCell(cellTotalValue);
doc.add(table);
doc.add(new Paragraph(
"\n"
+ "Payment Terms: Pre-paid\n"
+ "Payment Method: Gold / Government Bond (Need the Fooger Bank Guarantee)\n\n"
+ "The items will be shipped within 3 month after receipt of the payment.", fBody));
doc.add(new Paragraph(
"This quotation will expire on May 31, 1588.", fRed));
doc.add(new Paragraph(
"If you have any questions, please let us know. We look forward to receiving your order.\n"
+ "Thank you.\n\n"
+ "Sincerely,\n\n"
+ "Guilliam Boonen\n"
+ "Sales Manager\n", fBody));
// Document End
doc.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
作成した PDF を javax.print.DocPrinterJob で直接プリンタに送る。たいていのプリンタで使えそうだ。
package com.snail.exam.printexam;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfPageEventHelper;
import com.itextpdf.text.pdf.PdfWriter;
import java.awt.GraphicsConfiguration;
import java.io.ByteArrayOutputStream;
import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.ServiceUI;
import javax.print.SimpleDoc;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.ResolutionSyntax;
import javax.print.attribute.standard.Copies;
import javax.print.attribute.standard.MediaName;
import javax.print.attribute.standard.OrientationRequested;
import javax.print.attribute.standard.PrintQuality;
import javax.print.attribute.standard.PrinterResolution;
/**
* Hello world!
*
*/
public class ITextExam2 {
/** 横書き指定. */
private static final String HORIZONTAL = "UniJIS-UCS2-H";
/** 縦書き指定. */
private static final String VERTICAL = "UniJIS-UCS2-V";
/** 横書き指定 & 英数を半角幅で印字. */
private static final String HORIZONTAL_HW = "UniJIS-UCS2-HW-H";
/** 縦書き指定 & 英数を半角幅で印字. */
private static final String VERTICAL_HW = "UniJIS-UCS2-HW-V";
/** 平成明朝体. */
private static final String MINCHO = "HeiseiMin-W3";
/** 平成角ゴシック体. */
private static final String GOTHIC = "HeiseiKakuGo-W5";
public static void main(String[] args) {
try {
//OutputStream out = new FileOutputStream("/tmp/iTextExample.pdf");
ByteArrayOutputStream out = new ByteArrayOutputStream();
// 1. Create Document
//
// Paper Size : A4
// Document Body : (50pt,50pt)-(540pt,792pt)
// (Not include the header and the footer)
//
// cf . 1pt = 1/72.27 inch = 0.3514 mm
// A4 = (210mm x 297mm) = (595pt x 842pt)
//
Document doc = new Document(PageSize.A4, 50, 50, 50, 50);
PdfWriter pdfwriter = PdfWriter.getInstance(doc, out);
// 2. Footer And Header
//
// set box area including header and footer.
Rectangle pageSize = doc.getPageSize();
pdfwriter.setBoxSize(
"art", // cf.http://www.prepressure.com/pdf/basics/page_boxes
new Rectangle(
36, 50,
pageSize.getWidth() - 50,
pageSize.getHeight() - 36));
// print header and fotter each when page end.
pdfwriter.setPageEvent(new PdfPageEventHelper() {
private Font fHeader = new Font(
BaseFont.createFont(GOTHIC, HORIZONTAL, BaseFont.NOT_EMBEDDED),
10, Font.NORMAL);
private Font fPage = new Font(
BaseFont.createFont(GOTHIC, HORIZONTAL, BaseFont.NOT_EMBEDDED),
10, Font.NORMAL);
@Override
public void onEndPage(PdfWriter writer, Document document) {
Rectangle rect = writer.getBoxSize("art");
int pageNumber = writer.getPageNumber();
if ((pageNumber % 2) == 0) {
Phrase header = new Phrase("Southland Shipbuild Guild LTD");
header.setFont(fHeader);
ColumnText.showTextAligned(
writer.getDirectContent(),
Element.ALIGN_RIGHT,
header,
rect.getRight(),
rect.getTop(),
0);
} else {
Phrase header = new Phrase("Southland Shipbuild Guild LTD");
header.setFont(fHeader);
ColumnText.showTextAligned(
writer.getDirectContent(),
Element.ALIGN_LEFT,
header,
rect.getLeft(),
rect.getTop(),
0);
}
Phrase page = new Phrase(String.format("- %d -",
writer.getPageNumber()));
page.setFont(fPage);
ColumnText.showTextAligned(
writer.getDirectContent(),
Element.ALIGN_CENTER,
page,
(rect.getLeft() + rect.getRight()) / 2,
rect.getBottom(),
0);
}
});
// 3. Print Body
doc.open();
// 3.1. Line and Text
// The coordinate syste of PDF is same as math. Not as CG.
// The Left-Bottom side is (0,0). And the Right-Top side is (595,842).
PdfContentByte cb = pdfwriter.getDirectContent();
cb.setLineWidth(2f);
cb.setLineCap(PdfContentByte.LINE_CAP_ROUND);
int y = (int) (doc.getPageSize().getHeight() * 0.66f);
int left = 50;
int right = (int) (doc.getPageSize().getWidth()) - 50;
cb.moveTo(left, y);
cb.lineTo(right, y);
cb.stroke();
cb.beginText();
BaseFont fTitle = BaseFont.createFont(MINCHO, HORIZONTAL,
BaseFont.NOT_EMBEDDED);
cb.setFontAndSize(fTitle, 40);
cb.showTextAligned(PdfContentByte.ALIGN_CENTER, "Quoting Price", (left
+ right) / 2, y, 0);
cb.endText();
// 3.2. Document and Table
doc.newPage();
Font fBody = new Font(
BaseFont.createFont(MINCHO, HORIZONTAL, BaseFont.NOT_EMBEDDED),
10, Font.NORMAL);
Font fRed = new Font(
BaseFont.createFont(MINCHO, HORIZONTAL, BaseFont.NOT_EMBEDDED),
10, Font.UNDERLINE);
fRed.setColor(BaseColor.RED);
doc.add(new Paragraph("Dear Ms. Elizabeth,", fBody));
doc.add(new Paragraph(
"Thank you for requesting a quote for our products. "
+ "We truly believe this quote will offer you the best value. "
+ "The quotation is detailed as below.", fBody));
// Table
PdfPTable table = new PdfPTable(4);
table.setSpacingBefore(20);
table.getDefaultCell().setPadding(5);
table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT);
table.setWidthPercentage(80f);
table.setWidths(new int[]{40, 20, 20, 20});
Font fTblBold = new Font(
BaseFont.createFont(GOTHIC, HORIZONTAL, BaseFont.NOT_EMBEDDED),
10, Font.BOLD);
Font fTblThin = new Font(
BaseFont.createFont(GOTHIC, HORIZONTAL, BaseFont.NOT_EMBEDDED),
10, Font.NORMAL);
for (String tblHeader : new String[]{"Model", "QTY", "Unit Price", "TotalPrice}"}) {
PdfPCell cell = new PdfPCell(new Phrase(tblHeader, fTblBold));
cell.setGrayFill(0.8f);
cell.setHorizontalAlignment(Element.ALIGN_MIDDLE);
table.addCell(cell);
}
for (String[] row : new String[][]{
{"Ship of the line (戦列艦)", "13", "£1,000", "£13,000"},
{"Frigate (フリゲート艦)", "36", "£500", "£18,000"},
{"Auxiliary Sloep (特務艦)", "3", "£750", "£2,250"},}) {
for (int colNum = 0; colNum < row.length; colNum++) {
PdfPCell cell = new PdfPCell(new Phrase(row[colNum], fTblThin));
if (colNum == 0) {
cell.setHorizontalAlignment(Element.ALIGN_LEFT);
} else {
cell.setHorizontalAlignment(Element.ALIGN_RIGHT);
}
table.addCell(cell);
}
}
PdfPCell cellTotalLabel = new PdfPCell(new Phrase("Total", fTblBold));
cellTotalLabel.setGrayFill(0.8f);
cellTotalLabel.setColspan(3);
cellTotalLabel.setHorizontalAlignment(Element.ALIGN_RIGHT);
table.addCell(cellTotalLabel);
PdfPCell cellTotalValue = new PdfPCell(new Phrase("£33,250", fTblBold));
cellTotalValue.setGrayFill(0.8f);
cellTotalValue.setHorizontalAlignment(Element.ALIGN_RIGHT);
table.addCell(cellTotalValue);
doc.add(table);
doc.add(new Paragraph(
"\n"
+ "Payment Terms: Pre-paid\n"
+ "Payment Method: Gold / Government Bond (Need the Fooger Bank Guarantee)\n\n"
+ "The items will be shipped within 3 month after receipt of the payment.", fBody));
doc.add(new Paragraph(
"This quotation will expire on May 31, 1588.", fRed));
doc.add(new Paragraph(
"If you have any questions, please let us know. We look forward to receiving your order.\n"
+ "Thank you.\n\n"
+ "Sincerely,\n\n"
+ "Guilliam Boonen\n"
+ "Sales Manager\n", fBody));
// Document End
doc.close();
// ドキュメントの形式を設定
DocFlavor myFormat = DocFlavor.BYTE_ARRAY.PDF;
// Docオブジェクトの生成
Doc myDoc = new SimpleDoc(out.toByteArray(), myFormat, null);
// プリンタの検索条件 兼 印刷パラメータを構築 (A4 600x600dpi以上)
// (解像度は印刷時に「最高」を指定し直す)
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
aset.add(new Copies(1));
aset.add(MediaName.ISO_A4_WHITE);
aset.add(OrientationRequested.PORTRAIT);
//aset.add(new PrinterResolution(600, 600, ResolutionSyntax.DPI));
// 属性セットに従って印刷ができるプリンタを発見する
PrintService[] services = PrintServiceLookup.lookupPrintServices(
myFormat, aset);
// 最初に見つかったプリントサービスを使う
if (services.length > 0) {
PrintService ps = ServiceUI.printDialog(null, 50, 50, services, services[0], myFormat, aset);
if (ps == null) {
return; //キャンセルされた場合
}
DocPrintJob job = ps.createPrintJob();
// 最高品位印刷をプリンタに指示
aset.add(PrintQuality.HIGH);
job.print(myDoc, aset);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Document doc = new Document(PageSize.A4.rotate(), 50, 50, 50,50);
final BaseFont bf = BaseFont.createFont("ipag.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); bf.setForceWidthsOutput(true); Font fBody = new Font(bf, 10.0f);
Chunk chunk = new Chunk("ここテストでる!); chunk.setUnderline(1f, -2f); chunk.setFont(fRed); phrase.add(chunk);
// 改行幅 10pt 指定で PDF に出力 (未指定時はフォントサイズの1.5倍) doc.add(new Paragraph(10.0f, sb.toString(), fBody));