以下代码对应于一个最小的PDF页面,其中包含由矩形和文本内部的文本定义的链接注释:
%PDF-1.4
1 0 obj
<</Type/Catalog /Pages 3 0 R>>
endobj
3 0 obj
<</Type/Pages/Kids[4 0 R]/Count 1>>
endobj
4 0 obj
<</Type/Page/Parent 3 0 R/MediaBox [ 0 0 612 792]/Resources<</ProcSet[/PDF/Text]/Font<</F1 <</Type/Font/Subtype/Type1/Name/F1/BaseFont/Helvetica/Encoding/MacRomanEncoding>>>>>>/Contents 2 0 R/Annots [<</Type/Annot/Subtype/Link/Rect[100 400 350 450]/Border[0 0 1]/C[0 1 1]/A<</S/URI/URI(https://stackoverflow.com)>>>>]>>
endobj
2 0 obj
<</Length 59>>
stream
BT /F1 24 Tf 1 0 0 1 115 415 Tm (Go to StackOverflow)Tj
ET
endstream
xref
0 5
0000000060 65535 f
0000000009 00000 n
0000000441 00000 n
0000000055 00000 n
0000000106 00000 n
trailer
<</Size 5 /Root 1 0 R>>
startxref
540
%%EOF
如何设置注释的背景颜色和透明度?例如,我想制作背景(链接框,而不是整个页面)青色,但仍然能够读取文本“Go to Stackoverflow”。
我已经检查了ISO标准,但这是一个可怕的文字。它似乎可以通过“Appearance Streams”(注释属性a.k.a./AP),但无法弄清楚如何做到这一点。我希望尽管有一种更直接的方式(àla/ C [0 1 1])我可能会失踪。
我正在尝试从头开始编写PDF文件,作为编写我自己的代码来操作PDF的第一步。此外,学习一些我想要的东西可能有助于黑客攻击一些已经可用的库,而不会浪费时间来破译我不需要的代码。
感谢。
注意:如果您复制并粘贴代码以进行测试,请确保每行的最后一个字符是换行符,即在最后一个可见字符后没有空格或制表符。看到的字节数取决于此。
编辑:我的注释外观,我有问题让它与它一起工作。 注释条目
<</Type/Annot/Subtype/Link/Rect 7 0 R/Border[0 0 1]/C[0 1 1]/A 8 0 R/AP 10 0 R/AS/N>>
和相应的表单XObject
10 0 obj
<</Type XObject/Subtype Form/BBox[100 400 350.0 450.0]/Resources 4 0 R/Length 74>>
stream
4 w q /GS0 gs 105.0 405.0 240.0 040.0 re 1.0 0.0 0.0 rg 0.0 0.0 1.0 RG B Q
endstream
endobj
根据此表格,我在屏幕上没有链接突出显示或边框。
答案 0 :(得分:2)
链接注释的PDF规范仅定义了自定义边框的设置(边框, C , BS )和突出显示模式,即在其活动区域内按下或按住鼠标按钮时应使用的视觉效果( H )。所以,没有什么可以设置正常的背景。
在这种情况下,您总是可以提供自定义的外观流( AP ),这确实可以提供透明度:
从PDF 1.4开始,注释外观可能包括透明度。如果外观的流字典不包含组条目,则应将其视为非隔离的非敲除透明组。否则,应使用组字典中指定的隔离值和挖空值(见11.6.6“透明组XObjects”)。
(第12.5.5节 - 外观流 - 在ISO 32000-1中)
所以你可以尝试这种方法。
不幸的是,规范指定 AP 如下:
AP 字典(可选; PDF 1.2)一个外观字典,指定如何在页面上以可视方式显示注释(请参阅12.5.5,“外观流”) 。单个注释处理程序可以忽略此条目并提供自己的外观。
因此,任何PDF查看器都可能会忽略您的自定义外观并提供自己的链接可视化。
因此,为链接注释下方的内容添加彩色背景的唯一可靠方法是将该背景添加到页面内容。您可以执行此操作这个例如在现有内容下添加彩色矩形。如果内容不是文本而是某些图像,您可以使用透明度或(甚至更好)混合模式变暗或乘法在现有内容上绘制彩色矩形。
一句话:将注释添加到页面的方式无效:在您的页面对象中
<</Type/Page [...] /Annots [<</Type/Annot/Subtype/Link/Rect[100 400 350 450]/Border[0 0 1]/C[0 1 1]/A<</S/URI/URI(https://stackoverflow.com)>>>>]>>
特别是,您可以使用 Annots 数组中的直接字典对象来定义注释。但规范要求:
Annots array (可选)一组注释字典,应包含对与该页面关联的所有注释的间接引用(请参阅12.5,“注释”)。
(表30 - 页面对象中的条目 - 在ISO 32000-1中)
因此,数组必须包含间接引用到注释词典。
PDF查看者,特别是Adobe Reader,不会抱怨,因为他们对查看的PDF的有效性通常非常宽松,但其他PDF处理软件可能会遇到问题。
您发表了评论
我正在努力为我的这个例子添加一个最小/ AP资源。你能提供吗?
这里的对象构建一个页面,其中包含内容文本及其上的链接以及具有特殊混合模式的外观流:
4 0 obj
<</Rect[95 494.77 134.18 515.77]/Subtype/Link/H/Highlight/Dest(green)/AP<</N 2 0 R>>>>
endobj
5 0 obj
<</Length 35>>stream
/F1 15 Tf
BT
100 500 Td
(Test)Tj
ET
endstream
endobj
7 0 obj
<</Type/Page/MediaBox[0 0 595 842]/Resources<</Font<</F1 1 0 R>>>>/Annots[4 0 R]/Contents 5 0 R/Parent 6 0 R>>
endobj
1 0 obj
<</Type/Font/Subtype/Type1/BaseFont/Helvetica/Encoding/WinAnsiEncoding>>
endobj
2 0 obj
<</Type/XObject/Subtype/Form/Resources<</ExtGState<</GS1 3 0 R>>>>/BBox[0 0 39.18 21]/FormType 1/Matrix [1 0 0 1 0 0]/Length 34>>stream
/GS1 gs
0 1 0 rg
0 0 39.18 21 re
f
endstream
endobj
3 0 obj
<</BM/Darken>>
endobj
不幸的是,Adobe Reader在显示PDF时决定忽略此外观流
在其他观众中,特别是在预览者中,往往只是采取给定的外观,你会看到这个
有趣的是,Adobe Acrobat 9.5 export-as-image 确实使用了外观流......毕竟这是一个奇怪的世界......