如何向图像添加文字?

2024-01-11

在我的项目中,我使用 iText 生成 PDF 文档。

假设页面的高度为 500pt(1 个用户单位 = 1 点),并且我在页面上写入了一些文本,然后是图像。

如果内容和图像要求小于 450pt,则文本在图像之前。 如果内容和图像超过 450pt,文本将转发到下一页。

我的问题是:在写入图像之前如何获取剩余可用空间?


首先,当向页面添加文本和图像时,iText 有时会更改文本内容和图像的顺序。您可以通过使用以下方法来避免这种情况:

writer.setStrictImageSequence(true);

如果你想知道“光标”的当前位置,可以使用该方法getVerticalPosition()。不幸的是,这个方法不是很优雅:它需要一个布尔参数来添加换行符(如果true)或给你当前行的位置(如果false).

我不明白你为什么想要获得垂直位置。是因为您想要标题后跟图像,并且希望标题和图像位于同一页面吗?

在这种情况下,您可以将文本和图像放入表格单元格中,并指示 iText 不要拆分行。在这种情况下,如果内容不适合当前页面,iText 将以正确的顺序将文本和图像转发到下一页。

Update:

根据评论中添加的额外信息,现在很明显OP想要添加带水印的图像。

有两种方法可以实现这一点,具体取决于实际要求。

方法一:

第一种方法的解释在水印图片1 http://itextpdf.com/sandbox/images/WatermarkedImages1例子。在这个例子中,我们创建一个PdfTemplate我们向其中添加图像以及写在该图像顶部的一些文本。然后我们可以把它包装起来PdfTemplate在图像内并使用单个图像添加该图像及其水印document.add()陈述。

这是执行所有魔法的方法:

public Image getWatermarkedImage(PdfContentByte cb, Image img, String watermark) throws DocumentException {
    float width = img.getScaledWidth();
    float height = img.getScaledHeight();
    PdfTemplate template = cb.createTemplate(width, height);
    template.addImage(img, width, 0, 0, height, 0, 0);
    ColumnText.showTextAligned(template, Element.ALIGN_CENTER,
            new Phrase(watermark, FONT), width / 2, height / 2, 30);
    return Image.getInstance(template);
}

这就是我们添加图像的方式:

PdfContentByte cb = writer.getDirectContentUnder();
document.add(getWatermarkedImage(cb, Image.getInstance(IMAGE1), "Bruno"));
document.add(getWatermarkedImage(cb, Image.getInstance(IMAGE2), "Dog"));
document.add(getWatermarkedImage(cb, Image.getInstance(IMAGE3), "Fox"));
Image img = Image.getInstance(IMAGE4);
img.scaleToFit(400, 700);
document.add(getWatermarkedImage(cb, img, "Bruno and Ingeborg"));

正如您所看到的,我们有一张非常大的图像(我和我妻子的照片)。我们需要缩放该图像以使其适合页面。如果您想避免这种情况,请查看第二种方法。

方法2:

第二种方法的解释在水印图像2 http://itextpdf.com/sandbox/images/WatermarkedImages2例子。在这种情况下,我们将每个图像添加到PdfPCell. This PdfPCell将缩放图像以使其适合页面的宽度。要添加水印,我们使用单元格事件:

class WatermarkedCell implements PdfPCellEvent {
    String watermark;

    public WatermarkedCell(String watermark) {
        this.watermark = watermark;
    }

    public void cellLayout(PdfPCell cell, Rectangle position,
        PdfContentByte[] canvases) {
        PdfContentByte canvas = canvases[PdfPTable.TEXTCANVAS];
        ColumnText.showTextAligned(canvas, Element.ALIGN_CENTER,
            new Phrase(watermark, FONT),
            (position.getLeft() + position.getRight()) / 2,
            (position.getBottom() + position.getTop()) / 2, 30);
    }
}

这个单元格事件可以这样使用:

PdfPCell cell;
cell = new PdfPCell(Image.getInstance(IMAGE1), true);
cell.setCellEvent(new WatermarkedCell("Bruno"));
table.addCell(cell);
cell = new PdfPCell(Image.getInstance(IMAGE2), true);
cell.setCellEvent(new WatermarkedCell("Dog"));
table.addCell(cell);
cell = new PdfPCell(Image.getInstance(IMAGE3), true);
cell.setCellEvent(new WatermarkedCell("Fox"));
table.addCell(cell);
cell = new PdfPCell(Image.getInstance(IMAGE4), true);
cell.setCellEvent(new WatermarkedCell("Bruno and Ingeborg"));
table.addCell(cell);

如果所有图像的大小大致相同,并且您不想担心图像适合页面的大小,则可以使用此方法。

考虑:

显然,由于所做的设计选择,两种方法都会产生不同的结果。请比较生成的 PDF 以查看差异:水印_模板.pdf http://itextpdf.com/sites/default/files/watermark_template.pdf versus 水印表.pdf http://itextpdf.com/sites/default/files/watermark_table.pdf

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何向图像添加文字? 的相关文章

