如何使用 reportlab 在图像顶部叠加文本超链接?
How to overlay text hyperlink on top of an image using reportlab?
我正在尝试创建一个包含许多页面的 pdf 文档。每个页面都包含一个图像,图像顶部显示带有指向其他页面的超链接的文本。
我已经设法使用 reportlab.pdfgen
和矩形链接做到了这一点,不幸的是,所使用的 reader(e-reader)无法识别这种类型的链接。
取而代之,我设法创建了文本嵌入超链接(使用 How to add a link to the word using reportlab?),我的 e-reader 可以识别这些超链接,但我没有设法将它们覆盖在图像上。
我尝试使用此 post (reportlab: add background image by using platypus) 中提供的解决方案来使用图像作为背景,但它不起作用。当我将文档的页面大小设置为图像大小时,该段落未显示。当我将它设置为比图像大的尺寸时,段落显示在图像上方而不是覆盖它。
这是我的代码:
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import BaseDocTemplate, PageTemplate, Frame, Paragraph
def draw_static(canvas, doc):
# Save the current settings
canvas.saveState()
# Draw the image
canvas.drawImage(r'path\to\the\image.png', 0, 0, width=500, height=500)
# Restore setting to before function call
canvas.restoreState()
# Set up a basic template
doc = BaseDocTemplate('test.pdf', pagesize=(500, 500))
# Create a Frame for the Flowables (Paragraphs and such)
frame = Frame(doc.leftMargin, doc.bottomMargin, 500, 500, id='normal')
# Add the Frame to the template and tell the template to call draw_static for each page
template = PageTemplate(id='test', frames=[frame], onPage=draw_static)
# Add the template to the doc
doc.addPageTemplates([template])
# All the default stuff for generating a document
styles = getSampleStyleSheet()
story = []
link = '<link href="http://example.com">Text</link>'
P = Paragraph(link, styles["Normal"])
story.append(P)
doc.build(story)
PS: 此代码不完整(不创建多个页面等...)但只是尝试覆盖文本的最小示例图像上的嵌入式超链接。
我终于找到了一个更简单的解决方案,只使用来自鸭嘴兽的框架,结合 pdfgen 工具。
解法:
from reportlab.pdfgen import canvas
from reportlab.platypus import Paragraph, Frame
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.units import inch
c = canvas.Canvas("test.pdf")
styles = getSampleStyleSheet()
style = styles['Title']
items = []
link = '<link href="http://example.com">Text</link>'
items.append(Paragraph(link, style))
# Drawing the image
c.drawInlineImage(r'path\to\image', 0, 0)
# Create a Frame for the paragraph
f = Frame(inch, inch, inch, inch, showBoundary=1)
f.addFromList(items, c)
c.save()
我正在尝试创建一个包含许多页面的 pdf 文档。每个页面都包含一个图像,图像顶部显示带有指向其他页面的超链接的文本。
我已经设法使用 reportlab.pdfgen
和矩形链接做到了这一点,不幸的是,所使用的 reader(e-reader)无法识别这种类型的链接。
取而代之,我设法创建了文本嵌入超链接(使用 How to add a link to the word using reportlab?),我的 e-reader 可以识别这些超链接,但我没有设法将它们覆盖在图像上。
我尝试使用此 post (reportlab: add background image by using platypus) 中提供的解决方案来使用图像作为背景,但它不起作用。当我将文档的页面大小设置为图像大小时,该段落未显示。当我将它设置为比图像大的尺寸时,段落显示在图像上方而不是覆盖它。
这是我的代码:
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import BaseDocTemplate, PageTemplate, Frame, Paragraph
def draw_static(canvas, doc):
# Save the current settings
canvas.saveState()
# Draw the image
canvas.drawImage(r'path\to\the\image.png', 0, 0, width=500, height=500)
# Restore setting to before function call
canvas.restoreState()
# Set up a basic template
doc = BaseDocTemplate('test.pdf', pagesize=(500, 500))
# Create a Frame for the Flowables (Paragraphs and such)
frame = Frame(doc.leftMargin, doc.bottomMargin, 500, 500, id='normal')
# Add the Frame to the template and tell the template to call draw_static for each page
template = PageTemplate(id='test', frames=[frame], onPage=draw_static)
# Add the template to the doc
doc.addPageTemplates([template])
# All the default stuff for generating a document
styles = getSampleStyleSheet()
story = []
link = '<link href="http://example.com">Text</link>'
P = Paragraph(link, styles["Normal"])
story.append(P)
doc.build(story)
PS: 此代码不完整(不创建多个页面等...)但只是尝试覆盖文本的最小示例图像上的嵌入式超链接。
我终于找到了一个更简单的解决方案,只使用来自鸭嘴兽的框架,结合 pdfgen 工具。
解法:
from reportlab.pdfgen import canvas
from reportlab.platypus import Paragraph, Frame
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.units import inch
c = canvas.Canvas("test.pdf")
styles = getSampleStyleSheet()
style = styles['Title']
items = []
link = '<link href="http://example.com">Text</link>'
items.append(Paragraph(link, style))
# Drawing the image
c.drawInlineImage(r'path\to\image', 0, 0)
# Create a Frame for the paragraph
f = Frame(inch, inch, inch, inch, showBoundary=1)
f.addFromList(items, c)
c.save()