当前位置: 首页 > 知识库问答 >
问题:

如何使用ApachePDFBox-java将文本字段对齐/排列成两列布局

微生善
2023-03-14

我正在使用ApachePDFBox(版本:2.0.8)从我的。jspx页面。

在我的. jspx页面表单中,有很多字段,所以我决定将所有字段排列为2列布局。所以,我需要建议使用PDFbox来实现布局。

//我用来生成PDF的示例代码片段如下。

   PDDocument document = new PDDocument();
   PDPage page = new PDPage();
   document.addPage(page);
   PDFont font = getFontDef();
   PDPageContentStream contentStream =new PDPageContentStream(document, page);
   contentStream.beginText();
   contentStream.showText("Name: " );
   contentStream.setFont(getFontDef().COURIER ,15);
   contentStream.showText ("Rajeev");
   contentStream.showText("Address: " +"BNG");
   contentStream.newLine();
   contentStream.showText("State: " +"KAR");
   contentStream.showText("Country: " +"INDIA");
   contentStream.endText();
   contentStream.close();

我需要以粗体字体和数值(分别为Rajeev、BNG、KAR、IND)显示标签(即姓名、地址、州和国家),作为普通字体
为了获得标签的粗体字体,我尝试了如下所示

contentStream.setFont(getFontDef().COURIER ,15);

这是工作,但我必须添加上述行之前每个标签字段。有什么更好的方法,我可以用来设置所有的标签加粗字体?

在将这些表单字段对齐成两列布局时,我也面临一些问题。例如

姓名:拉吉耶夫

i、 e.姓名和地址在第一行,姓名应在第一列,地址应在第二列。同样,州和国家在第二行,州在第一列,国家在第二列。

共有1个答案

魏刚豪
2023-03-14

要在列中排列文本,可以使用newlineatofset水平移动,而不是或至少不是垂直移动。

要在粗体和普通字体之间来回切换,通常确实需要反复设置和重置字体。或者,您可以先绘制所有粗体文本,然后绘制所有普通文本(或者反过来),但随后必须使用更多的newlineatofset调用来跳转。此外,当您尝试选择和复制文本时,一些PDF查看器可能会跟随您的跳跃。

PDFont fontNormal = PDType1Font.HELVETICA;
PDFont fontBold = PDType1Font.HELVETICA_BOLD;

PDPageContentStream contentStream =new PDPageContentStream(document, page);
contentStream.beginText();
contentStream.newLineAtOffset(100, 600);
contentStream.setFont(fontBold, 15);
contentStream.showText("Name: ");
contentStream.setFont(fontNormal, 15);
contentStream.showText ("Rajeev");
contentStream.newLineAtOffset(200, 00);
contentStream.setFont(fontBold, 15);
contentStream.showText("Address: " );
contentStream.setFont(fontNormal, 15);
contentStream.showText ("BNG");
contentStream.newLineAtOffset(-200, -20);
contentStream.setFont(fontBold, 15);
contentStream.showText("State: " );
contentStream.setFont(fontNormal, 15);
contentStream.showText ("KAR");
contentStream.newLineAtOffset(200, 00);
contentStream.setFont(fontBold, 15);
contentStream.showText("Country: " );
contentStream.setFont(fontNormal, 15);
contentStream.showText ("INDIA");
contentStream.endText();
contentStream.close();

(ArrangeText testtestArrangeTextForUser2967784

我不知道你的方法getFontDef()返回什么,所以我在这里为粗体和普通文本选择了固定字体。

结果:

 类似资料:
  • 我想将两个项目对齐到另一个元素,但我有问题。 现在,如果我将顶部文本约束到left元素的顶部,将底部文本约束到left元素的底部,并将它们链接起来。整个文本就会移动。我想修复顶部的文本元素,但如果文本较少,仍将其居中

  • 问题内容: 将被转换成“输入”有用的“所需的输出”? 输入项 所需的输出 问题答案: 正确对齐的一个技巧是使用:

  • 我正在尝试对两个熊猫数据框列进行排序。我知道Python有自己的内置函数: 但我想知道熊猫是否也有这个功能,是否可以将两列作为一对一起完成。 例如,我有以下数据集: 我想获得以下信息: 基本上我在这里做的是,我正在对列“特征”进行排序,以从最小值到最大值,但是我希望“总和”中的相应值也发生变化。 有人能帮我解决这个问题吗?我在Stackoverflow上看到过其他帖子,但是我没有找到解释这个过程的

  • 问题内容: public class SequenceControlNumber extends SequenceGenerator { 在我的模型类中,这是我的注释: 但我不断收到一个属性值异常。 问题答案: 检查类中generate方法返回的值。 BTW在以下SO问题中检查此响应:hibernateJPA序列(非ID)

  • 问题内容: 如何按两列对CSV文件进行排序?现在,我可以按一列对其进行排序。我需要按前两列对其进行排序。怎么做?这是我用来按其第一列进行排序的代码: 编辑:两列排序后的输出变为: 我需要这样的输出: 但是,我希望第三列显示当前在第三列中显示的值中X的最小值,然后显示Y的最小值,然后显示Z。 问题答案: 尽管创建类作为 域的 适当表示通常是一个好主意:在这种情况下,我 不同意 注释。 读取CSV并按

  • 我有一个将GridBagLayout作为布局的JDialog。它包含一个JPanel子级,该子级也有一个GridBagLayout作为布局。父级包含其他字段,每个字段设置在两列中(标签-编辑器)。子级包含几个字段,每个字段设置在三列中(标签-编辑器-标签)。我希望子级和父级的第一列对齐在一起。这是它现在的样子: 家长相关代码: 儿童相关代码: 有没有办法通过GridBagLayout获得所需的行为