Image image = Image.getInstance(IMG);
image.scaleAbsolute(12, 12);
image.setScaleToFitHeight(false);
List list = new List();
list.setListSymbol(new Chunk(Image.getInstance(image), 0, 0));
list.add("Hello World");
list.add("This is a list item with a lot of text. It will certainly take more than one line. This shows that the list item is indented and that the image is used as bullet.");
list.add("This is a test");
document.add(list);
Image img = createBarcode(1, 1, pdfDoc);
doc.add(new Paragraph(String.format("This barcode measures %s by %s user units",
img.getImageScaledWidth(), img.getImageScaledHeight())));
doc.add(img);
img = createBarcode(3, 3, pdfDoc);
doc.add(new Paragraph(String.format("This barcode measures %s by %s user units",
img.getImageScaledWidth(), img.getImageScaledHeight())));
doc.add(img);
img = createBarcode(3, 1, pdfDoc);
doc.add(new Paragraph(String.format("This barcode measures %s by %s user units",
img.getImageScaledWidth(), img.getImageScaledHeight())));
doc.add(img);
Image
не должен вас запутать. Если вы посмотрите на метод createBarcode(),
то увидите, что Image
в действительности является векторным изображением:public Image createBarcode(float mw, float mh, PdfDocument pdfDoc) {
BarcodePDF417 barcode = new BarcodePDF417();
barcode.setCode("BarcodePDF417 barcode");
return new Image(barcode.createFormXObject(Color.BLACK, pdfDoc)).scale(mw, mh);
}
scale()
, определяют высоту и ширину маленьких прямоугольников. Во внутренней части штрихкода, можно увидеть следующее:0 21 3 1 re
Rectangle size = barcode.getBarcodeSize();
float width = mw * size.getWidth();
float height = mh * size.getHeight();
mw
и mh
равняются 1
.PdfFormXObject
и переношу его в Image
. Затем я могу добавить Image
к документу, как и любое другое изображение. Основное отличие этого изображения от обычных заключается в том, что оно векторное. Image
к экземпляру Document
. В этом нет ничего плохого, но если вы хотите сделать изображение прозрачным, нужно создать мягкую маску. Это нетрудно, но есть и более простой способ сделать фон прозрачным: добавьте изображение прямо к содержимому, а затем определите прозрачность с помощью PdfExtGState
:PdfCanvas canvas = new PdfCanvas(pdfDoc.addNewPage());
ImageData image = ImageDataFactory.create(imgSrc);
canvas.saveState();
PdfExtGState state = new PdfExtGState();
state.setFillOpacity(0.6f);
canvas.setExtGState(state);
canvas.addImage(image, 0, 0, pageSize.getWidth(), false);
PdfCanvas canvas = new PdfCanvas(pdfDoc.getFirstPage());
canvas.setStrokeColor(Color.RED)
.setLineWidth(3)
.moveTo(220, 330)
.lineTo(240, 370)
.arc(200, 350, 240, 390, 0, (float) 180)
.lineTo(220, 330)
.closePathStroke()
.setFillColor(Color.RED)
.circle(220, 370, 10)
.fill();
Rectangle rect = new Rectangle(220, 350, 255, 245);
PdfLineAnnotation lineAnnotation = new PdfLineAnnotation(rect, new float[]{225, 355, 470, 590});
lineAnnotation.setTitle(new PdfString("You are here:"));
lineAnnotation.setContents("Cambridge Innovation Center");
lineAnnotation.setColor(Color.RED);
lineAnnotation.setFlag(PdfAnnotation.PRINT);
PdfDictionary borderStyle = new PdfDictionary();
borderStyle.put(PdfName.S, PdfName.S);
borderStyle.put(PdfName.W, new PdfNumber(5));
lineAnnotation.setBorderStyle(borderStyle);
PdfArray le = new PdfArray();
le.add(new PdfName("OpenArrow"));
le.add(new PdfName("None"));
lineAnnotation.put(new PdfName("LE"), le);
lineAnnotation.put(new PdfName("IT"), new PdfName("LineArrow"));
pdfDoc.getFirstPage().addAnnotation(lineAnnotation);
FontProgramFactory (FontFactory
в iText 5) знает только шрифты типа 1, а шрифт "garamond bold"
не входит в этот список, поэтому используется Helvetica (Helvetica — шрифт по умолчанию в iText).FontProgramFactory
, как находить другие шрифты, зарегистрировав их. Можно попробовать следующее:FontProgramFactory.registerSystemFontDirectories();
C:/Windows/Fonts
). Это может занять несколько секунд, и на выходе получится намного больше шрифтов, чем необходимо (возможно, что нужный шрифт так и не будет зарегистрирован).FontProgramFactory.registerFont("c:/windows/fonts/garabd.ttf", "garamond bold");
"c:/windows/fonts/garabd.ttf"
) и определяем псевдоним для нужного шрифта («garamond bold»). Теперь, когда название шрифта зарегистрировано, его можно использовать:PdfFont myBoldFont = PdfFontFactory.createRegisteredFont("garamond bold");
PdfFont
только для одного документа. Как только вы используете экземпляр PdfFont
в документе, он привязывается к нему, и вы больше не можете использовать его в другом документе.class ThisGoesWrong {
protected PdfFont font;
public ThisGoesWrong() {
font = PdfFontFactory.createFont(...);
}
public void createPdf() {
...
Paragraph p = new Paragraph("test").setFont(font);
document.add(p);
...
}
}
ThisGoesWrong
создает правильный PDF при первом вызове createPdf()
, но показывает exception как у вас, когда вы вызываете его повторно. class ThisWorksOK {
public ThisWorksOK() {
}
public void createPdf() {
...
PdfFont font = PdfFontFactory.createFont(...);
Paragraph p = new Paragraph("test").setFont(font);
document.add(p);
...
}
}
Style
объекты и т.д.PdfFont font = PdfFontFactory.createFont(FontConstants.TIMES_ROMAN);
normal.setFont(font).setFontSize(14);
Style code = new Style();
PdfFont monospace = PdfFontFactory.createFont(FontConstants.COURIER);
code.setFont(monospace).setFontColor(Color.RED)
.setBackgroundColor(Color.LIGHT_GRAY);
Paragraph p = new Paragraph();
p.add(new Text("The Strange Case of ").addStyle(normal));
p.add(new Text("Dr. Jekyll").addStyle(code));
p.add(new Text(" and ").addStyle(normal));
p.add(new Text("Mr. Hyde").addStyle(code));
p.add(new Text(".").addStyle(normal));
document.add(p);
Style
, назовем его normal
и укажем для него шрифт Times-Roman размером в 14pt. После этого мы определим Style
, который назовем code
и зададим ему шрифт красного цвета Courier, размером в 12pt с серым фоном. После этого мы создадим Paragraph
, с помощью Text
объектов, которые задействуют эти стили.add()
комментарии, как это сделано в следующем примере: Text title1 = new Text("The Strange Case of ").setFontSize(12);
Text title2 = new Text("Dr. Jekyll and Mr. Hyde").setFontSize(16);
Text author = new Text("Robert Louis Stevenson");
Paragraph p = new Paragraph().setFontSize(8)
.add(title1).add(title2).add(" by ").add(author);
document.add(p);
Paragraph
в 8pt. Этот размер шрифта будет наследоваться всеми объектами, добавленными в Paragraph
, если только объекты не переопределяют этот размер по умолчанию. Это относится к title1
, для которого мы определили размер шрифта в 12pt и для title2
, для которого мы определили размер шрифта в 16pt. Содержимое, добавленное как String
(" by "
), и содержимое, добавленное как Text
объект, для которого не был определен размер шрифта, наследует размер шрифта в 8pt из Paragraph
, в который они добавлены.»