如何正确定位和激活PDF中的超链接?

时间:2018-06-26 06:01:27

标签: pdf pdf-generation

我正在尝试编写将超链接添加到现有PDF文档的代码。 我已经尝试通过遵循PDF 32000规范来做到这一点,但似乎我缺少了一些东西。

PDF查看器显示了我的链接注释,并将鼠标指针悬停在它们上时将其鼠标指针更改为“ finger”,但是未显示URL,并且单击它们没有任何作用

PDF内容如下所示。

页面:

/Type/Page
/Parent 1 0 R
/MediaBox[0 0 594.75 841.5]
/Contents 7 0 R
/Resources 8 0 R
/Annots [5 0 R 6 0 R] % added by me

第一个注释(针对“ Google”,第5个):

/Type /Annot
/Subtype /Link
/Rect [60.0 779.25 150.0 767.25]
/BS
<<
    /W 2 % should be 0, set to 2 to be able to see the annotation's position
>>
/F 4
/A
<<
    /Type /Action
    /Subtype /URI
    /URI (https://google.com)
>>

第二个注释(对于“ DuckDuckGo”,#6):

/Type /Annot
/Subtype /Link
/Rect [342.0 694.5 432.0 682.5]
/BS
<<
    /W 2 % should be 0, set to 2 to be able to see the annotation's position
>>
/F 4
/A
<<
    /Type /Action
    /Subtype /URI
    /URI (https://duckduckgo.com)
>>

内容流:

1 0 0 -1 36.0 841.5 cm
-100 Tz
q
/Font3 -9.0 Tf
0.0 0.0 0.0 rg
24.0 62.25 90.0 12.0 re W n
BT
1 0 0 1 0 0 Tm
24.75 69.75 Td
(Google) Tj
ET
Q
q
/Font3 -9.0 Tf
0.0 0.0 0.0 rg
306.0 147.0 90.0 12.0 re W n
BT
1 0 0 1 0 0 Tm
306.75 154.5 Td
(DuckDuckGo) Tj
ET
Q

此代码产生以下结果:

rendered pdf

Generated PDF file is available here.

我看了一下Microsoft Word为链接生成的代码,它看起来几乎一样(缩小和结构化父级;此代码有效,但我的无效):

/Subtype/Link/Rect[ 69.75 697.51 113.16 720] /BS
<<
    /W 0
>>
/F 4/A
<<
    /Type/Action/S/URI/URI(https://google.com/) 
>>
/StructParent 0

任何建议将不胜感激。

2 个答案:

答案 0 :(得分:1)

您必须分析页面内容并处理所有影响文本位置的运算符,才能计算Google和DuckDuckGo的确切位置。然后将链接注释放置在计算出的位置。

答案 1 :(得分:1)

您的动作字典如下:

<<
    /Type /Action
    /Subtype /URI
    /URI (https://google.com)
>>

但是,如果您查找ISO 32000-1第12.6.2节动作字典,则会看到动作类型不是 Subtype 的值,而是的 S

  

S   名称   (必需)该词典描述的操作类型;具体值请参见表194。

(ISO 32000-1表193 –所有操作词典共有的条目)

因此,在您的 Action 词典中(不过周围的 Annot 词典中的 not )! ),将/Subtype替换为/S

/Type /Annot
/Subtype /Link                    %<------------- not here
/Rect [342.0 694.5 432.0 682.5]
/BS
<<
    /W 2 % should be 0, set to 2 to be able to see the annotation's position
>>
/F 4
/A
<<
    /Type /Action
    /S /URI                       %<------------- but here
    /URI (https://duckduckgo.com)
>>