PyPDF2添加的URI链接在浏览器可见,Preview/Adobe中不显示如何修复?
修复PyPDF2添加的虚线链接边框在专业PDF阅读器不显示的问题
问题根源在于PyPDF2的border='dott'参数生成的PDF注释结构不符合官方标准,浏览器做了兼容解析,但Preview、Adobe这类严格遵循PDF规范的阅读器无法识别。要解决这个问题,需要手动按照PDF标准定义链接注释的边框样式。
修复后的代码示例
# !pip install PyPDF2 from PyPDF2 import PdfReader, PdfWriter from PyPDF2.generic import RectangleObject as ro, DictionaryObject, NameObject, ArrayObject, NumberObject reader = PdfReader('filename.pdf') writer = PdfWriter() for page in reader.pages: writer.add_page(page) # 添加URI链接,不使用默认border参数 link_annot = writer.add_uri( page_number=0, uri="https://github.com/", rect=ro([280, 10, 302, 20]) ) # 按照PDF标准定义边框样式 # Border数组格式:[宽度, 水平圆角半径, 垂直圆角半径],圆角设为0即直角边框 link_annot[NameObject("/Border")] = ArrayObject([NumberObject(1), NumberObject(0), NumberObject(0)]) # 创建边框样式字典,指定虚线样式并定义虚实间隔 border_style = DictionaryObject() border_style[NameObject("/S")] = NameObject("/D") # /D代表虚线样式 border_style[NameObject("/D")] = ArrayObject([NumberObject(2), NumberObject(2)]) # 2单位实线+2单位空白的循环 link_annot[NameObject("/BS")] = border_style output = open('filename2.pdf','wb') writer.write(output) output.close()
关键说明
- PDF标准中,链接注释的边框需要通过
/Border和/BS(Border Style)字典共同定义,PyPDF2的border简化封装生成的结构不被专业阅读器认可。 /Border的第一个数值是边框宽度,后两个是圆角半径,按需调整即可。/BS里的/D数组控制虚线的虚实段长度,比如改成[3,1]会得到更密集的虚线效果。
内容的提问来源于stack exchange,提问作者ElphiusMostafa
相关产品推荐
相关产品推荐

