如何通过Java的Apache PDFBox库制作一个PDF表格模板并填充数据

这篇具有很好参考价值的文章主要介绍了如何通过Java的Apache PDFBox库制作一个PDF表格模板并填充数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

要使用Java的Apache PDFBox库制作一个PDF表格模板并填充数据,你需要遵循以下步骤:

  1. 添加依赖:首先,确保你的项目中包含了Apache PDFBox的依赖。如果你使用Maven,可以在你的pom.xml文件中添加以下依赖:
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.24</version>
</dependency>
  1. 创建PDF模板:你可以使用PDFBox创建一个简单的PDF模板,或者使用其他工具(比如Adobe Acrobat)创建PDF模板,并在模板中添加表格。

  2. 填充表格数据:使用PDFBox API向PDF模板中的表格填充数据。

下面是一个简单的例子,演示如何使用PDFBox创建一个包含表格的PDF文档,并向表格中填充数据:


import com.google.common.collect.Lists;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType0Font;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class PDFBoxExample {

    public static void main(String[] args) {
        // 保存的pdf全路径
        String outPdfPath = "/out.pdf";
        // pdf需要展示的文本
        String text = "这是一些文本";
        // pdf中表格需要填充的数据
        List<List<String>> data = Lists.newArrayList();
        // 创建一个新的PDF文档
        try (PDDocument newDocument = new PDDocument()) {
            ClassLoader classLoader = PDFBoxExample.class.getClassLoader();
            String[][] content = new String[data.size() + 1][8];
            content[0] = new String[]{"列1", "列2", "列3", "列4", "列5", "列6", "列7", "列8"};
            for (int i = 0; i < data.size(); i++) {
                List<String> dto = data.get(i);
                content[i + 1] = new String[]{dto.get(0), dto.get(1), dto.get(2), dto.get(3), dto.get(4), dto.get(5), dto.get(6), dto.get(7)};
            }

            PDPage pdPage = new PDPage();
            // 加载自定义字体
            InputStream inputStream = classLoader.getResourceAsStream("fonts/weiruanyahei.ttf");
            PDFont font = PDType0Font.load(newDocument, inputStream);
            // 创建一个新的内容流,用于向页面添加内容
            try (PDPageContentStream contentStream = new PDPageContentStream(newDocument, pdPage)) {

                // 开始写文本
                contentStream.beginText();
                //设置文本字体
                contentStream.setFont(font, 12);
                contentStream.newLineAtOffset(100, 700);
                contentStream.showText(text);
                // 结束文本块
                contentStream.endText();

                // 在文本之后 绘制表格

                drawTable(contentStream, 500, 10, content, font, 7);
            }
            newDocument.addPage(pdPage);
            // 保存新的PDF文档
            newDocument.save(outPdfPath);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 绘制表格的方法
     * @param contentStream PDPageContentStream对象,用于在PDF页面上绘制内容
     * @param y 表格的起始y坐标,即表格的顶部位置
     * @param margin 表格的左边距
     * @param content 表格的内容,一个二维字符串数组,表示表格的行和列
     * @param font PDFont对象,表示文本的字体
     * @param fontSize 文本的字体大小
     * @throws IOException IO异常
     */
    private static void drawTable(PDPageContentStream contentStream,
                                  float y, float margin,
                                  String[][] content, PDFont font, int fontSize) throws IOException {
        final int rows = content.length;
        final int cols = content[0].length;
        final float rowHeight = 20f;
        // 边距
        final float cellMargin = 5f;

        // 计算每列的最大宽度
        float[] colMaxWidths = new float[cols];
        for (int i = 0; i < cols; i++) {
            for (String[] row : content) {
                float textWidth = font.getStringWidth(row[i]) / 1000 * fontSize;
                if (textWidth > colMaxWidths[i]) {
                    colMaxWidths[i] = textWidth;
                }
            }
            // 为每列的文本添加边距
            colMaxWidths[i] += 2 * cellMargin;
        }

        // 检查表格总宽度是否超出页面宽度
        float totalColWidth = 0f;
        for (float width : colMaxWidths) {
            totalColWidth += width;
        }

        // 绘制行
        float nexty = y;
        for (int i = 0; i <= rows; i++) {
            contentStream.moveTo(margin, nexty);
            contentStream.lineTo(margin + totalColWidth, nexty);
            contentStream.stroke();
            nexty -= rowHeight;
        }

        // 绘制列
        float nextx = margin;
        for (int i = 0; i < cols; i++) {
            contentStream.moveTo(nextx, y);
            contentStream.lineTo(nextx, y - rowHeight * rows);
            contentStream.stroke();
            nextx += colMaxWidths[i];
        }
        // 绘制最后一条列线
        contentStream.moveTo(nextx, y);
        contentStream.lineTo(nextx, y - rowHeight * rows);
        contentStream.stroke();

        // 添加文本到表格
        float textx = margin + cellMargin;
        // 从字体度量中获取字体的上升和下降值,以确保文本居中
        float fontHeight = font.getFontDescriptor().getFontBoundingBox().getHeight() / 1000 * fontSize;
        float fontDescent = font.getFontDescriptor().getDescent() / 1000 * fontSize;
        // 计算文本基线到单元格顶部的距离
        // 调整垂直居中
        float texty = y - (rowHeight / 2) - (fontHeight / 2) - fontDescent;
        for (String[] row : content) {
            for (int i = 0; i < row.length; i++) {
                String cell = row[i];
                contentStream.beginText();
                contentStream.setFont(font, fontSize);
                contentStream.newLineAtOffset(textx, texty);
                contentStream.showText(cell);
                contentStream.endText();
                textx += colMaxWidths[i];
            }
            texty -= rowHeight;
            textx = margin + cellMargin;
        }
    }
}

这段代码创建了一个包含表格和数据的PDF文档。注意,这个例子中的表格是静态的,意思是你不能像在HTML中那样动态地添加或删除行。如果你需要更复杂的表格布局,你可能需要编写更多的代码来计算行和列的位置。

如果你的PDF模板是预先存在的,并且包含可编辑的表单字段,你可以使用PDDocumentPDAcroForm类来填充这些字段,而不是手动绘制表格。这通常是处理复杂模板的更好方法。

请记住,PDFBox是一个底层库,因此创建复杂的表格布局可能需要相当多的手动计算和布局工作。对于更复杂的需求,可能需要考虑使用其他库或工具,例如iText,它提供了更高级的表格创建功能。文章来源地址https://www.toymoban.com/news/detail-834715.html

到了这里,关于如何通过Java的Apache PDFBox库制作一个PDF表格模板并填充数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java使用pdfbox进行pdf和图片之间的转换

    pdfbox是Apache开源的一个项目,支持pdf文档操作功能。 官网地址: Apache PDFBox | A Java PDF Library 支持的功能如下图. 引入依赖

    2024年02月06日
    浏览(54)
  • Java 利用pdfbox将图片和成到pdf指定位置

    业务背景:用户在手机APP上进行签名,前端将签完名字的图片传入后端,后端合成新的pdf. 废话不多说,上代码: 注意:前端传过来的图片必须是透明的,否则合成的时候签名处会有边框        

    2024年02月09日
    浏览(65)
  • 【Java】OpenPDF、iText、PDFBox 是三种常用的 PDF 处理库

    OpenPDF、iText、PDFBox 是三种常用的 PDF 处理库,它们各自具有独特的优势和特点,同时也存在一些局限性和差异。本文将对这四种库进行详细的比较,并通过代码示例来展示它们的使用。 1、OpenPDF OpenPDF 是一个用于创建和编辑 PDF 文档的 Java 库,它基于 iText 库的一个分支,提供

    2024年02月09日
    浏览(60)
  • java中pdfbox处理pdf常用方法(读取、写入、合并、拆分、写文字、写图片)

    方法代码: 测试用例: 2.1写文字 方法代码: 测试用例: A.pdf: A2.pdf: 2.2写图片 方法代码: 测试用例: A.pdf: pic.jpg: A2.pdf: 方法代码: 测试用例: 方法代码: 测试用例: 引用链接: (17条消息) 使用Apache PDFBox实现拆分、合并PDF_似有风中泣的博客-CSDN博客 (17条消息) Java使用P

    2024年02月11日
    浏览(128)
  • Java实现自动化pdf打水印小项目 使用技术pdfbox、Documents4j

    博主介绍:✌目前全网粉丝2W+,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域。 涵盖技术内容:Java后端、算法、分布式微服务、中间件、前端、运维、ROS等。 博主所有博客文件目录索引:博客目录索引(持续更新) 视频平台:

    2024年02月20日
    浏览(73)
  • 如何通过Java代码将 PDF文档转为 HTML格式

    虽然PDF文件适合用于打印和发布,但不适合所有类型的文档。例如,包含复杂图表和图形的文档可能无法在PDF中呈现得很好。但是HTML文件可以在任何可运行浏览器的计算机上进行阅读并显示。并且HTML还具有占用服务器资源较小,便于搜索引擎收录的特点。那么今天这篇文章就

    2024年02月05日
    浏览(57)
  • 如何在 Java 中将多个 PDF 文件合并为一个 PDF

    如果您正在开发涉及处理 PDF 文件的 Java 项目,则可能需要将多个 PDF 文件合并到一个文档中。在本文中,我们将演示如何使用 Java 编程语言来实现这一目标。我们将从以下两个方面向您展示如何将多个PDF文件合并为一个PDF: 将文件中的多个 PDF 合并为单个 PDF 将流中的多个

    2024年02月13日
    浏览(46)
  • 通过Python的pdfplumber库提取pdf中表格数据

    大家好,我是空空star,本篇给大家分享一下 《通过Python的pdfplumber库提取pdf中表格数据》 。 pdfplumber是一个用于从PDF文档中提取文本和表格数据的Python库。它可以帮助用户轻松地从PDF文件中提取有用的信息,例如表格、文本、元数据等。pdfplumber库的特点包括:简单易用、速度

    2024年02月06日
    浏览(45)
  • 【PDFBox】PDFBox操作PDF文档之读取指定页面文本内容、读取所有页面文本内容、根据模板文件生成PDF文档

    这篇文章,主要介绍PDFBox操作PDF文档之读取指定页面文本内容、读取所有页面文本内容、根据模板文件生成PDF文档。 目录 一、PDFBox操作文本 1.1、读取所有页面文本内容 1.2、读取指定页面文本内容 1.3、写入文本内容 1.4、替换文本内容 (1)自定义PDTextStripper类 (2)创建Key

    2024年02月16日
    浏览(69)
  • 使用pdfbox 为 PDF 增加水印

    使用pdfbox 为 PDF增加水印 https://www.jylt.cc/#/detail?activityIndex=2id=bd410851b0a72dad3105f9d50787f914 引入依赖 具体代码实现

    2024年01月19日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包