我们正在网站上张贴扫描和OCRed文档,需要 for each 页面添加一个链接,以便通过搜索引擎找到页面的人可以轻松找到相关文档的父索引.

我一直在try 使用pypdf在Python中实现这一点,但到目前为止还没有任何成功.我的策略是让每个文档创建一个只包含超链接的页面(每个文档需要不同的超链接),然后将创建的页面合并到文档中的每个页面中.我修改了我在SE中找到的代码(主要针对PyPdf2,据我所知,它已被弃用,需要针对pypdf对其进行重大修改).

例如,在pypdf文档页面中,我try :

from pypdf import PdfWriter, PdfReader

stamp = PdfReader("bg.pdf").pages[0]
writer = PdfWriter(clone_from="source.pdf")
for page in writer.pages:
    page.merge_page(stamp, over=False)  # here set to False for watermarking

writer.write("out.pdf")

并生成损坏的PDF文件.

推荐答案

这对我来说就像一种魅力:

先决条件:

pip install pypdf==4.1.0
pip install fpdf2==2.7.8

代码:

import fpdf  # pip install fpdf2
from fpdf.enums import XPos, YPos

import pypdf
from pypdf import PdfReader, PdfWriter


def generate_overlay(target_path: str, text: str, link: str) -> None:
    class PDF(fpdf.FPDF):
        def header(self) -> None:
            self.set_font("helvetica", "B", 12)
            self.set_text_color(0, 0, 255)  # Blue color for the link
            link_width = pdf.get_string_width(text)
            link_height = 10
            self.cell(
                link_width,
                link_height,
                text=text,
                new_x=XPos.RIGHT,
                new_y=YPos.TOP,
                align="C",
                link=link,
            )

    pdf = PDF()
    pdf.add_page()
    pdf.output(target_path)


def stamp(original_path: str, stamp_path: str, out_path: str) -> None:
    stamp = PdfReader(stamp_path).pages[0]
    writer = PdfWriter(clone_from=original_path)
    for page in writer.pages:
        page.merge_page(stamp, over=False)
    writer.write(out_path)



if __name__ == "__main__":
    print(f"pypdf=={pypdf.__version__}")
    print(f"fpdf2=={fpdf.__version__}")
    stamp_path = "stamp.pdf"
    generate_overlay(stamp_path, "py-pdf.github.io", "https://py-pdf.github.io")
    stamp(stamp_path, "GeoTopo.pdf", "out.pdf")

它应该打印:

pypdf==4.1.0
fpdf2==2.7.8

Python相关问答推荐

使用新的类型语法正确注释ParamSecdecorator (3.12)

抓取rotowire MLB球员新闻并使用Python形成表格

如何避免Chained when/then分配中的Mypy不兼容类型警告?

按顺序合并2个词典列表

为什么默认情况下所有Python类都是可调用的?

为一个组的每个子组绘制,

如何根据一列的值有条件地 Select 前N组?

用砂箱开发Web统计分析

SQLAlchemy bindparam在mssql上失败(但在mysql上工作)

幂集,其中每个元素可以是正或负""""

基于Scipy插值法的三次样条系数

如何在Great Table中处理inf和nans

当单元测试失败时,是否有一个惯例会抛出许多类似的错误消息?

判断Python操作:如何从字面上得到所有decorator ?

如何获得3D点的平移和旋转,给定的点已经旋转?

获取PANDA GROUP BY转换中的组的名称

Django在一个不是ForeignKey的字段上加入'

在任何要保留的字段中添加引号的文件,就像在Pandas 中一样

替换包含Python DataFrame中的值的<;

为什么在生成时间序列时,元组索引会超出范围?