为什么 PyMupdf 文档显示错误,没有属性“new_page”,当它是 PDF 时?

问题描述

我正在对 PDF 进行注释,我想更改其颜色。我被引导到这个有用的链接https://pymupdf.readthedocs.io/en/latest/faq.html#how-to-add-and-modify-annotations

我使用了链接中的代码

# -*- coding: utf-8 -*-
"""
-------------------------------------------------------------------------------
Demo script showing how annotations can be added to a PDF using PyMuPDF.

It contains the following annotation types:
Caret,Text,FreeText,text markers (underline,strike-out,highlight,squiggle),Circle,Square,Line,polyLine,polygon,FileAttachment,Stamp
and Redaction.
There is some effort to vary appearances by adding colors,line ends,opacity,rotation,dashed lines,etc.

Dependencies
------------
PyMuPDF v1.17.0
-------------------------------------------------------------------------------
"""
from __future__ import print_function

import gc
import sys

import fitz

print(fitz.__doc__)
if fitz.VersionBind.split(".") < ["1","17","0"]:
    sys.exit("PyMuPDF v1.17.0+ is needed.")

gc.set_debug(gc.DEBUG_UNCOLLECTABLE)

highlight = "this text is highlighted"
underline = "this text is underlined"
strikeout = "this text is striked out"
squiggled = "this text is zigzag-underlined"
red = (1,0)
blue = (0,1)
gold = (1,1,0)
green = (0,0)

displ = fitz.Rect(0,50,50)
r = fitz.Rect(72,72,220,100)
t1 = u"têxt üsès Lätiñ charß,\nEUR: €,mu: µ,super scripts: ²³!"


def print_descr(annot):
    """Print a short description to the right of each annot rect."""
    annot.parent.insert_text(
        annot.rect.br + (10,-5),"%s annotation" % annot.type[1],color=red
    )


doc = fitz.open()
page = doc.new_page()

page.set_rotation(0)

annot = page.add_caret_annot(r.tl)
print_descr(annot)

r = r + displ
annot = page.add_freetext_annot(
    r,t1,fontsize=10,rotate=90,text_color=blue,fill_color=gold,align=fitz.TEXT_ALIGN_CENTER,)
annot.set_border(width=0.3,dashes=[2])
annot.update(text_color=blue,fill_color=gold)
print_descr(annot)

r = annot.rect + displ
annot = page.add_text_annot(r.tl,t1)
print_descr(annot)

# Adding text marker annotations:
# first insert a unique text,then search for it,then mark it
pos = annot.rect.tl + displ.tl
page.insert_text(
    pos,# insertion point
    highlight,# inserted text
    morph=(pos,fitz.Matrix(-5)),# rotate around insertion point
)
rl = page.search_for(highlight,quads=True)  # need a quad b/o tilted text
annot = page.add_highlight_annot(rl[0])
print_descr(annot)

pos = annot.rect.bl  # next insertion point
page.insert_text(pos,underline,morph=(pos,fitz.Matrix(-10)))
rl = page.search_for(underline,quads=True)
annot = page.add_underline_annot(rl[0])
print_descr(annot)

pos = annot.rect.bl
page.insert_text(pos,strikeout,fitz.Matrix(-15)))
rl = page.search_for(strikeout,quads=True)
annot = page.add_strikeout_annot(rl[0])
print_descr(annot)

pos = annot.rect.bl
page.insert_text(pos,squiggled,fitz.Matrix(-20)))
rl = page.search_for(squiggled,quads=True)
annot = page.add_squiggly_annot(rl[0])
print_descr(annot)

pos = annot.rect.bl
r = fitz.Rect(pos,pos.x + 75,pos.y + 35) + (0,20,20)
annot = page.add_polyline_annot([r.bl,r.tr,r.br,r.tl])  # 'polyline'
annot.set_border(width=0.3,dashes=[2])
annot.set_colors(stroke=blue,fill=green)
annot.set_line_ends(fitz.PDF_ANNOT_LE_CLOSED_ARROW,fitz.PDF_ANNOT_LE_R_CLOSED_ARROW)
annot.update(fill_color=(1,0))
print_descr(annot)

r += displ
annot = page.add_polygon_annot([r.bl,r.tl])  # 'polygon'
annot.set_border(width=0.3,fill=gold)
annot.set_line_ends(fitz.PDF_ANNOT_LE_DIAMOND,fitz.PDF_ANNOT_LE_CIRCLE)
annot.update()
print_descr(annot)

r += displ
annot = page.add_line_annot(r.tr,r.bl)  # 'Line'
annot.set_border(width=0.3,fitz.PDF_ANNOT_LE_CIRCLE)
annot.update()
print_descr(annot)

r += displ
annot = page.add_rect_annot(r)  # 'Square'
annot.set_border(width=1,dashes=[1,2])
annot.set_colors(stroke=blue,fill=gold)
annot.update(opacity=0.5)
print_descr(annot)

r += displ
annot = page.add_circle_annot(r)  # 'Circle'
annot.set_border(width=0.3,fill=gold)
annot.update()
print_descr(annot)

r += displ
annot = page.add_file_annot(
    r.tl,b"just anything for testing","testdata.txt"  # 'FileAttachment'
)
print_descr(annot)  # annot.rect

r += displ
annot = page.add_stamp_annot(r,stamp=10)  # 'Stamp'
annot.set_colors(stroke=green)
annot.update()
print_descr(annot)

r += displ + (0,10)
rc = page.insert_textBox(
    r,"This content will be removed upon applying the redaction.",color=blue,)
annot = page.add_redact_annot(r)
print_descr(annot)

doc.save(__file__.replace(".py","-%i.pdf" % page.rotation),deflate=True)

我一直遇到这个错误

AttributeError: 'Document' object has no attribute 'new_page'

我已经在其他一些 PDF 上尝试过它,但它似乎不起作用,但是,PYMUDF 文档 https://pymupdf.readthedocs.io/en/latest/document.html#Document.new_page 描述它应该具有此属性

如何启用插入新页面以消除此错误

解决方法

他们似乎将其命名为 _newPage()。该文档还指出了一个名为 insert_page() 的方法,该方法也不存在。文档似乎与最新版本不同步。