使用PDFbox生成表格

一、PDFbox说明

1、坐标

文档左下角为坐标原点,x轴向右从0增加,y轴向上增加

2、线

以起始位置至终点一条线,线宽以垂直于起始至终止连线方向发散,例如线宽20,起始位置(0,10),终止位置(500,10)则线实际所占位置为(0,0),(0,20),(500,0),(500,20)所围成的长方形区域

3、图

图位置以左下角为原点向右上方发散

4、字

字的位置以左下角为原点向右上方发散

        // 横线
        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);



    }
}

四、效果图

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 可以使用 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文件的复杂性也会影响转换的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值