添加 PDF 注释¶
附件¶
from pypdf import PdfWriter
writer = PdfWriter()
writer.add_blank_page(width=200, height=200)
data = b"any bytes - typically read from a file"
writer.add_attachment("smile.png", data)
with open("output.pdf", "wb") as output_stream:
writer.write(output_stream)
自由文本¶
如果你想在一个框中添加文本,如下所示:
你可以使用 {class}
~pypdf.annotations.FreeText` 类:
from pypdf import PdfReader, PdfWriter
from pypdf.annotations import FreeText
# 填充写入器与所需的页面
pdf_path = os.path.join(RESOURCE_ROOT, "crazyones.pdf")
reader = PdfReader(pdf_path)
page = reader.pages[0]
writer = PdfWriter()
writer.add_page(page)
# 创建注释并添加
annotation = FreeText(
text="Hello World\nThis is the second line!",
rect=(50, 550, 200, 650),
font="Arial",
bold=True,
italic=True,
font_size="20pt",
font_color="00ff00",
border_color="0000ff",
background_color="cdcdcd",
)
# 设置注释标志为4,用于可打印注释。
# 有关其他选项(例如隐藏等),请参阅“AnnotationFlag”。
annotation.flags = 4
writer.add_annotation(page_number=0, annotation=annotation)
# 将带有注释的文件写入磁盘
with open("annotated-pdf.pdf", "wb") as fp:
writer.write(fp)
文本¶
文本注释看起来像这样:
线条¶
如果你想添加一条线,如下所示:
你可以使用 {class}
~pypdf.annotations.Line` 类:
from pypdf import PdfReader, PdfWriter
from pypdf.annotations import Line
pdf_path = os.path.join(RESOURCE_ROOT, "crazyones.pdf")
reader = PdfReader(pdf_path)
page = reader.pages[0]
writer = PdfWriter()
writer.add_page(page)
# 添加线条
annotation = Line(
text="Hello World\nLine2",
rect=(50, 550, 200, 650),
p1=(50, 550),
p2=(200, 650),
)
writer.add_annotation(page_number=0, annotation=annotation)
# 将带有注释的文件写入磁盘
with open("annotated-pdf.pdf", "wb") as fp:
writer.write(fp)
多边形线¶
如果你想添加一条如下所示的多边形线:
你可以使用 {class}
~pypdf.annotations.PolyLine` 类:
from pypdf import PdfReader, PdfWriter
from pypdf.annotations import PolyLine
pdf_path = os.path.join(RESOURCE_ROOT, "crazyones.pdf")
reader = PdfReader(pdf_path)
page = reader.pages[0]
writer = PdfWriter()
writer.add_page(page)
# 添加多边形线
annotation = PolyLine(
vertices=[(50, 550), (200, 650), (70, 750), (50, 700)],
)
writer.add_annotation(page_number=0, annotation=annotation)
# 将带有注释的文件写入磁盘
with open("annotated-pdf.pdf", "wb") as fp:
writer.write(fp)
矩形¶
如果你想添加一个矩形,如下所示:
你可以使用 {class}
~pypdf.annotations.Rectangle` 类:
from pypdf import PdfReader, PdfWriter
from pypdf.annotations import Rectangle
pdf_path = os.path.join(RESOURCE_ROOT, "crazyones.pdf")
reader = PdfReader(pdf_path)
page = reader.pages[0]
writer = PdfWriter()
writer.add_page(page)
# 添加矩形
annotation = Rectangle(
rect=(50, 550, 200, 650),
)
writer.add_annotation(page_number=0, annotation=annotation)
# 将带有注释的文件写入磁盘
with open("annotated-pdf.pdf", "wb") as fp:
writer.write(fp)
如果你希望矩形填充颜色,可以使用 interiour_color="ff0000"
参数。
此方法使用 PDF 格式中的“方形”注释类型。
椭圆¶
如果你想添加一个圆形,如下所示:
你可以使用 {class}
~pypdf.annotations.Ellipse` 类:
from pypdf import PdfReader, PdfWriter
from pypdf.annotations import Ellipse
pdf_path = os.path.join(RESOURCE_ROOT, "crazyones.pdf")
reader = PdfReader(pdf_path)
page = reader.pages[0]
writer = PdfWriter()
writer.add_page(page)
# 添加椭圆
annotation = Ellipse(
rect=(50, 550, 200, 650),
)
writer.add_annotation(page_number=0, annotation=annotation)
# 将带有注释的文件写入磁盘
with open("annotated-pdf.pdf", "wb") as fp:
writer.write(fp)
多边形¶
如果你想添加一个多边形,如下所示:
你可以使用 {class}
~pypdf.annotations.Polygon` 类:
from pypdf import PdfReader, PdfWriter
from pypdf.annotations import Polygon
pdf_path = os.path.join(RESOURCE_ROOT, "crazyones.pdf")
reader = PdfReader(pdf_path)
page = reader.pages[0]
writer = PdfWriter()
writer.add_page(page)
# 添加多边形
annotation = Polygon(
vertices=[(50, 550), (200, 650), (70, 750), (50, 700)],
)
writer.add_annotation(page_number=0, annotation=annotation)
# 将带有注释的文件写入磁盘
with open("annotated-pdf.pdf", "wb") as fp:
writer.write(fp)
弹出窗口¶
管理标记的弹出窗口,外观如下:
你可以使用 {py:class}
~pypdf.annotations.Popup` 类:
from pypdf.annotations import Popup, Text
# 设置
writer = pypdf.PdfWriter()
writer.append(os.path.join(RESOURCE_ROOT, "crazyones.pdf"), [0])
# 操作
text_annotation = writer.add_annotation(
0,
Text(
text="Hello World\nThis is the second line!",
rect=(50, 550, 200, 650),
open=True,
),
)
popup_annotation = Popup(
rect=(50, 550, 200, 650),
open=True,
parent=text_annotation, # 使用add_annotation的输出结果
)
writer.write("annotated-pdf-popup.pdf")
你必须使用 add_annotation()
返回的结果,因为这是此弹出窗口注释应该关联的父注释。
链接¶
如果你想添加一个链接,可以使用 {class}
~pypdf.annotations.Link` 类:
from pypdf import PdfReader, PdfWriter
from pypdf.annotations import Link
pdf_path = os.path.join(RESOURCE_ROOT, "crazyones.pdf")
reader = PdfReader(pdf_path)
page = reader.pages[0]
writer = PdfWriter()
writer.add_page(page)
# 添加链接
annotation = Link(
rect=(50, 550, 200, 650),
url="https://martin-thoma.com/",
)
writer.add_annotation(page_number=0, annotation=annotation)
# 将带有注释的文件写入磁盘
with open("annotated-pdf.pdf", "wb") as fp:
writer.write(fp)
你还可以添加内部链接:
from pypdf import PdfReader, PdfWriter
from pypdf.annotations import Link
from pypdf.generic import Fit
pdf_path = os.path.join(RESOURCE_ROOT, "crazyones.pdf")
reader = PdfReader(pdf_path)
page = reader.pages[0]
writer = PdfWriter()
writer.add_page(page)
# 添加链接
annotation = Link(
rect=(50, 550, 200, 650),
target_page_index=3,
fit=Fit(fit_type="/FitH", fit_args=(123,)),
)
writer.add_annotation(page_number=0, annotation=annotation)
# 将带有注释的文件写入磁盘
with open("annotated-pdf.pdf", "wb") as fp:
writer.write(fp)
文本标记注释¶
文本标记注释是指文档中特定的一段文字。
这些注释稍微复杂一些,因为你需要确切知道文本所在的位置,即所谓的“Quad点”。
高亮显示¶
如果你想像这样高亮显示文本:
你可以使用 {class}
~pypdf.annotations.Highlight` 类:
from pypdf import PdfReader, PdfWriter
from pypdf.annotations import Highlight
from pypdf.generic import ArrayObject, FloatObject
pdf_path = os.path.join(RESOURCE_ROOT, "crazyones.pdf")
reader = PdfReader(pdf_path)
page = reader.pages[0]
writer = PdfWriter()
writer.add_page(page)
rect = (50, 550, 200, 650)
quad_points = [rect[0], rect[1], rect[2], rect[1], rect[0], rect[3], rect[2], rect[3]]
# 添加高亮注释
annotation = Highlight(
rect=rect,
quad_points=ArrayObject([FloatObject(quad_point) for quad_point in quad_points]),
)
writer.add_annotation(page_number=0, annotation=annotation)
# 将带有注释的文件写入磁盘
with open("annotated-pdf.pdf", "wb") as fp:
writer.write(fp)