如何使用 PDFbox 创建固定宽度的段落?

2023-12-29

我可以插入这样的简单文本:

document = new PDDocument();
page = new PDPage(PDPage.PAGE_SIZE_A4);
document.addPage(page);
PDPageContentStream content = new PDPageContentStream(document, page);
content.beginText();
content.moveTextPositionByAmount (10 , 10);
content.drawString ("test text");
content.endText();
content.close();

但是如何使用 width 属性创建类似于 HTML 的段落呢?

<p style="width:200px;">test text</p>

Warning:此答案适用于旧版本的 PDFBox,并依赖于已弃用的功能。请参阅下面的评论了解更多详细信息。

根据这个答案 https://stackoverflow.com/a/7598157/520779不可能在某些文本中插入换行符并让 PDF 正确显示它(无论使用 PDFBox 还是其他东西),所以我相信自动换行某些文本以适应某些宽度也可能是它无法自动执行的操作。 (此外,有很多方法可以对文本进行换行 - 仅整个单词、将其分成较小的部分等)

这个答案 https://stackoverflow.com/a/6531362/520779另一个问题(关于将字符串居中)给出了一些关于如何自己执行此操作的指示。假设你写了一个函数possibleWrapPoints(String):int[]要列出文本中可能发生自动换行的所有点(不包括“零”,包括“文本长度”),一种可能的解决方案可能是:

PDFont font = PDType1Font.HELVETICA_BOLD; // Or whatever font you want.
int fontSize = 16; // Or whatever font size you want.
int paragraphWidth = 200;
String text = "test text";

int start = 0;
int end = 0;
int height = 10;
for ( int i : possibleWrapPoints(text) ) {
    float width = font.getStringWidth(text.substring(start,i)) / 1000 * fontSize;
    if ( start < end && width > paragraphWidth ) {
        // Draw partial text and increase height
        content.moveTextPositionByAmount(10 , height);
        content.drawString(text.substring(start,end));
        height += font.getFontDescriptor().getFontBoundingBox().getHeight() / 1000 * fontSize;
        start = end;
    }
    end = i;
}
// Last piece of text
content.moveTextPositionByAmount(10 , height);
content.drawString(text.substring(start));

