文档左下角为坐标原点,x轴向右从0增加,y轴向上增加
以起始位置至终点一条线,线宽以垂直于起始至终止连线方向发散,例如线宽20,起始位置(0,10),终止位置(500,10)则线实际所占位置为(0,0),(0,20),(500,0),(500,20)所围成的长方形区域
图位置以左下角为原点向右上方发散
字的位置以左下角为原点向右上方发散
// 横线
contentStream.moveTo(0, 10);
contentStream.lineTo(540, 10);
contentStream.stroke();
// 竖线
contentStream.moveTo(10, 0);
contentStream.lineTo(10, 540);
contentStream.stroke();
// 斜线
contentStream.moveTo(0, 0);
contentStream.lineTo(540, 540);
contentStream.stroke();
// 图片
final byte[] imageByte = IOUtils.toByteArray(Objects.requireNonNull(DrawTableUtils.class.getClassLoader().getResourceAsStream("yellow.png")));
final PDImageXObject image = PDImageXObject.createFromByteArray(document, imageByte, "yellow.png");
contentStream.drawImage(image, 20, 0, 50, 50);
// 文字
contentStream.beginText();
contentStream.setFont(PDType1Font.HELVETICA_BOLD, 10);
contentStream.newLineAtOffset(0, 10);
String text = "This is the sample document and we are adding content to it.";
contentStream.showText(text);
contentStream.endText();
5、字体加载
1、ttf类型字体加载
InputStream inFont = DrawTableUtils.class.getClassLoader().getResourceAsStream(fontName);
PDType0Font normalFont = PDType0Font.load(document, inFont);
PDType0Font boldFont = null;
2.otf类型字体加载
InputStream normalStream = DrawTableUtils.class.getClassLoader().getResourceAsStream(fontName);
assert normalStream != null;
OpenTypeFont normalOtfFont = new OTFParser(false, true).parse(normalStream);
PDType0Font normalFont = PDType0Font.load(document, normalOtfFont, false);
6、jfreechart图表转字节数组
JFreeChart chart = new JFreeChart(title, xyplot);
// 图例字体清晰
chart.setTextAntiAlias(true);
chart.setBackgroundPaint(Color.WHITE);
TextTitle textTitle = chart.getTitle();
textTitle.setFont(new Font("黑体", Font.PLAIN, 20));
BufferedImage bufferedImage = chart.createBufferedImage(600, 300);
byte[] bytes = ChartUtilities.encodeAsPNG(bufferedImage);
二、PDFbox样式
1、文字颜色
Color color = new Color(255,0,0);
contentStream.setNonStrokingColor(color);
2、线颜色
Color color = new Color(255, 0, 0);
contentStream.setStrokingColor(color);
3、线样式
float[] a={3,5};
contentStream.setLineDashPattern(a, 0);
contentStream.moveTo(0, 20);
contentStream.lineTo(540, 20);
contentStream.stroke();
contentStream.setLineDashPattern(a, 20);
contentStream.moveTo(0, 50);
contentStream.lineTo(540, 50);
contentStream.stroke();
float[] b={3};
contentStream.setLineDashPattern(b, 20);
contentStream.moveTo(0, 80);
contentStream.lineTo(540, 80);
contentStream.stroke();
contentStream.setLineDashPattern(a, 0);
第一个参数 a={3,5} 3表明虚线宽度为3,5表明虚线间隔为5 。当a={3}时表明虚线宽度为3,间隔为3
第二个参数0表明虚线偏移量
三、工具类
public enum BorderStyle {
SOLID(new float[]{}, 0),
DOTTED(new float[]{1}, 1),
DASHED(new float[]{5,2}, 1);
private final float[] pattern;
private final int phase;
BorderStyle(float[] pattern, int phase) {
this.pattern = pattern;
this.phase = phase;
public float[] getPattern() {
return pattern;
public int getPhase() {
return phase;
public enum HorizontalAlignment {
LEFT, CENTER, RIGHT
@Data
public class PdfTable {
private List<PdfRow> rows;
private String font;
public void addRow(PdfRow row){
rows.add(row);
@Data
@Builder
public class PdfRow {
private List<PdfColumn> pdfColumns;
private float height;
* 边框样式,仅下边框生效
private BorderStyle borderStyle;
* 边框颜色
@Builder.Default
private Color boderColor=Color.BLACK;
* 下边框是否生效
private boolean downBorder;
public void addColumn(PdfColumn pdfColumn){
pdfColumns.add(pdfColumn);
@Data
@Builder
public class PdfColumn {
* 背景颜色
@Builder.Default
private Color backGround = Color.WHITE;
* 边框颜色
@Builder.Default
private Color borderColor = Color.BLACK;
* 文字颜色
@Builder.Default
private Color textColor= Color.BLACK;
@Builder.Default
private boolean block=false;
* 文字大小
@Builder.Default
private float fontSize=10F;
@Builder.Default
private float offset=0F;
* 文字位置
@Builder.Default
private HorizontalAlignment align =HorizontalAlignment.CENTER;
* 自动宽度
@Builder.Default
private boolean autoWidth=false;
* 自动换行
@Builder.Default
private boolean autoWidth=false;
* 左边框
private boolean leftBorder;
* 右边框
private boolean rightBorder;
private String name;
* 宽度,仅在自动宽度未生效时启用
private float width;
* 图片,图片生效时其他属性均不生效
private PdfColumnImage columnImage;
@Data
@Builder
public class PdfColumnImage {
* 图片名称/路径
private String image;
* x轴位置
private float x;
* y轴位置
private float y;
* 图片宽度
private float width;
* 图片高度
private float height;
pdf工具类
public class DrawTableUtils {
* 页边距
private static final float PADDING = 30;
* 下表格线偏移
private static final float DOWN_LINE_PADDING = 0.5f;
* 边框宽度
private static final float BORDER_WIDTH = 1;
* 生成PDF
* @param table pdf数据
* @throws IOException
public static void createDocument(PdfTable table) throws IOException {
// 初始化文档
PDDocument document = new PDDocument();
final PDPage page = new PDPage(PDRectangle.A4);
document.addPage(page);
// 字体
String fontName = table.getFont();
InputStream inFont = org.bmc.DrawTableUtils.class.getClassLoader().getResourceAsStream(fontName);
PDType0Font font = PDType0Font.load(document, inFont);
int pageNum = 1;
// 初始化文档位置
org.bmc.DrawTableUtils.Position position = new org.bmc.DrawTableUtils.Position(PADDING, page.getMediaBox().getHeight() - PADDING, 0);
PDPageContentStream contentStream = new PDPageContentStream(document, page);
for (PdfRow row : table.getRows()) {
// 分页
if (position.startY <= PADDING * 2) {
pageNum++;
PDPage pdPage = new PDPage(PDRectangle.A4);
document.addPage(pdPage);
position.startY = page.getMediaBox().getHeight() - PADDING;
contentStream.close();
contentStream = new PDPageContentStream(document, pdPage);
drawLine(row, document, contentStream, position, font);
if (row.isDownBorder()) {
drawDrownBorder(contentStream, page, row, position);
contentStream.close();
// 页脚
drawPageFoot(document, pageNum, font);
// 保存文档
document.save("D:/mypdf.pdf");
document.close();
* 生成表格下框,以行为单位
* @param contentStream 流
* @param page 页
* @param row 行
* @param position 位置
* @throws IOException
private static void drawDrownBorder(PDPageContentStream contentStream, PDPage page, PdfRow row, org.bmc.DrawTableUtils.Position position) throws IOException {
contentStream.setStrokingColor(row.getBoderColor());
contentStream.setLineWidth(BORDER_WIDTH);
contentStream.setLineDashPattern(row.getBorderStyle().getPattern(), row.getBorderStyle().getPhase());
contentStream.moveTo(PADDING, position.startY + position.titleHeight / 4 - row.getHeight() / 2 + DOWN_LINE_PADDING);
contentStream.lineTo(page.getMediaBox().getWidth() - PADDING, position.startY + position.titleHeight / 4 - row.getHeight() / 2 + DOWN_LINE_PADDING);
contentStream.stroke();
* 生成一行中每一列数据
* @param row 行
* @param document 文档
* @param contentStream 流
* @param position 位置
* @param font 字体
* @throws IOException
public static void drawLine(PdfRow row, PDDocument document, PDPageContentStream contentStream, org.bmc.DrawTableUtils.Position position, PDType0Font font) throws IOException {
// 更新Y轴位置
position.startY -= row.getHeight();
for (PdfColumn column : row.getPdfColumns()) {
// 添加图片
if (column.getColumnImage() != null) {
PdfColumnImage columnImage = column.getColumnImage();
final byte[] imageByte = IOUtils.toByteArray(Objects.requireNonNull(org.bmc.DrawTableUtils.class.getClassLoader().getResourceAsStream(columnImage.getImage())));
final PDImageXObject image = PDImageXObject.createFromByteArray(document, imageByte, columnImage.getImage());
contentStream.drawImage(image, columnImage.getX(), columnImage.getY(), columnImage.getWidth(), columnImage.getHeight());
} else {
// 背景
if (column.getBackGround() != Color.WHITE) {
// 文字高度
position.titleHeight = font.getFontDescriptor().getFontBoundingBox().getHeight() / 1000 * column.getFontSize();
// 背景高度,取行高
contentStream.setLineWidth(row.getHeight());
contentStream.setStrokingColor(column.getBackGround());
// 实线无间隔
contentStream.setLineDashPattern(BorderStyle.SOLID.getPattern(), BorderStyle.SOLID.getPhase());
// 设置Y轴起始位置,文字在背景色中间
contentStream.moveTo(position.startX + column.getOffset(), position.startY + position.titleHeight / 4);
contentStream.lineTo(position.startX + column.getOffset() + column.getWidth(), position.startY + position.titleHeight / 4);
contentStream.stroke();
// 左边框
if (column.isLeftBorder()) {
position.titleHeight = font.getFontDescriptor().getFontBoundingBox().getHeight() / 1000 * column.getFontSize();
// 设置宽度
contentStream.setLineWidth(BORDER_WIDTH);
contentStream.setStrokingColor(column.getBorderColor());
// 实线无间隔
contentStream.setLineDashPattern(BorderStyle.SOLID.getPattern(), BorderStyle.SOLID.getPhase());
// 设置左边框位置,与背景色对齐
contentStream.moveTo(position.startX + column.getOffset(), position.startY + position.titleHeight / 4 - row.getHeight() / 2);
contentStream.lineTo(position.startX + column.getOffset(), position.startY + position.titleHeight / 4 + row.getHeight() / 2);
contentStream.stroke();
// 右边框
if (column.isRightBorder()) {
position.titleHeight = font.getFontDescriptor().getFontBoundingBox().getHeight() / 1000 * column.getFontSize();
// 设置宽度
contentStream.setLineWidth(BORDER_WIDTH);
contentStream.setStrokingColor(column.getBorderColor());
// 实线无间隔
contentStream.setLineDashPattern(BorderStyle.SOLID.getPattern(), BorderStyle.SOLID.getPhase());
// 设置左边框位置,与背景色对齐
contentStream.moveTo(position.startX + column.getOffset() + column.getWidth(), position.startY + position.titleHeight / 4 - row.getHeight() / 2);
contentStream.lineTo(position.startX + column.getOffset() + column.getWidth(), position.startY + position.titleHeight / 4 + row.getHeight() / 2);
contentStream.stroke();
float titleWidth = font.getStringWidth(column.getName() == null ? "" : column.getName()) / 1000 * column.getFontSize();
// 自动换行
if (column.isAutoLine()) {
if (titleWidth > column.getWidth()) {
// 切分行数
int ceil = (int) Math.ceil(titleWidth / column.getWidth());
int currentCel = ceil;
float hi = row.getHeight() / ceil;
String[] split = column.getName().split(" ");
StringBuilder builder = new StringBuilder();
float len = 0;
for (int i = 0; i < split.length; i++) {
len += font.getStringWidth(split[i] + " ") / 1000 * column.getFontSize();
builder.append(split[i]).append(" ");
if ((i == split.length - 1 && len > 0) || len + font.getStringWidth(split[i + 1]) / 1000 * column.getFontSize() >= column.getWidth()) {
// 写入分行数据
org.bmc.DrawTableUtils.Position aPosition = new org.bmc.DrawTableUtils.Position(position.startX, position.startY + hi * (currentCel - 1) - position.getTitleHeight() / 4, position.getTitleHeight());
PdfColumn aColumn = PdfColumn.builder().align(column.getAlign()).fontSize(column.getFontSize() / ceil * 1.8f).name(builder.toString()).width(column.getWidth()).offset(column.getOffset()).block(column.isBlock()).build();
float pWidth = font.getStringWidth(aColumn.getName() == null ? "" : aColumn.getName()) / 1000 * aColumn.getFontSize();
drawMuLine(contentStream, aPosition, aColumn, pWidth, font);
currentCel--;
builder.setLength(0);
len = 0;
} else {
// 自动宽度
if (column.isAutoWidth()){
column.setWidth(titleWidth);
drawMuLine(contentStream, position, column, titleWidth, font);
// 更新X轴位置
position.startX = position.startX + column.getWidth() + column.getOffset();
position.startX = PADDING;
private static void drawMuLine(PDPageContentStream contentStream, org.bmc.DrawTableUtils.Position position, PdfColumn column, float titleWidth, PDType0Font normalFont) throws IOException {
// 文字
contentStream.beginText();
contentStream.setFont(normalFont, column.getFontSize());
contentStream.setNonStrokingColor(column.getTextColor());
HorizontalAlignment align = column.getAlign();
if (align == HorizontalAlignment.CENTER) {
// 居中
contentStream.newLineAtOffset((column.getWidth() - titleWidth) / 2 + position.startX + column.getOffset(), position.startY);
} else if (align == HorizontalAlignment.LEFT) {
// 居左
contentStream.newLineAtOffset(position.startX + column.getOffset(), position.startY);
} else if (align == HorizontalAlignment.RIGHT) {
// 居右
contentStream.newLineAtOffset(position.startX + column.getOffset() + column.getWidth() - titleWidth, position.startY);
contentStream.showText(column.getName() == null ? "" : column.getName());
contentStream.endText();
// 加粗使用偏移方法
if (column.isBlock()) {
drawBlockText(contentStream, position, column, titleWidth);
private static void drawBlockText(PDPageContentStream contentStream, org.bmc.DrawTableUtils.Position position, PdfColumn pdfColumn, float titleWidth) throws IOException {
float offset = pdfColumn.getFontSize() / 50;
float x=0;
float y=0;
if (pdfColumn.getAlign() == HorizontalAlignment.CENTER) {
// 居中
x=(pdfColumn.getWidth() - titleWidth) / 2 + position.startX + pdfColumn.getOffset();
y=position.startY;
} else if (pdfColumn.getAlign() == HorizontalAlignment.LEFT) {
// 居左
x=position.startX + pdfColumn.getOffset();
y= position.startY;
} else if (pdfColumn.getAlign() == HorizontalAlignment.RIGHT) {
// 居右
x=position.startX + pdfColumn.getOffset() + pdfColumn.getWidth() - titleWidth;
y=position.startY;
offset=-offset;
// 水平
contentStream.beginText();
contentStream.newLineAtOffset(x+offset, y);
contentStream.showText(pdfColumn.getName() == null ? "" : pdfColumn.getName());
contentStream.endText();
// 水平上
contentStream.beginText();
contentStream.newLineAtOffset(x+offset, y+Math.abs(offset));
contentStream.showText(pdfColumn.getName() == null ? "" : pdfColumn.getName());
contentStream.endText();
// 垂直
contentStream.beginText();
contentStream.newLineAtOffset(x, y+Math.abs(offset));
contentStream.showText(pdfColumn.getName() == null ? "" : pdfColumn.getName());
contentStream.endText();
* @param document 文档
* @param pageNum 文档页数
* @param font 字体
* @throws IOException
private static void drawPageFoot(PDDocument document, int pageNum, PDType0Font font) throws IOException {
String text = "xxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxx ";
for (int i = 0; i < pageNum; i++) {
PDPage page = document.getPage(i);
PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND,true);
contentStream.beginText();
contentStream.setFont(font, 10);
contentStream.setNonStrokingColor(Color.GRAY);
contentStream.newLineAtOffset(50, 30);
contentStream.showText(text + (i + 1) + "/" + pageNum);
contentStream.endText();
contentStream.close();
@Data
@AllArgsConstructor
static class Position {
float startX;
float startY;
float titleHeight;
public class Main {
public static void main(String[] args) throws IOException {
PdfTable table = new PdfTable();
table.setRows(new ArrayList<>());
table.setFont("xxx.xx");
Color titleColor = new Color(3, 110, 184);
Color backGray = new Color(242, 242, 242);
PdfRow row = PdfRow.builder()
.height(0)
.pdfColumns(new ArrayList<>())
.build();
row.addColumn(PdfColumn.builder().columnImage(PdfColumnImage
.builder()
.image("yellow.png")
.x(454)
.y(754)
.width(102.5F)
.height(73.75F)
.build())
.build());
table.addRow(row);
PdfRow row1 = PdfRow.builder().height(30).pdfColumns(new ArrayList<>()).build();
row1.addColumn(PdfColumn.builder().name("XXXXX").width(300).fontSize(20).offset(97.5F).block(true).build());
table.addRow(row1);
PdfRow row2 = PdfRow.builder().height(30).pdfColumns(new ArrayList<>()).build();
row2.addColumn(PdfColumn.builder().name("XXX:").width(72).textColor(titleColor).autoWidth(true).block(true).align(HorizontalAlignment.LEFT).build());
row2.addColumn(PdfColumn.builder().name("XXXXX").align(HorizontalAlignment.LEFT).build());
table.addRow(row2);
PdfRow row3 = PdfRow.builder().height(30).pdfColumns(new ArrayList<>()).build();
row3.addColumn(PdfColumn.builder().name("AAAAAAAAAAAAAA").textColor(titleColor).block(true).align(HorizontalAlignment.LEFT).build());
table.addRow(row3);
PdfRow row4 = PdfRow.builder().height(18).pdfColumns(new ArrayList<>()).build();
row4.addColumn(PdfColumn.builder().name("AAAAAAAA").align(HorizontalAlignment.LEFT).width(99).build());
row4.addColumn(PdfColumn.builder().name("XXXXXXXX").align(HorizontalAlignment.LEFT).width(99).build());
row4.addColumn(PdfColumn.builder().name("XXXXXXXXXX").align(HorizontalAlignment.LEFT).width(99).build());
row4.addColumn(PdfColumn.builder().name("XXXXXXXXX").align(HorizontalAlignment.LEFT).width(99).build());
row4.addColumn(PdfColumn.builder().name("XXXXXXXXXX").align(HorizontalAlignment.LEFT).width(99).build());
table.addRow(row4);
PdfRow row5 = PdfRow.builder().height(18).pdfColumns(new ArrayList<>()).build();
row5.addColumn(PdfColumn.builder().name("XXXXXXXXXXXXXXXXXXXXX").align(HorizontalAlignment.LEFT).build());
table.addRow(row5);
PdfRow row6 = PdfRow.builder().height(30).pdfColumns(new ArrayList<>()).build();
row6.addColumn(PdfColumn.builder().name("XXXXXXXXXXXXXXXXXXX").textColor(titleColor).block(true).align(HorizontalAlignment.LEFT).build());
table.addRow(row6);
PdfRow row7 = PdfRow.builder().height(18).pdfColumns(new ArrayList<>()).build();
row7.addColumn(PdfColumn.builder().name("XXXXXXXXXXXXXXX").width(154).align(HorizontalAlignment.LEFT).build());
row7.addColumn(PdfColumn.builder().name("XXXXXXXXXXXXXXXXXXXXXXXXX").width(154).align(HorizontalAlignment.LEFT).build());
table.addRow(row7);
PdfRow row8 = PdfRow.builder().height(30).pdfColumns(new ArrayList<>()).build();
row8.addColumn(PdfColumn.builder().name("XXXXXXXXXXXXXXX").textColor(titleColor).block(true).align(HorizontalAlignment.LEFT).build());
table.addRow(row8);
PdfRow row10 = PdfRow.builder().height(18).pdfColumns(new ArrayList<>()).build();
row10.addColumn(PdfColumn.builder().name("XXXXXXXX").block(true).align(HorizontalAlignment.LEFT).build());
table.addRow(row10);
PdfRow row11 = PdfRow.builder().height(18).pdfColumns(new ArrayList<>()).build();
row11.addColumn(PdfColumn.builder().name("XXXXXXXXXX").width(100).align(HorizontalAlignment.LEFT).build());
row11.addColumn(PdfColumn.builder().name("XXXXXXXXXXX").width(100).align(HorizontalAlignment.LEFT).build());
table.addRow(row11);
PdfRow row12 = PdfRow.builder().height(18).pdfColumns(new ArrayList<>()).build();
row12.addColumn(PdfColumn.builder().name("XXXXXXXXXXXX").width(100).align(HorizontalAlignment.LEFT).build());
row12.addColumn(PdfColumn.builder().name("XXXXXXX").width(100).align(HorizontalAlignment.LEFT).build());
row12.addColumn(PdfColumn.builder().name("XXXXXXX").width(100).align(HorizontalAlignment.LEFT).build());
row12.addColumn(PdfColumn.builder().name("XXXXX").width(100).align(HorizontalAlignment.LEFT).build());
table.addRow(row12);
table.addRow(row12);
table.addRow(row12);
table.addRow(row12);
table.addRow(row12);
table.addRow(row12);
table.addRow(row12);
table.addRow(row12);
table.addRow(row12);
table.addRow(row12);
table.addRow(row12);
table.addRow(row12);
table.addRow(row12);
table.addRow(row12);
PdfRow row20 = PdfRow.builder().height(30).pdfColumns(new ArrayList<>()).build();
row20.addColumn(PdfColumn.builder().name("xxxxxxxxxxxxx").textColor(titleColor).block(true).align(HorizontalAlignment.LEFT).build());
table.addRow(row20);
PdfRow row21 = PdfRow.builder().height(18).pdfColumns(new ArrayList<>()).build();
row21.addColumn(PdfColumn.builder().name("xxxx").block(true).offset(200).width(48).align(HorizontalAlignment.CENTER).backGround(backGray).build());
row21.addColumn(PdfColumn.builder().name("xxxx").block(true).width(48).align(HorizontalAlignment.CENTER).build());
row21.addColumn(PdfColumn.builder().name("xxxx").block(true).width(48).align(HorizontalAlignment.CENTER).backGround(backGray).build());
row21.addColumn(PdfColumn.builder().name("xxxx").block(true).width(48).align(HorizontalAlignment.CENTER).build());
row21.addColumn(PdfColumn.builder().name("xxxx").block(true).width(48).align(HorizontalAlignment.CENTER).backGround(backGray).build());
row21.addColumn(PdfColumn.builder().name("xxxx").block(true).width(48).align(HorizontalAlignment.CENTER).build());
row21.addColumn(PdfColumn.builder().name("xxxx").block(true).width(48).align(HorizontalAlignment.CENTER).backGround(backGray).build());
table.addRow(row21);
PdfRow row22 = PdfRow.builder().downBorder(true).borderStyle(BorderStyle.SOLID).height(18).pdfColumns(new ArrayList<>()).build();
row22.addColumn(PdfColumn.builder().name("xxx").block(true).offset(200).width(48).align(HorizontalAlignment.CENTER).backGround(backGray).build());
row22.addColumn(PdfColumn.builder().name("xxx").block(true).width(48).align(HorizontalAlignment.CENTER).build());
row22.addColumn(PdfColumn.builder().name("xxxxx").block(true).width(48).align(HorizontalAlignment.CENTER).backGround(backGray).build());
row22.addColumn(PdfColumn.builder().name("xxxxx").block(true).width(48).align(HorizontalAlignment.CENTER).build());
row22.addColumn(PdfColumn.builder().name("xxxxx").block(true).width(48).align(HorizontalAlignment.CENTER).backGround(backGray).build());
row22.addColumn(PdfColumn.builder().name("xxxxx").block(true).width(48).align(HorizontalAlignment.CENTER).build());
row22.addColumn(PdfColumn.builder().name("xxxxx").block(true).width(48).align(HorizontalAlignment.CENTER).backGround(backGray).build());
table.addRow(row22);
PdfRow row23 = PdfRow.builder().downBorder(true).borderStyle(BorderStyle.DOTTED).height(18).pdfColumns(new ArrayList<>()).build();
row23.addColumn(PdfColumn.builder().name("xxxxxx").block(true).width(200).align(HorizontalAlignment.LEFT).build());
row23.addColumn(PdfColumn.builder().name("").width(48).align(HorizontalAlignment.CENTER).backGround(backGray).build());
row23.addColumn(PdfColumn.builder().name("").width(48).align(HorizontalAlignment.CENTER).build());
row23.addColumn(PdfColumn.builder().name("").width(48).align(HorizontalAlignment.CENTER).backGround(backGray).build());
row23.addColumn(PdfColumn.builder().name("").width(48).align(HorizontalAlignment.CENTER).build());
row23.addColumn(PdfColumn.builder().name("").width(48).align(HorizontalAlignment.CENTER).backGround(backGray).build());
row23.addColumn(PdfColumn.builder().name("").width(48).align(HorizontalAlignment.CENTER).build());
row23.addColumn(PdfColumn.builder().name("").width(48).align(HorizontalAlignment.CENTER).backGround(backGray).build());
table.addRow(row23);
PdfRow row24 = PdfRow.builder().downBorder(true).borderStyle(BorderStyle.DOTTED).height(18).pdfColumns(new ArrayList<>()).build();
row24.addColumn(PdfColumn.builder().name("xxxxxxx").offset(20).width(180).align(HorizontalAlignment.LEFT).build());
row24.addColumn(PdfColumn.builder().name("xxxx").width(48).align(HorizontalAlignment.CENTER).backGround(backGray).build());
row24.addColumn(PdfColumn.builder().name("xxxx").width(48).align(HorizontalAlignment.CENTER).build());
row24.addColumn(PdfColumn.builder().name("xxxx").width(48).align(HorizontalAlignment.CENTER).backGround(backGray).build());
row24.addColumn(PdfColumn.builder().name("xxxx").width(48).align(HorizontalAlignment.CENTER).build());
row24.addColumn(PdfColumn.builder().name("xxxx").width(48).align(HorizontalAlignment.CENTER).backGround(backGray).build());
row24.addColumn(PdfColumn.builder().name("xxxx").width(48).align(HorizontalAlignment.CENTER).build());
row24.addColumn(PdfColumn.builder().name("xxxx").width(48).align(HorizontalAlignment.CENTER).backGround(backGray).build());
table.addRow(row24);
PdfRow row25 = PdfRow.builder().downBorder(true).borderStyle(BorderStyle.DOTTED).height(18).pdfColumns(new ArrayList<>()).build();
row25.addColumn(PdfColumn.builder().name("xxxxxxxxxxxxx").offset(20).width(180).align(HorizontalAlignment.LEFT).build());
row25.addColumn(PdfColumn.builder().name("xxx").width(48).align(HorizontalAlignment.CENTER).backGround(backGray).build());
row25.addColumn(PdfColumn.builder().name("xxx").width(48).align(HorizontalAlignment.CENTER).build());
row25.addColumn(PdfColumn.builder().name("xxx").width(48).align(HorizontalAlignment.CENTER).backGround(backGray).build());
row25.addColumn(PdfColumn.builder().name("xxx").width(48).align(HorizontalAlignment.CENTER).build());
row25.addColumn(PdfColumn.builder().name("xxx").width(48).align(HorizontalAlignment.CENTER).backGround(backGray).build());
row25.addColumn(PdfColumn.builder().name("xxx").width(48).align(HorizontalAlignment.CENTER).build());
row25.addColumn(PdfColumn.builder().name("xxx").width(48).align(HorizontalAlignment.CENTER).backGround(backGray).build());
table.addRow(row25);
table.addRow(row23);
table.addRow(row24);
table.addRow(row25);
table.addRow(row23);
table.addRow(row24);
table.addRow(row25);
table.addRow(row23);
table.addRow(row24);
table.addRow(row25);
table.addRow(row23);
table.addRow(row24);
table.addRow(row25);
table.addRow(row23);
table.addRow(row24);
table.addRow(row25);
table.addRow(row23);
table.addRow(row24);
table.addRow(row25);
table.addRow(row23);
table.addRow(row24);
table.addRow(row25);
table.addRow(row23);
table.addRow(row24);
table.addRow(row25);
table.addRow(row23);
table.addRow(row24);
table.addRow(row25);
table.addRow(row23);
table.addRow(row24);
table.addRow(row25);
table.addRow(row23);
table.addRow(row24);
table.addRow(row25);
table.addRow(row23);
table.addRow(row24);
table.addRow(row25);
table.addRow(row23);
table.addRow(row24);
table.addRow(row25);
table.addRow(row23);
table.addRow(row24);
table.addRow(row25);
table.addRow(row23);
table.addRow(row24);
table.addRow(row25);
table.addRow(row23);
table.addRow(row24);
table.addRow(row25);
table.addRow(row23);
table.addRow(row24);
table.addRow(row25);
table.addRow(row23);
table.addRow(row24);
table.addRow(row25);
table.addRow(row23);
table.addRow(row24);
table.addRow(row25);
table.addRow(row23);
table.addRow(row24);
table.addRow(row25);
DrawTableUtils.createDocument(table);
四、效果图
✅ Java 开发工程师,从事 Web 应用程序的研发,擅长 Spring、SpringBoot 等技术。 ✅ 热爱编程,业余时间学习新知识,通过 CSDN 记录学习心得和笔记内容。
07-15
分页 PDFBox 表格生成器
这是一个如何使用 PDFBox 生成分页表的简单示例。 我没有对代码进行过多优化或开发,但它是一个工作模型,可用于获取有关如何使用 PDFBox 实现表格生成的一些想法。
本项目需要pdfbox-app-1.8.4.jar
Apache PDFBox 是遵循Apache License v2.0的Java开源类库。用于操作PDF文档,可以创建新PDF文档,维护现有的PDF文档,或者从PDF文档中提取内容,支持生成加密的PDF文件,以及对PDF文件进行数字签名。Apache PDFBox同时提供了一个命令行操作工具。
Apache P.
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
import org.a..
这是一个基于的小项目,应该允许您以相当简单的方式创建表。 它来自另一个项目的需求。 因此,它也可能会错过一些关键功能。 尽管如此,还是有:
在表格,行和单元格级别上设置字体,字体大小,填充,边框宽度
分别设置底部,顶部,左侧和右侧的宽度的单个单元格
表格,行和单元格级别的背景色
在表格,行和单元格级别上的填充(顶部,底部,左侧,右侧)
边框颜色和样式(在表,行或单元格级别上)
支持文本对齐(右,左,居中,对齐)
垂直文本对齐方式(顶部,中间,底部)
列跨度和行跨度
换行和行距
单元格中的图像
实验性的:垂直文本,
还可以覆盖负责表/单元格绘制的类,即可以很大程度地自定义其绘制行为。
也可以在多个页面上绘制表格(即使在每个新页面上重复标题行)。
将此添加到您的pom.xml :
<dependency>
<groupId>com.github.vandese
可以使用 Apache PDFBox 库的 PDFTextStripper 类将 PDF 转换为 HTML。具体操作步骤如下:
1. 安装 Apache PDFBox 库:可以在官网下载最新版本并安装,也可以通过依赖管理工具(如 Maven)安装。
2. 使用 PDFTextStripper 类读取 PDF 文档:通过代码创建一个 PDFTextStripper 对象,然后使用该对象的 getText 方法读取 PDF 文档内容。
3. 将读取的内容转换为 HTML:使用任意 HTML 生成工具(如 Jsoup)将读取到的文本转换为 HTML 格式。
例如,下面是一段使用 Apache PDFBox 将 PDF 转换为 HTML 的示例代码:
import java.io.File;
import java.io.IOException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
public class PdfToHtml {
public static void main(String[] args) throws IOException {
PDDocument document = PDDocument.load(new File("example.pdf"));
PDFTextStripper stripper = new PDFTextStripper();
String text = stripper.getText(document);
document.close();
// 将读取到的文本转换为 HTML
// ...
希望这个示例代码能帮助你了解如何使用 Apache PDFBox 将 PDF 转换为 HTML。
### 回答2:
PDFBox是一个用于处理PDF文件的Java库。要将PDF转换为HTML,可以使用PDFBox提供的功能来解析PDF文件并提取文本内容和图像,然后将其转换为HTML格式。
以下是使用PDFBox将PDF转换为HTML的基本步骤:
1. 首先,引入PDFBox库,以便在Java项目中使用PDFBox的功能。
2. 创建一个PDF文档对象,通过调用PDFBox提供的方法来加载PDF文件。例如:
```java
PDDocument document = PDDocument.load(new File("input.pdf"));
3. 创建一个PDF文本提取器对象,用于提取PDF中的文本内容。
```java
PDFTextStripper stripper = new PDFTextStripper();
4. 使用文本提取器提取PDF文件中的文本内容。
```java
String text = stripper.getText(document);
5. 创建一个HTML写入器对象,用于将提取的文本内容写入HTML文件。
```java
BufferedWriter writer = new BufferedWriter(new FileWriter("output.html"));
6. 将提取的文本内容写入HTML文件。
```java
writer.write(text);
7. 关闭HTML写入器和PDF文档对象。
```java
writer.close();
document.close();
这些步骤简要介绍了如何使用PDFBox将PDF转换为HTML。当然,PDF中可能包含复杂的图表、表格和其他元素,PDFBox可能无法完全保留原始的样式和布局。你可能需要进一步处理提取的内容,以便更好地适应HTML格式和需求。
### 回答3:
PDFBox是一个Java库,用于处理PDF文件。它提供了一些用于将PDF文件转换为HTML的功能。
要使用PDFBox将PDF转换为HTML,首先需要导入相关的PDFBox库文件。然后,可以通过以下步骤来完成转换的过程:
1. 创建一个PDDocument对象,该对象表示要转换的PDF文件。可以使用PDDocument类的load方法加载PDF文件。
2. 创建一个PDFTextStripper对象,该对象将从PDF文件中提取文本内容。
3. 使用PDFTextStripper的getText方法提取PDF文件中的文本。可以选择性地设置一些转换选项,如设置起始页和结束页,以及设置是否忽略一些格式化信息等。
4. 将提取的文本内容保存到一个字符串中。
5. 创建一个HTML文件,并将提取的文本内容写入该文件中。可以使用HTML标签对文本进行一些格式化处理。
6. 最后,关闭PDDocument对象和HTML文件。
以下是一个简单示例代码,展示了如何使用PDFBox将PDF转换为HTML:
```java
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class PDFToHTMLConverter {
public static void convertPDFtoHTML(String pdfFilePath, String htmlFilePath) throws IOException {
// 加载PDF文件
PDDocument document = PDDocument.load(new File(pdfFilePath));
// 创建PDFTextStripper对象
PDFTextStripper stripper = new PDFTextStripper();
// 提取文本内容
String text = stripper.getText(document);
// 创建HTML文件并写入文本内容
FileWriter writer = new FileWriter(new File(htmlFilePath));
writer.write("<html><body>");
writer.write(text);
writer.write("</body></html>");
// 关闭对象
writer.close();
document.close();
public static void main(String[] args) {
String pdfFilePath = "path/to/input.pdf";
String htmlFilePath = "path/to/output.html";
try {
convertPDFtoHTML(pdfFilePath, htmlFilePath);
System.out.println("成功将PDF文件转换为HTML文件!");
} catch (IOException e) {
System.out.println("转换过程中出现错误:" + e.getMessage());
请注意,这只是一个简单的示例代码,实际的转换过程可能会更复杂,需要根据具体的需求进行定制。同样,PDF文件的复杂性也会影响转换的结果。