gpt4 book ai didi

java - 在PDFBox中,如何创建带有 "rollover"/"mouse over"效果的链接注释?

转载 作者:行者123 更新时间:2023-11-30 06:15:58 24 4
gpt4 key购买 nike

问题:

使用 PDFBox,如何创建具有“鼠标悬停”颜色效果(也称为滚动/鼠标悬停)的链接注释?

这意味着当我将鼠标光标悬停在 PDF 文件中的链接上时(没有单击它),该链接会变为不同的颜色。如果我将鼠标移开,链接会变回原来的颜色。

例如:

我正在寻找的效果类似于 stackoverflow 网站上的链接。当您将鼠标光标悬停在(不单击)“提问”按钮上时,链接会从灰色变为橙色。当您将光标移开时,颜色会变回灰色。例如,请参见下图:我想在 PDF 文件中实现完全相同的效果

Example

我尝试过的:

在PDF Reference Sixth Edition中,是这样描述的:

the rollover appearance is used when the user moves the cursor into the annotation’s active area without pressing the mouse button"

[rollover appearance] are defined in an appearance dictionary, which in turn is the value of the AP entry in the annotation dictionary

此外,

在PDFBox中,有一个PDAppearanceDictionary类,它有一个setRolloverAppearance()方法。

这是我能到达的最远的地方。我不知道如何将 PDAppearanceDictionary 类(如果这确实是正确的类)与 PDAnnotationLink 类结合使用,以达到我想要的结果。

我曾尝试在 Google 上查找示例,但没有成功。

最佳答案

简而言之

对于这种翻转效应是否可能存在一些不确定性。使用最新的 Adob​​e PDF 查看器(Reader XI 和 Acrobat 9.5)进行显示,链接注释没有出现所需的翻转效果。不过,对于按钮小部件(带有相同的 URL 操作),效果确实出现了。

详细

test code将自定义为按钮的 PDAnnotationLinkPDAnnotationWidget 提供给一种方法,该方法将相应的注释嵌入文档并为其添加正常和翻转外观:

void createRollover(PDAnnotation annotation, String filename) throws IOException, COSVisitorException
{
PDDocument document = new PDDocument();
PDPage page = new PDPage();
document.addPage(page);
List<PDAnnotation> annotations = page.getAnnotations();

float x = 100;
float y = 500;
String text = "PDFBox";
PDFont font = PDType1Font.HELVETICA_BOLD;
float textWidth = font.getStringWidth(text) / 1000 * 18;

PDPageContentStream contents = new PDPageContentStream(document, page);
contents.beginText();
contents.setFont(font, 18);
contents.moveTextPositionByAmount(x, y);
contents.drawString(text);
contents.endText();
contents.close();

PDAppearanceDictionary appearanceDictionary = new PDAppearanceDictionary();
PDAppearanceStream normal = createAppearanceStream(document, textWidth, font, "0.5 0.5 0.5 rg");
PDAppearanceStream rollover = createAppearanceStream(document, textWidth, font, "1 0.7 0.5 rg");
PDAppearanceStream down = createAppearanceStream(document, textWidth, font, "0 0 0 rg");
appearanceDictionary.setNormalAppearance(normal);
appearanceDictionary.setRolloverAppearance(rollover);
appearanceDictionary.setDownAppearance(down);
annotation.setAppearance(appearanceDictionary);

PDRectangle position = new PDRectangle();
position.setLowerLeftX(x);
position.setLowerLeftY(y - 5);
position.setUpperRightX(x + textWidth);
position.setUpperRightY(y + 20);
annotation.setRectangle(position);

annotations.add(annotation);
document.save(new File(RESULT_FOLDER, filename));
document.close();
}

PDAnnotationLink 的情况下:

annotation normal annotation rollover

如果是按钮 PDAnnotationWidget:

pushbutton normal pushbutton rollover

背景:

他的问题中的 OP 和评论中的@Tilman 提到了 PDF 规范:

An annotation may define as many as three separate appearances: [...]

• The rollover appearance shall be used when the user moves the cursor into the annotation’s active area without pressing the mouse button. [...]

The normal, rollover, and down appearances shall be defined in an appearance dictionary, which in turn is the value of the AP entry in the annotation dictionary

因此,认为:

So it should be possible

不过,他们没有考虑到规范将外观字典引入为:

AP dictionary (Optional; PDF 1.2) An appearance dictionary specifying how the annotation shall be presented visually on the page (see 12.5.5, “Appearance Streams”). Individual annotation handlers may ignore this entry and provide their own appearances.

因此,如果 PDF 查看器中的注释处理程序具有有自己的想法。

tl;dr:完全由相关 PDF 查看器来决定它使用哪些外观流以及忽略哪些外观流并以自己的方式替换。

如果使用注释外观流,则应始终确保在忽略给定外观的情况下也提供最有可能使用的信息,例如在链接注释下方包含常规页面内容。

关于java - 在PDFBox中,如何创建带有 "rollover"/"mouse over"效果的链接注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28144941/

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