Java 如何使用 PDFBox 将文本居中
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/6507124/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to center a text using PDFBox
提问by SteeveDroz
My question is very simple: how can I center a text on a PDF, using PDFBox
?
我的问题很简单:如何使用PDFBox
?
I don't know the string in advance, I can't find the middle by trial. The string doesn't always have the same width.
我事先不知道字符串,我无法通过试用找到中间。字符串并不总是具有相同的宽度。
I need either:
我需要:
- A method that can center the text, something like
addCenteredString(myString)
- A method that can give me the width of the string in pixels. I can then calculate the center, for I know the dimensions of the PDF.
- 一种可以使文本居中的方法,例如
addCenteredString(myString)
- 一种可以为我提供以像素为单位的字符串宽度的方法。然后我可以计算中心,因为我知道 PDF 的尺寸。
Any help is welcome!
欢迎任何帮助!
采纳答案by SteeveDroz
Ok, I found the answer myself. Here is how to center some text on a page:
好的,我自己找到了答案。以下是在页面上居中某些文本的方法:
String title = "This is my wonderful title!"; // Or whatever title you want.
int marginTop = 30; // Or whatever margin you want.
PDDocument document = new PDDocument();
PDPage page = new PDPage()
PDPageStreamContent stream = new PDPageContentStream(document, page);
PDFont font = PDType1Font.HELVETICA_BOLD; // Or whatever font you want.
int fontSize = 16; // Or whatever font size you want.
float titleWidth = font.getStringWidth(title) / 1000 * fontSize;
float titleHeight = font.getFontDescriptor().getFontBoundingBox().getHeight() / 1000 * fontSize;
stream.beginText();
stream.setFont(font, fontSize);
stream.moveTextPositionByAmount((page.getMediaBox().getWidth() - titleWidth) / 2, page.getMediaBox().getHeight() - marginTop - titleheight);
stream.drawString(title);
stream.endText();
stream.close();
回答by Matthias Braun
This adds centered text to pages in portrait as well as landscape format:
这会为纵向和横向格式的页面添加居中文本:
void addCenteredText(String text, PDFont font, int fontSize, PDPageContentStream content, PDPage page, Point2D.Float offset) throws IOException {
content.setFont(font, fontSize);
content.beginText();
// Rotate the text according to the page orientation
boolean pageIsLandscape = isLandscape(page);
Point2D.Float pageCenter = getCenter(page);
// We use the text's width to place it at the center of the page
float stringWidth = getStringWidth(text, font, fontSize);
if (pageIsLandscape) {
float textX = pageCenter.x - stringWidth / 2F + offset.x;
float textY = pageCenter.y - offset.y;
// Swap X and Y due to the rotation
content.setTextMatrix(Matrix.getRotateInstance(Math.PI / 2, textY, textX));
} else {
float textX = pageCenter.x - stringWidth / 2F + offset.x;
float textY = pageCenter.y + offset.y;
content.setTextMatrix(Matrix.getTranslateInstance(textX, textY));
}
content.showText(text);
content.endText();
}
boolean isLandscape(PDPage page) {
int rotation = page.getRotation();
final boolean isLandscape;
if (rotation == 90 || rotation == 270) {
isLandscape = true;
} else if (rotation == 0 || rotation == 360 || rotation == 180) {
isLandscape = false;
} else {
LOG.warn("Can only handle pages that are rotated in 90 degree steps. This page is rotated {} degrees. Will treat the page as in portrait format", rotation);
isLandscape = false;
}
return isLandscape;
}
Point2D.Float getCenter(PDPage page) {
PDRectangle pageSize = page.getMediaBox();
boolean rotated = isLandscape(page);
float pageWidth = rotated ? pageSize.getHeight() : pageSize.getWidth();
float pageHeight = rotated ? pageSize.getWidth() : pageSize.getHeight();
return new Point2D.Float(pageWidth / 2F, pageHeight / 2F);
}
float getStringWidth(String text, PDFont font, int fontSize) throws IOException {
return font.getStringWidth(text) * fontSize / 1000F;
}
This is how you create a PDF with centered text on a rotated page:
这是在旋转页面上创建带有居中文本的 PDF 的方法:
PDDocument pdf = new PDDocument();
// A5 page in landscape format
PDPage page = new PDPage(PDRectangle.A5);
page.setRotation(90);
pdf.addPage(page);
try (PDPageContentStream content = new PDPageContentStream(pdf, page)) {
int fontSize = 36;
// Put the text at the page's center, no offset
Point2D.Float center = new Point2D.Float(0, 0);
addCenteredText("PDFBox", PDType1Font.HELVETICA_BOLD, fontSize, content, page, center);
// Put the text centered at the lower end of the page
Point2D.Float lowerCenter = new Point2D.Float(0, -165);
addCenteredText("Hi there!", PDType1Font.HELVETICA, fontSize, content, page, lowerCenter);
} catch (IOException e) {
LOG.warn("Exception while creating content", e);
}
The resulting PDF:
生成的PDF:
I used PDFBox 2.0.0-RC2 for creating this PDF.
我使用 PDFBox 2.0.0-RC2 来创建这个 PDF。