是否可以调整 PDFBOX 中的文本?

2024-01-05

PDFBOX API 中是否有任何功能可以使文本对齐,或者我们必须手动执行此操作?如果手动,那么如何使用java(其背后的逻辑)调整文本


这个较旧的答案 https://stackoverflow.com/questions/19635275/how-to-generate-multiple-lines-in-pdf-using-apache-pdfbox/19683618#19683618展示如何将字符串分解为适合给定的子字符串width。为了使示例代码以填充整个行宽的方式绘制子字符串,请替换如下(取决于 PDFBox 版本):

PDFBox 1.8.x

替换最后一个循环

for (String line: lines)
{
    contentStream.drawString(line);
    contentStream.moveTextPositionByAmount(0, -leading);
}

有了这个更详细的:

for (String line: lines)
{
    float charSpacing = 0;
    if (line.length() > 1)
    {
        float size = fontSize * pdfFont.getStringWidth(line) / 1000;
        float free = width - size;
        if (free > 0)
        {
            charSpacing = free / (line.length() - 1);
        }
    }
    contentStream.appendRawCommands(String.format("%f Tc\n", charSpacing).replace(',', '.'));
            
    contentStream.drawString(line);
    contentStream.moveTextPositionByAmount(0, -leading);
}

(From BreakLongString.java https://github.com/mkl-public/testarea-pdfbox1/blob/master/src/test/java/mkl/testarea/pdfbox1/content/BreakLongString.java#L124 test testBreakStringJustified适用于 PDFBox 1.8.x)

如果您想知道replace(',', '.') in

contentStream.appendRawCommands(String.format("%f Tc\n", charSpacing).replace(',', '.'));

...我的语言环境使用逗号作为小数分隔符,在我的第一次测试运行导致页面内容中出现逗号后,我有点懒,只是添加了替换来修复问题...

PDFBox 2.0.x

替换最后一个循环

for (String line: lines)
{
    contentStream.showText(line);
    contentStream.newLineAtOffset(0, -leading);
}

有了这个更详细的:

for (String line: lines)
{
    float charSpacing = 0;
    if (line.length() > 1)
    {
        float size = fontSize * pdfFont.getStringWidth(line) / 1000;
        float free = width - size;
        if (free > 0)
        {
            charSpacing = free / (line.length() - 1);
        }
    }
    contentStream.setCharacterSpacing(charSpacing);
    
    contentStream.showText(line);
    contentStream.newLineAtOffset(0, -leading);
}

(From BreakLongString.java https://github.com/mkl-public/testarea-pdfbox2/blob/master/src/test/java/mkl/testarea/pdfbox2/content/BreakLongString.java#L123 test testBreakStringJustified适用于 PDFBox 2.0.x)


该解决方案仅使用额外的字符间距(运算符Tc)作为理由。您可以使用额外的字间距(运算符Tw) 仅扩展空格字符或两者的组合;但请注意:字间距并不适用于所有字体编码。有关这些操作数的更多信息请参见。表105文本状态运算符,第 9.3.2 节字符间距,以及第 9.3.3 节字间距在 PDF 规范中ISO 32000-1 http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/PDF32000_2008.pdf

而不是前者

你现在得到

正如你所看到的,仍然有一个小缺陷,段落的最后一行显然不应该被证明是合理的。因此,在最后一行中,使用0字符间距改为:

    contentStream.appendRawCommands("0 Tc\n"); // PDFBox 1.8.x

    contentStream.setCharacterSpacing(0); // PDFBox 2.0.x

PS我只是偶然发现一个事实setCharacterSpacing目前(2016 年 11 月)仅处于 2.1.0-SNAPSHOT 开发版本,还没有 2.0.x 发行版本。因此,在 2.0.x 中你可能不得不回退到使用appendRawCommands相反,即使它已被标记为已弃用。

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

是否可以调整 PDFBOX 中的文本? 的相关文章

随机推荐

  • MySQL查询对两列进行排序,一个ASC另一个DESC

    我正在尝试准备一份主题明智的优点清单 我正在用这个mysql query SELECT FROM results ORDER BY qid ASC marks DESC 结果是 但我需要的是这样的 看看标记列 我需要得到相同的qid行 排序
  • 基于动态正则表达式的XPath搜索

    我有一个如下所示的 XML
  • 它们是“相同的”吗? (代码战争)

    我是一个初学者 我正在做一些代码战争的练习 这是练习的描述 练习链接 https www codewars com kata 550498447451fbbd7600041c train python 给定两个数组 a 和 b 编写一个函数
  • Android:发送短信 (sendTextMessage) 时出现 Unicode/字符集问题

    基本上我有一个工作应用程序 可以在收到短信后发送短信 一切正常 除非短信to send有 特殊字符 即 等 我已经尝试了很多方法 包括字符集转换 但我根本无法使其工作 msgText 总是返回字符集编码问题 这是发送消息的部分 if msg
  • Android加密/解密问题(AES)

    我在这里需要一点帮助 所以基本上我必须在 Android 中对图像进行 AES 加密 解密测试 我是 Android 编程新手 这就是为什么我的一个朋友给我一个例子来说明如何做到这一点 但问题是 当我运行示例时 它会在 20 30 秒后崩溃
  • 将自定义方法添加到 UI 对话框插件

    我正在使用 jQuery 的 UI 对话框 我想添加一个自定义方法 基本上 当我的对话框有一个 工作 类时 它里面有一个加载覆盖 我正在尝试编写一些全局应用程序 jQuery 以便当任何对话框关闭时 它都会删除 工作 类 我不太确定我在做什
  • 这个 Java 策略模式是否有多余的 Context 类?

    以下代码示例是策略模式的实现从维基百科复制 http en wikipedia org wiki Strategy pattern Java 我的完整问题如下 维基百科的main method StrategyExample test ap
  • 如何使用 Swift 创建带有 UITabBar 或 Segment Control 的 PageView?

    我对 iOS 还很陌生 我有一个问题 无法获得实施的确切想法 我在这里上传两个图像 所以请建议我如何使用 Swift 实现它 这是我的图像 在图像中 您可以看到对于单个 viewController 有两个选项卡 一个是 您的组 另一个是
  • 在 CLR 4.0 中加载/执行 CLR 2.0 程序集

    CLR 4 0 是否可以执行 CLR 2 0 IL 而无需重新编译源代码 这是一个好文章 http blogs msdn com clrteam archive 2009 06 07 in process side by side part
  • Tensorflow Keras 错误:未知的图像文件格式。需要 JPEG、PNG、GIF、BMP 之一

    我正在训练一个分类器 并确保所有图片都是 jpg 但仍然出现此错误 InvalidArgumentError 未知的图像文件格式 需要 JPEG PNG GIF BMP 之一 节点解码图像 解码图像 IteratorGetNext 操作 i
  • Swift 数组(重复:,计数:)行为

    为什么只有一个元素labels数组显示为子视图view 特别是当使用Array repeating count let labels Array repeating UILabel count 7 print labels count 7
  • 在应用程序之间发送信息

    再会 我有一个客户端应用程序 它将客户端打开的应用程序列表发送到服务器 它特别发送文件路径 文件名和主机名 我的问题是发送的数据在服务器接收时应该进行序列化和反序列化 我是 C 新手 所以我对序列化知之甚少 这是客户端 private Li
  • 如何获取客户/用户位置详细信息

    在我的应用程序中 我想跟踪客户端 用户位置以存储在数据库中 我正在使用此代码来获取用户 IP 地址 string VisitorsIPAddr string Empty if HttpContext Current Request Serv
  • Python 中从十六进制到补码

    有没有一种简单的方法可以在 python 中生成补码 例如 如果您采用十六进制值0x9E 我需要将其转换为0x61 我需要将二进制 1 替换为 0 将 0 替换为 1 感觉这个应该很简单 只需使用异或运算符 http docs python
  • 静态工具操作的静态类与静态结构?

    我需要创建一个仅包含静态方法的 工具 类或结构 对于具有 PHP 背景的人来说 结构实际上并不存在 我正在读这个为什么选择结构而不是类 https stackoverflow com questions 24232799 why choos
  • Javascript window.onload 无法在 iOS 强制门户/网络中工作

    我在 jsp 文件的标头中有这段代码 由于某种原因 它在桌面和移动浏览器上运行良好 但在 iOS 强制门户上 仅触发第一个警报 有谁知道为什么 我想到了 使用这个作品
  • REST API 中的查询参数可以是强制的吗[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我有一个要求 规定必须有两个参数 其中一个代表日期 作为 GET URI 的一部分必须是强制性的 但这两个参数仅用于过滤目的 所以我的问题是 强
  • 禁用移动 Chrome 浏览器中的滑动手势

    移动版 Chrome IOS Android 有一个功能 如果您在屏幕的左侧或右侧边缘滑动 它会更改选项卡 我的网络应用程序使用滑动 而这个 功能 似乎只是妨碍 有办法禁用这个吗 不 没有办法禁用此手势 有一张请求该功能的票证位于https
  • JavaScript:递归查找树中元素的所有父级

    我有一棵这样的树 var datas tree name name1 tree name name2 name name3 name name4 tree name name5 name name6
  • 是否可以调整 PDFBOX 中的文本?

    PDFBOX API 中是否有任何功能可以使文本对齐 或者我们必须手动执行此操作 如果手动 那么如何使用java 其背后的逻辑 调整文本 这个较旧的答案 https stackoverflow com questions 19635275