gpt4 book ai didi

java - PDFbox 索引文档中的重叠链接

转载 作者:行者123 更新时间:2023-11-30 07:20:48 28 4
gpt4 key购买 nike

我是 PDFBox 的新手,我遇到了一个目前无法找到解决方法的问题。

我从数据库中获取了位于这些文件夹中的文件夹和文档的列表,我迭代所有这些数据以生成一个索引,其中包含指向正确文件夹/文档路径的 Activity 链接。 (假设我有一个根文件夹,我想在该根文件夹中有一个 pdf 索引,并包含指向其中包含的所有文件夹和文档的相对链接)

主要代码如下:

    try {
PDDocument document = new PDDocument();
PDPage page = new PDPage();

document.addPage(page);

PDFont font = PDType1Font.HELVETICA;


PDPageContentStream contentStream = new PDPageContentStream(document, page);
contentStream.beginText();
contentStream.setFont(font, 12);
contentStream.moveTextPositionByAmount(100, 700);
contentStream.drawString("Índice " + expediente.getNombre());
contentStream.endText();


int i = 0;
for (Folder currFol : root.getFolders()) {
for (Document currDoc : currFol.getDocuments()) {
i++;

float x = 50;
float y = 250;
String text = currFol.getName() + "/" + currDoc.getName();
float textWidth = font.getStringWidth(text) / 1000 * 12;

PDAnnotationLink link = new PDAnnotationLink();
PDGamma colourBlue = new PDGamma();
colourBlue.setB(1);
link.setColour(colourBlue);

// add an action
PDActionURI action = new PDActionURI();
action.setURI(currFol.getName() + "/" + currDoc.getName());

link.setAction(action);

contentStream.beginText();
contentStream.setFont(font, 12);
contentStream.moveTextPositionByAmount(x, y);
contentStream.drawString(text);
contentStream.endText();

PDRectangle position = new PDRectangle();
position.setLowerLeftX(x);
position.setLowerLeftY(y -(i* 5));
position.setUpperRightX(x + textWidth);
position.setUpperRightY(y + 50);
link.setRectangle(position);

page.getAnnotations().add(link);
}
}
// Make sure that the content stream is closed:

contentStream.close();

document.save(output);

document.close();
} catch (Exception e) {
e.printStackTrace();
}

我的问题是,所有元素都打印重叠,文本和框相互重叠,目前无法找到如何正确打印列表格式样式中的所有链接来创建索引。

任何想法或建议都将非常感激。

我尝试遵循一些教程,但目前没有成功,例如 http://www.programcreek.com/java-api-examples/index.php?api=org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationLink , http://www.massapi.com/class/pd/PDAnnotationLink.html .

我尝试不使用 PDRectangle,仅使用文本链接(因为我发现的所有示例中都存在 PDRectangle,但我实际上并不需要它)

谢谢,

最佳答案

在内部循环中,您始终将 xy 设置为相同的值

float x = 50;
float y = 250;

此后您无需更改。然后从 xy

开始绘制相应的文本
contentStream.beginText();
contentStream.setFont(font, 12);
contentStream.moveTextPositionByAmount(x, y);
contentStream.drawString(text);
contentStream.endText();

因此,您可以从相同的坐标开始绘制每个条目。因此,所有文本重叠也就不足为奇了。

此外,您还可以像这样设置链接的位置和大小:

PDRectangle position = new PDRectangle();
position.setLowerLeftX(x);
position.setLowerLeftY(y -(i* 5));
position.setUpperRightX(x + textWidth);
position.setUpperRightY(y + 50);
link.setRectangle(position);

因此,每个链接的上y坐标始终为y + 50,即300,下y 每次迭代链接的坐标向下移动 5。因此,第一个链接的垂直范围包含在第二个链接的垂直范围中,而第二个链接又包含在第三个链接的垂直范围中,等等。这些注释重叠也就不足为奇了。

因此,这与 PDFBox 新手无关,而只是与正确获取坐标有关...;)

<小时/>

不如这样:

float x = 50;
float y = 650;

for (Folder currFol : root.getFolders()) {
for (Document currDoc : currFol.getDocuments()) {
String text = currFol.getName() + "/" + currDoc.getName();
float textWidth = font.getStringWidth(text) / 1000.0 * 12;

PDAnnotationLink link = new PDAnnotationLink();
PDGamma colourBlue = new PDGamma();
colourBlue.setB(1);
link.setColour(colourBlue);

// add an action
PDActionURI action = new PDActionURI();
action.setURI(currFol.getName() + "/" + currDoc.getName());

link.setAction(action);

contentStream.beginText();
contentStream.setFont(font, 12);
contentStream.moveTextPositionByAmount(x, y);
contentStream.drawString(text);
contentStream.endText();

PDRectangle position = new PDRectangle();
position.setLowerLeftX(x);
position.setLowerLeftY(y - 3);
position.setUpperRightX(x + textWidth);
position.setUpperRightY(y + 12);
link.setRectangle(position);

page.getAnnotations().add(link);

y -= 15;
}
}

关于java - PDFbox 索引文档中的重叠链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37610654/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com