一个例子possibleWrapPoints,允许在不属于单词的任何点进行换行(参考 https://stackoverflow.com/a/2206432/520779), 可能:

int[] possibleWrapPoints(String text) {
    String[] split = text.split("(?<=\\W)");
    int[] ret = new int[split.length];
    ret[0] = split[0].length();
    for ( int i = 1 ; i < split.length ; i++ )
        ret[i] = ret[i-1] + split[i].length();
    return ret;
}

Update:一些附加信息:

  • PDF 文件格式被设计为在不同情况下看起来相同,您所请求的功能在 PDF 编辑器/创建器中有意义,但在 PDF 文件中则不然per se。因此,大多数“低级”工具倾向于专注于处理文件格式本身,而忽略类似的内容。

  • 更高级别的工具 OTOH 通常具有进行此转换的方法。一个例子是Platypus http://www.reportlab.com/apis/reportlab/dev/platypus.html#(不过对于 Python 来说)do有创建段落的简单方法,并且依赖于较低级别报告实验室 http://www.reportlab.com/函数来进行实际的 PDF 渲染。我不知道 PDFBox 有类似的工具,但是这个帖子 https://blogs.oracle.com/chrisf/entry/converting_html_to_pdf_using给出了一些关于如何使用免费工具在 Java 环境中将 HTML 内容转换为 PDF 的提示。我自己还没有尝试过,但我在这里发布是因为它可能有用(以防我上面的手工尝试还不够)。

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

如何使用 PDFbox 创建固定宽度的段落? 的相关文章

  • 哪些 HTML 元素不能包含子节点?

    我一直在寻找一份详尽的清单 但在任何地方都找不到 为了避免必须仔细阅读规范 有谁知道它们是什么 我认为可以包含子元素的补充元素列表也很有用 XHTML 1 和 HTML5 之间的列表有何不同 您可以在以下位置找到 void 元素 不能有任何
  • 如何在具有相同值的下拉菜单上触发 jQuery 更改事件

    即使用户选择相同的值 如何每次都触发 jQuery 更改事件 我需要刷新效果 例如如果用户选择Lawyer它会发出警报hello然后用户再次选择Lawyer从下拉菜单中 它应该发出警报hello 我怎样才能实现它 以下是代码 jQuery
  • 如何根据另一个下拉列表中的选择动态填充下拉列表中的选项?

    我有一个表 其中包含类别信息 例如产品 我已将它们列在下拉菜单中 现在 我需要做的是 在下一个下拉菜单中列出所选类别的子类别 我希望 javascript 是必需的 但我对 javascript 还不太熟悉 将非常感谢您的帮助 你应该使用
  • 选择单选按钮时隐藏/显示 3 个文本框

    我有 2 个单选按钮 选择一个文本框时 我想显示 3 个文本框 并在选择其他文本框时隐藏它 这是代码 这是我的 2 个单选按钮
  • 从 JSON 文件注入的编译指令 AngularJS

    希望有人能帮助我应对这一挑战 我使用以下命令从服务器请求 JSON 数据 http get 来自服务器的数据返回一个对象 对象中的一个值包含 HTML 标记 该标记使用以下方式注入到页面中 div div 在标记内 有一个名为的自定义指令
  • 动态突出显示时向

    添加项目符号点?

    Update 例子 p Text Text p 在示例中 是否可以选择第二个 文本 单词 p 元素并单击按钮仅动态添加项目符号点到选定的 单词 有没有可能 在一个 p p Text p 突出显示从 p 元素并添加项目符号点到按钮上动态单击的
  • jQuery 位置 DIV 固定在滚动顶部

    我有一个相当长的页面 在布局的菜单中 有一个弹出菜单 我希望菜单的弹出部分显示在页面顶部 即使用户已将菜单栏滚动到视图之外 这是菜单的 HTML div div Compare up to 3 cards side by side Clic
  • html 空格引起的非常奇怪的错误

    我在 Firefox 中遇到了一个非常奇怪的错误 我在外部文件中有一个 javascript 函数 可以在常规复杂性网站上完美运行 然而 我一直在整理一些演示示例并遇到一些奇怪的事情 html 格式如下 在编辑器中 div p Q Wher
  • 如何向我的网站添加 Google 搜索框?

    我正在尝试将 Google 搜索框添加到我自己的网站 我希望它搜索谷歌本身 而不是我的网站 我曾经有一些代码可以工作 但现在不再工作
  • HTML 属性不带引号?

    我一直认为html的属性中需要引号 div class service definition or div class service definition 但最近我注意到 w3 验证器不会将以下内容识别为错误 div class serv
  • 创建一个简单的 10 秒倒计时

    我想要一行这样写的 Your download will begin in 10 9 8 etc Beginning on page load seconds 我已经设置了 10 秒下载文本 并且我还查看了其他 stackoverflow
  • 将文本大小调整为矩形 在 Canvas HTML5 中调整大小

    我是 Canvas 新手 我正在创建一个网站 以在调整矩形大小时增加文本 我尝试了很多 但没有任何效果 实际上 我希望如果我仅按其宽度调整矩形大小 向左拉伸 向右拉伸 则仅应增加文本宽度而不是字体大小 我已经完成了字体大小 但发现增加孤立文
  • 淘汰赛绑定,每个都可进行自定义

    我这里有一个情况 用于淘汰每个带有定制的绑定 这是我的代码 div div table tbody tr td td td td tr tbody table div div
  • ToggleClass 动画 jQuery?

    我的网站上有一个部分 当用户单击时我希望它展开 我正在使用 jQuerytoggleClass为了这 expandable function e e preventDefault this closest article toggleCla
  • 禁用特定 div 上的 Tab 键

    我有以下结构 div div Some content div div Some content div div 我想 禁用 div2 上的 tab 键 我的意思是按下 tab 键时 div2 的元素不会获得焦点 有没有简单的方法可以使用
  • Knockout.js 安全绑定

    我想使用带有淘汰赛的安全绑定 为此我使用敲除安全绑定 js https github com brianmhunt knockout secure binding 谁能解释一下为什么下面的代码不起作用 它会抛出一个错误 未捕获 淘汰 安全
  • 元素和 svg 形状之间的白线

    大家好 我正在使用由 shapedivider 生成的 svg 整形器 您可以看到 有一条白线 我不知道为什么它在那里以及如何删除它 请你帮助我好吗 有形状分隔符的代码 custom shape divider bottom 1640714
  • HTML 输入 - 名称与 ID [重复]

    这个问题在这里已经有答案了 使用 HTML 时
  • 如何使用Python保存“完整的网页”而不仅仅是基本的html

    我正在使用以下代码来使用 Python 保存网页 import urllib import sys from bs4 import BeautifulSoup url http www vodafone de privat tarife r
  • 强制输入数字小数位

    我想强制

随机推荐