随机推荐

  • TFS Git - 拉取请求“合并失败”

    您好 我在 TFS 和 git pull requests 方面遇到了这个问题 我们有两个主要分支 掌握 发展 所以我创建新分支 async data loadingdevelop并对其进行一些更改 接下来 我提交更改并将其推送到远程 as
  • 当div高度未设置时,如何让html表格高度=父div的高度

    我有一个 html 表 位于 div 内 div 的高度基于 div 中的其他元素 如何让表格的高度等于其父 div 的高度 表格高度 100 不起作用 因为未设置div的高度 Update 我需要支持 IE6 7 8 因此这些浏览器应该能
  • ios core data如何实现sql事务功能?

    就像标题一样 我使用核心数据来插入项目 我插入了100个项目 它太慢了 如何提高插入速度 Core Data有哪些交易功能 lt NSManagedObjectContext gt undoManager beginUndoGrouping
  • 如何在 Django 模板中使用域 get_absolute_url ?

    所以我有点挣扎 一些逻辑上看起来很简单的东西 但由于我对 Django 的理解有限 我不确定在哪里寻找以及如何制定解决方案 基本上我设置了一个博客应用程序 它在主页上显示完整的 所有内容 包括 disqus 讨论 最新帖子 该帖子还有一个指
  • 检测objective-c中for()循环的真正结束

    我将在我的应用程序中显示一种 UIActivityIndi catorView 同时在 for 循环内解析多个 JSON 对象 我不知道必须在哪里放置 UIActivityIndi catorView startAnimating 和 UI
  • keyof T 的默认类型不能用于索引类型 T

    我正在尝试重构此代码以使用静态方法 因为该类仅用于命名空间和Query equal
  • 检查包含任意顺序的 3 个连续字母和 2 个数字的字符串

    我似乎无法理解这个问题 我想我应该在这里寻求一些帮助 基本上我正在验证密码字段 要求如下 必须包含3个连续字母 必须包含至少 2 位数字 可以是任何顺序 例如 1abc342 abc24g3 11abcsjf 这是我到目前为止所拥有的 但我
  • WebSphere MQ 确认和回复队列

    我们通过远程队列定义 CLIENT DATA 传输队列 发送 接收通道等 从队列管理器 QM MINE 队列管理器 QM CLIENT 和队列 CLIENT DATA 发送 XML 文本消息 消息到达目的地 客户端的 CLIENT DATA
  • 通过比较另一个图像的强度来更改图像的强度 - OpenTK

    我有两个图像 我必须找到第一张图像中强度大于 0 8 的点 同时 我必须找到第二张图像在相同点上的强度 并且需要使用阈值 滑块值 范围从 0 到 1 调整第二张图像在相同点上的光线 我已经做了如下 点上出现黑色或深色区域的强度大于 0 8
  • 将 csv 文件的前 x 行读取到新的输出文件中?

    如何只复制 a 的前 x 行csv文件到一个新的csv通过终端文件 Brief 您将使用 Linux 终端 控制台 Use head n NUMBEROFLINES file csv获得第一NUMBEROFLINES的线路 使用 shell
  • 选择具有特定值的行之后的行

    嘿 再次 我仍然掌握查询和其他东西 所以请原谅所有常见的 SQL 问题 8 无论如何 我试图选择某个值之后的行 不明白 好吧 这就是它实际的样子 表 消息 message id thread id user id to id body me
  • 跨浏览器剪贴蒙版

    我的网站有导航 以矩形按钮列表的形式呈现有圆角 每个按钮都应该有自己的自定义背景 即照片 照片比按钮大 并且应该随着鼠标在该按钮上的移动而移动 我们有一种效果 就像我们透过窗户看一样 导航具有以下 HTML 结构 ul gt li gt a
  • Android CalendarProvider 事件颜色

    我最困惑的是如何在 Android CalendarProvider 中使用颜色 我可以添加事件 但是当我尝试插入具有特定颜色的事件时 默认日历颜色 浅蓝色 似乎会忽略此首选项 我想我不太确定如何使用颜色 我想知道是否有人可以好心地解释一下
  • 延迟容器启动,直到 pod 中的其他容器启动

    我正在研究一个用例 其中 sidecar 容器在更改主容器的目录权限时连续运行 shell 脚本 我只想在 pod 中的主容器准备就绪后才启动侧容器 我正在查看 Init Containers 我发现当我们具有 pod 间依赖关系时 ini
  • JavaScript 中的 Node js / MongoDB 副本集数组

    警告 我是一名新手程序员 更多的是系统管理员 我们获得了一个使用 MongoDB 的 Node js 应用程序 据我所知 mongo js 文件使用 mongojs 和 monq java 类 它只设置了一个 MongoDB 我正在尝试设置
  • Flask AttributeError:模块“flask.json”没有属性“JSONEncoder”

    我的烧瓶应用程序在升级之前可以正常运行 当忘记重置密码时 我在发送电子邮件时遇到了问题 为了尝试解决这个问题 我最近升级了我的 Flask 应用程序的一些模块 我使用当前版本升级的模块是 电子邮件验证器 2 0 0 post2 烧瓶 2 3
  • 如何在C#中动态创建表

    table border 1 tr td Record 1 td tr tr td 1 td td 2 td td 3 td tr tr td a td td b td td c td tr tr td m td td n td td o
  • 递归 JSON.stringify 实现

    我正在尝试学习 Javascript 中的递归 所以我想我应该重写本机JSON stringify使用递归函数作为对自己的挑战 我几乎让我的代码可以工作 var my stringify function obj value obj Obj
  • 如何清理 WordPress 中的用户密码信息?

    我正在 WordPress 网站上的自定义注册表单中捕获用户名 电子邮件和密码 我正在使用以下方式清理用户名sanitize user and sanitize email 清理电子邮件地址 例如 username sanitize use
  • 如何向图像添加文字?

    在我的项目中 我使用 iText 生成 PDF 文档 假设页面的高度为 500pt 1 个用户单位 1 点 并且我在页面上写入了一些文本 然后是图像 如果内容和图像要求小于 450pt 则文本在图像之前 如果内容和图像超过 450pt 文本