第九篇【传奇开心果系列】Python自动化办公库技术点案例示例:深度解读Python处理PDF文件

传奇开心果博文系列

  • 系列博文目录
    • Python自动化办公库技术点案例示例系列
  • 博文目录
    • 前言
    • 一、重要作用介绍
    • 二、Python库处理PDF文件基础操作和高级操作介绍
      • (一)基础操作介绍
      • (二)高级操作介绍
    • 三、Python库处理PDF文件基础操作示例代码
      • (一)读取PDF文件示例代码
      • (二)提取文本示例代码
      • (三)提取图像示例代码
      • (四)合并PDF文件示例代码
      • (五)拆分PDF文件示例代码
    • 四、Python库处理PDF文件的高级操作
      • (一)文本搜索和替换示例代码
      • (二)提取表格数据示例代码
      • (三)创建PDF文件示例代码
      • (四)导出为其他格式示例代码
      • (五)提取元数据示例代码
      • (六)OCR光学字符识别示例代码
      • (七)编辑PDF文件示例代码
      • (八)页面提取和重新排序示例代码
      • (九)添加编辑删除注释和标记示例代码
      • (十)使用PyPDF4库进行表单处理示例代码
      • (十一)数字签名示例代码
      • (十二)压缩和优化示例代码
      • (十三)批量处理示例代码
    • 五、归纳知识点

系列博文目录

Python自动化办公库技术点案例示例系列

博文目录

前言

在这里插入图片描述

Python库在处理PDF文件的操作方面提供了广泛的功能和灵活性,可以满足自动化办公、数据分析、数据挖掘、计算机视觉和文档加密和保护等不同领域和场景的需求,从而提高工作效率、简化任务流程,并增强数据处理能力。

一、重要作用介绍

在这里插入图片描述

Python库处理PDF文件的操作可以应用于多个领域和场景,具有以下作用:

  1. 数据提取和分析:通过提取PDF文件中的文本和表格数据,可以进行数据分析、文本挖掘、自然语言处理等任务。这对于从大量的PDF文档中提取有用信息非常有用,例如从报告、调查问卷或科学论文中提取数据。

  2. 文档处理和转换:可以使用Python库对PDF文件进行处理和转换,如合并多个PDF文件、拆分单个PDF文件、旋转页面、裁剪页面等。这对于管理和处理大量PDF文档非常有用,例如在文档管理系统中对PDF文件进行整理和优化。

  3. 文档生成和报告生成:使用Python库可以生成新的PDF文件,根据需要添加文本、图像、表格和其他元素。这对于自动生成报告、生成可打印的文档或创建自定义文档非常有用。

  4. 文档搜索和替换:通过Python库可以在PDF文件中进行文本搜索,并且可以进行替换操作。这对于批量处理PDF文档、批量替换特定文本或进行全文搜索非常有用。

  5. 图像处理和识别:可以使用Python库从PDF文件中提取图像,并进行图像处理、图像识别或图像分析。这对于处理包含图像的PDF文档、进行图像识别任务或进行计算机视觉研究非常有用。

  6. 文档安全和保护:通过Python库可以对PDF文件进行加密、权限设置、水印添加等操作,以确保文档的安全性和保护。这对于保护敏感信息、控制文档访问权限或添加品牌标识非常有用。

二、Python库处理PDF文件基础操作和高级操作介绍

在这里插入图片描述

Python提供了多个库用于处理PDF文件,这些库可以实现基础操作和高级操作。

(一)基础操作介绍

Python提供了多个库用于处理PDF文件,其中最常用的是PyPDF4和PDFMiner。这些库可以帮助你执行以下基本操作:

  1. 读取PDF文件:使用这些库可以打开和读取PDF文件的内容。

  2. 提取文本:你可以使用这些库从PDF文件中提取文本内容,以便进行进一步的处理和分析。

  3. 提取图像:有时候你可能需要从PDF文件中提取图像,这些库可以帮助你实现这一目标。

  4. 合并PDF文件:你可以使用这些库将多个PDF文件合并成一个单独的PDF文件。

  5. 拆分PDF文件:如果你需要将一个大的PDF文件拆分成多个小的文件,这些库也可以帮助你实现。

(二)高级操作介绍

除了基本操作,还有一些高级操作可以在Python中使用PDF库进行PDF文件处理。下面的操作是一些高级操作:

  1. 文本搜索和替换:你可以使用PDF库搜索PDF文件中的文本,并进行替换或修改。

  2. 提取表格数据:PDF文件中的表格数据通常以文本或图像形式存在。你可以使用PDF库将表格数据提取为结构化的数据,以便进一步处理或导出到其他格式。

  3. 创建PDF文件:除了读取和修改现有的PDF文件,你还可以使用PDF库创建全新的PDF文件。你可以添加文本、图像、表格和其他元素来生成自定义的PDF文件。

  4. 导出为其他格式:有时候你可能需要将PDF文件转换为其他格式,如文本、图像或HTML。PDF库可以帮助你将PDF文件导出为这些格式。

  5. 提取元数据:PDF文件通常包含元数据,如标题、作者、创建日期等。你可以使用PDF库提取这些元数据,并进行进一步的处理和分析。

  6. OCR(光学字符识别):如果PDF文件是扫描的图像或包含非可编辑的文本,你可以使用OCR库结合Python的PDF文件处理库,将图像中的文字识别为可编辑的文本。

  7. 编辑PDF文件:对PDF文件进行修改、添加或删除内容的操作。编辑PDF文件可以包括以下功能:

a. 添加文本和图像:你可以使用PDF库在PDF文件的指定位置添加新的文本或图像元素。

b. 修改文本和图像:PDF库可以让你对现有的文本和图像进行修改,如更改字体、大小、颜色,或调整图像的位置和大小。

c. 删除内容:你可以使用PDF库删除PDF文件中的特定页面、文本、图像或其他元素。

d. 旋转和裁剪:PDF库允许你对PDF页面进行旋转和裁剪操作,以调整页面的方向和大小。

e. 添加链接和导航:你可以使用PDF库在PDF文件中添加超链接或导航功能,使读者可以点击链接跳转到其他页面或网址。

f. 加密和保护:PDF库提供了高级加密和保护PDF文件的功能,包括密码保护、权限设置和水印添加等。

  1. 页面提取和重新排序:你可以使用PDF库提取特定页面或重新排序PDF文件中的页面,以满足特定需求。

  2. 注释和标记:PDF文件支持注释和标记功能,你可以使用PDF库添加、编辑或删除注释和标记,以便进行协作和交流。

  3. 表单处理:如果PDF文件包含填写表单,你可以使用PDF库读取和填写表单数据,或者创建自定义的表单。

  4. 数字签名:PDF文件可以进行数字签名,以确保文件的完整性和认证。你可以使用PDF库生成和验证数字签名。

  5. 压缩和优化:PDF文件通常可以进行压缩和优化,以减小文件大小并提高加载速度。PDF库可以帮助你进行这些操作。

  6. 批量处理:如果你需要对大量的PDF文件进行相似的操作,如批量提取文本或合并文件,你可以使用PDF库编写脚本来自动化处理过程。

需要注意的是,不同的PDF库提供的功能和接口可能会有所不同。因此,在选择适合你需求的PDF库时,建议查阅它们的文档和示例代码,以了解其具体功能和用法。

三、Python库处理PDF文件基础操作示例代码

在这里插入图片描述

(一)读取PDF文件示例代码

使用PyPDF4库可以打开和读取PDF文件的内容。以下是使用PyPDF4库读取PDF文件的基本步骤:

  1. 安装PyPDF4库:使用pip命令安装PyPDF4库。在命令行中运行以下命令:

    pip install PyPDF4
    
  2. 导入PyPDF4库:在Python脚本中导入PyPDF4库。

    import PyPDF4
    
  3. 打开PDF文件:使用open()函数打开PDF文件。

    pdf_file = open('path/to/pdf_file.pdf', 'rb')
    

    这里的'path/to/pdf_file.pdf'是PDF文件的路径,'rb'表示以二进制模式读取文件。

  4. 创建PdfFileReader对象:使用PdfFileReader()函数创建一个PdfFileReader对象,将打开的PDF文件对象作为参数传递给它。

    pdf_reader = PyPDF4.PdfFileReader(pdf_file)
    
  5. 读取PDF内容:通过PdfFileReader对象可以访问PDF文件的各个部分,如页面、书签、元数据等。

    -获取总页数:

    total_pages = pdf_reader.numPages
    print("总页数:", total_pages)
    

    -读取特定页面的文本内容:

    page_number = 0  # 页码从0开始
    page = pdf_reader.getPage(page_number)
    text = page.extractText()
    print("第一页的文本内容:", text)
    

    -遍历所有页面并读取文本内容:

    for page_number in range(total_pages):page = pdf_reader.getPage(page_number)text = page.extractText()print("第", page_number+1, "页的文本内容:", text)
    
  6. 关闭PDF文件:使用close()方法关闭PDF文件。

    pdf_file.close()
    

这样,你就可以使用PyPDF4库打开和读取PDF文件的内容了。请注意,PyPDF4库对于某些特殊类型的PDF文件可能不兼容,因此在处理PDF文件之前,最好对文件进行测试和验证。

(二)提取文本示例代码

以下是使用PyPDF4库提取PDF文件中文本的示例代码:

import PyPDF4def extract_text_from_pdf(pdf_path):pdf_file = open(pdf_path, 'rb')pdf_reader = PyPDF4.PdfFileReader(pdf_file)7total_pages = pdf_reader.numPagesextracted_text = ""for page_number in range(total_pages):page = pdf_reader.getPage(page_number)text = page.extractText()extracted_text += textpdf_file.close()return extracted_text# 示例用法
pdf_path = 'path/to/pdf_file.pdf'
text = extract_text_from_pdf(pdf_path)
print(text)

在上面的代码中,extract_text_from_pdf()函数接受一个PDF文件的路径作为参数,并返回提取的文本内容。你可以将你要提取文本的PDF文件的路径替换为pdf_path变量的值。然后,调用extract_text_from_pdf()函数并将返回的文本存储在text变量中。最后,使用print()函数打印提取的文本内容。

请注意,PyPDF4库提取文本的效果取决于PDF文件的内容和结构。对于某些复杂的PDF文件,提取的文本可能不完全准确。此外,如果PDF文件中的文本是以图像形式存在的,PyPDF4库可能无法提取该文本。在这种情况下,你可能需要使用OCR(光学字符识别)技术来提取图像中的文本。

(三)提取图像示例代码

在这里插入图片描述

  1. 从PDF文件提取图像初级操作示例代码

要从PDF文件中提取图像,你可以使用PyPDF4库的PdfFileReader类和PdfFileWriter类。以下是一个示例代码,演示了如何使用PyPDF4库提取PDF文件中的图像:

import PyPDF4def extract_images_from_pdf(pdf_path, output_folder):pdf_file = open(pdf_path, 'rb')pdf_reader = PyPDF4.PdfFileReader(pdf_file)total_pages = pdf_reader.numPagesfor page_number in range(total_pages):page = pdf_reader.getPage(page_number)if '/XObject' in page['/Resources']:x_objects = page['/Resources']['/XObject'].getObject()for obj in x_objects:if x_objects[obj]['/Subtype'] == '/Image':image = x_objects[obj]image_data = image._dataif '/Filter' in image:if image['/Filter'] == '/FlateDecode':img_data = image_dataelif image['/Filter'] == '/DCTDecode':img_data = image_dataelif image['/Filter'] == '/JPXDecode':img_data = image_data# 提取图像文件的名称image_name = f"image_{page_number + 1}_{obj[1:]}.{image['/ColorSpace'][1:]}"image_path = f"{output_folder}/{image_name}"# 将图像数据写入图像文件with open(image_path, 'wb') as image_file:image_file.write(img_data)print(f"提取图像:{image_name}")pdf_file.close()# 示例用法
pdf_path = 'path/to/pdf_file.pdf'
output_folder = 'path/to/output_folder'
extract_images_from_pdf(pdf_path, output_folder)

在上面的代码中,extract_images_from_pdf()函数接受PDF文件的路径和输出文件夹的路径作为参数。它使用PdfFileReader类打开PDF文件,并遍历每个页面。对于每个页面,它检查是否存在图像对象(/XObject),并提取图像数据。然后,它根据图像的压缩方式(/Filter)将图像数据写入相应的图像文件中。

你可以将你要提取图像的PDF文件的路径替换为pdf_path变量的值,并将输出文件夹的路径替换为output_folder变量的值。运行代码后,它将提取PDF文件中的所有图像,并将它们保存在指定的输出文件夹中。

请注意,PyPDF4库提取图像的能力有限,特别是对于一些复杂的PDF文件。如果你需要更高级的图像提取功能,可能需要使用其他专门的图像处理库或工具。

  1. 从PDF文件提取图像高级操作示例代码

如果你需要更高级的图像提取功能,并且希望在Python中使用更专业的库,你可以考虑使用pdf2image库结合Tesseract OCR引擎。Tesseract是一个开源的OCR引擎,可以用于识别和提取PDF文件中的文本和图像。

以下是一个示例代码,演示了如何使用pdf2image和Tesseract库来提取PDF文件中的图像:

from pdf2image import convert_from_path
import pytesseract
from PIL import Imagedef extract_images_from_pdf(pdf_path, output_folder):images = convert_from_path(pdf_path)for i, image in enumerate(images):image_name = f"image_{i + 1}.png"image_path = f"{output_folder}/{image_name}"image.save(image_path, "PNG")print(f"提取图像:{image_name}")# 使用Tesseract OCR提取图像中的文本text = pytesseract.image_to_string(image)print(f"图像中的文本:{text}")# 示例用法
pdf_path = 'path/to/pdf_file.pdf'
output_folder = 'path/to/output_folder'
extract_images_from_pdf(pdf_path, output_folder)

在上面的代码中,我们首先使用pdf2image库的convert_from_path函数将PDF文件转换为图像列表。然后,我们遍历图像列表,并将每个图像保存为PNG格式的文件。接下来,我们使用pytesseract库的image_to_string函数对每个图像进行OCR处理,提取其中的文本内容。

你可以将要提取图像的PDF文件路径替换为pdf_path变量的值,并将输出文件夹路径替换为output_folder变量的值。运行代码后,它将提取PDF文件中的所有图像,并将它们保存为PNG格式的图像文件。同时,它还会使用Tesseract OCR引擎提取每个图像中的文本内容。

请注意,为了运行上述代码,你需要安装pdf2imagepytesseractPillow库,并且还需要安装Tesseract OCR引擎。你可以使用以下命令来安装这些库:

pip install pdf2image pytesseract Pillow

另外,你还需要下载并安装Tesseract OCR引擎。你可以从Tesseract官方网站(https://github.com/tesseract-ocr/tesseract)下载适合你操作系统的版本,并按照安装说明进行安装。

这种方法结合了pdf2image库和Tesseract OCR引擎的功能,提供了更高级的图像提取和文本识别能力。你可以根据自己的需求对提取的图像和文本进行进一步的处理和分析。

(四)合并PDF文件示例代码

以下是使用PyPDF4进行PDF合并的示例代码:

from PyPDF4 import PdfFileMergerdef merge_pdfs(input_paths, output_path):merger = PdfFileMerger()for path in input_paths:merger.append(path)merger.write(output_path)merger.close()# 示例用法
input_paths = ['path/to/file1.pdf', 'path/to/file2.pdf', 'path/to/file3.pdf']
output_path = 'path/to/output.pdf'
merge_pdfs(input_paths, output_path)

在上面的代码中,我们首先创建一个PdfFileMerger对象。然后,我们遍历输入PDF文件的路径列表,并使用append方法将每个PDF文件添加到合并器中。最后,我们使用write方法将合并后的PDF文件保存到指定的输出路径,并使用close方法关闭合并器。

你可以将要合并的PDF文件路径列表替换为input_paths变量的值,并将输出PDF文件的路径替换为output_path变量的值。运行代码后,它将合并所有输入的PDF文件,并将它们保存为一个单独的PDF文件。

(五)拆分PDF文件示例代码

以下是使用PyPDF4进行PDF拆分的示例代码:

from PyPDF4 import PdfFileReader, PdfFileWriterdef split_pdf(input_path, output_paths):pdf = PdfFileReader(input_path)for i in range(pdf.getNumPages()):page = pdf.getPage(i)output = PdfFileWriter()output.addPage(page)with open(output_paths[i], 'wb') as output_file:output.write(output_file)# 示例用法
input_path = 'path/to/large_file.pdf'
output_paths = ['path/to/output1.pdf', 'path/to/output2.pdf', 'path/to/output3.pdf']
split_pdf(input_path, output_paths)

在上面的代码中,我们首先使用PdfFileReader打开输入的大PDF文件。然后,我们使用getNumPages方法获取PDF文件的总页数,并使用循环遍历每一页。

对于每一页,我们创建一个新的PdfFileWriter对象,并将当前页添加到该对象中。然后,我们使用open函数以二进制写入模式打开输出文件,并使用write方法将输出文件保存为一个单独的PDF文件。

你可以将要拆分的大PDF文件的路径替换为input_path变量的值,并将输出PDF文件的路径列表替换为output_paths变量的值。运行代码后,它将拆分大的PDF文件并将每一页保存为一个单独的PDF文件。

四、Python库处理PDF文件的高级操作

在这里插入图片描述

(一)文本搜索和替换示例代码

  1. 初级操作示例代码

PyPDF4库提供了一些方法来搜索和修改PDF文件中的文本内容。以下是一个示例代码,演示如何使用PyPDF4库来搜索和替换PDF文件中的文本:

from PyPDF4 import PdfFileReader, PdfFileWriterdef search_and_replace_text(input_path, output_path, search_text, replace_text):pdf = PdfFileReader(input_path)output_pdf = PdfFileWriter()for page_number in range(pdf.getNumPages()):page = pdf.getPage(page_number)content = page.extractText()if search_text in content:content = content.replace(search_text, replace_text)page.mergePage(content)output_pdf.addPage(page)with open(output_path, 'wb') as output_file:output_pdf.write(output_file)# 示例用法
input_path = 'path/to/input.pdf'
output_path = 'path/to/output.pdf'
search_text = 'example'
replace_text = 'replacement'
search_and_replace_text(input_path, output_path, search_text, replace_text)

在上面的代码中,我们首先使用PdfFileReader打开输入的PDF文件,并创建一个新的PdfFileWriter对象用于保存修改后的PDF 文件。然后,我们使用循环遍历 PDF 文件的每一页。

对于每一页,我们使用extractText方法提取页面的文本内容,并将其存储在content变量中。然后,我们检查search_text是否存在于content中。如果存在,我们使用replace方法将其替换为replace_text

接下来,我们使用mergePage方法将修改后的页面内容合并回原始页面对象中,并使用addPage方法将页面添加到输出的 PDF 文件对象中。

最后,我们使用open函数以二进制写入模式打开输出文件,并使用write方法将输出 PDF 文件保存到指定的路径。

你可以将要搜索和替换的 PDF 文件的路径替换为input_path变量的值,并将输出 PDF 文件的路径替换为output_path变量的值。同时,将要搜索的文本和替换的文本分别替换为search_textreplace_text变量的值。

请注意,PDF 文件的文本提取可能会有一些限制和不准确性,这取决于 PDF 文件的结构和内容。对于复杂的 PDF 文件,可能需要使用更高级的 PDF 处理库来进行准确的文本搜索和替换操作。

  1. 高级操作示例代码

对于复杂的PDF文件,需要使用更高级的PDF处理库,例如PyMuPDF(也称为fitz)来进行准确的文本搜索和替换操作。
在使用PyMuPDF库进行文本搜索和替换时,需要安装PyMuPDF库。你可以使用以下命令使用pip安装PyMuPDF库:

pip install PyMuPDF

以下是一个完整的示例代码,演示了如何使用PyMuPDF库在PDF文件中搜索和替换文本:

import fitzdef search_and_replace_text(input_path, output_path, search_text, replace_text):doc = fitz.open(input_path)for page in doc:text_instances = page.searchFor(search_text)for inst in text_instances:# 获取文本实例的矩形坐标x0, y0, x1, y1 = inst# 在文本实例位置绘制红色矩形rect = fitz.Rect(x0, y0, x1, y1)page.addHighlightAnnot(rect, fill=(1, 0, 0))# 替换文本page.insertText((x0, y0), replace_text)doc.save(output_path)doc.close()# 使用示例
input_path = "input.pdf"  # 输入PDF文件路径
output_path = "output.pdf"  # 输出PDF文件路径
search_text = "Hello"  # 要搜索的文本
replace_text = "World"  # 要替换的文本search_and_replace_text(input_path, output_path, search_text, replace_text)

请确保将input.pdf替换为实际的输入PDF文件路径,并将output.pdf替换为输出PDF文件的路径。同时,将Hello替换为要搜索的文本,将World替换为要替换的文本。

这段代码将在PDF文件中搜索所有匹配的文本实例,并在其位置绘制红色矩形。然后,它将替换所有匹配的文本实例为指定的替换文本,并将修改后的PDF保存为输出文件。

(二)提取表格数据示例代码

在这里插入图片描述

下面是使用Tabula-py库进行表格数据提取的示例代码:

首先,确保你已经安装了tabula-py库。你可以使用以下命令使用pip安装:

pip install tabula-py

然后,使用以下示例代码来提取PDF文件中的表格数据:

import tabuladef extract_table_data(input_path, output_path):# 提取PDF文件中的表格数据tables = tabula.read_pdf(input_path, pages='all')# 将提取的表格数据保存为CSV文件for i, table in enumerate(tables, start=1):table.to_csv(f"{output_path}_{i}.csv", index=False)# 使用示例
input_path = "input.pdf"  # 输入PDF文件路径
output_path = "output"  # 输出CSV文件路径(不包含文件扩展名)extract_table_data(input_path, output_path)

请确保将input.pdf替换为实际的输入PDF文件路径,并将output替换为输出CSV文件的路径(不包含文件扩展名)。

这段代码将使用tabula-py库的read_pdf函数从PDF文件中提取所有表格数据,并将每个表格保存为单独的CSV文件。CSV文件可以进一步处理或导入到其他应用程序中。

请注意,表格数据的提取可能受到PDF文件的结构和格式的影响。对于复杂的表格或带有合并单元格的表格,提取的结果可能需要进一步处理才能得到准确的结构化数据。

(三)创建PDF文件示例代码

  1. 初级操作示例代码

使用PyPDF4库创建PDF文件,以下是示例代码:

from PyPDF4 import PdfWriterdef create_pdf(output_path):# 创建一个空白的PDF文件pdf = PdfWriter()# 添加页面pdf.add_blank_page(width=400, height=600)# 添加文本page = pdf.pages[0]page.add_text("Hello, World!", x=100, y=500)# 保存PDF文件with open(output_path, "wb") as f:pdf.write(f)# 使用示例
output_path = "output.pdf"  # 输出PDF文件路径create_pdf(output_path)

请确保将output.pdf替换为实际的输出PDF文件路径。在示例代码中,我们使用PyPDF4库创建一个空白的PDF文件,并在第一页上添加文本。

你可以根据需要修改示例代码,并根据自己的要求添加更多的页面、文本、图像和其他元素来生成自定义的PDF文件。

请注意,PyPDF4库的功能相对较少,它主要用于合并、拆分和修改现有的PDF文件。如果你需要更复杂的PDF生成功能,你可能需要考虑使用其他库,如reportlab或weasyprint。

  1. 高级操作示例代码

a. 使用reportlab库创建PDF文件示例代码

from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvasdef create_pdf(output_path):# 创建一个空白的PDF文件c = canvas.Canvas(output_path, pagesize=letter)# 添加文本c.setFont("Helvetica", 12)c.drawString(100, 700, "Hello, World!")# 添加图像c.drawImage("image.jpg", 100, 500, width=200, height=200)# 添加表格data = [["Name", "Age", "Country"],["John", "25", "USA"],["Emily", "30", "Canada"],["David", "35", "UK"]]c.table(data, 100, 300, 3*[50])c.showPage()c.save()# 使用示例
output_path = "output.pdf"  # 输出PDF文件路径create_pdf(output_path)

请确保将output.pdf替换为实际的输出PDF文件路径。在示例代码中,我们使用reportlab库的canvas模块创建一个空白的PDF文件,并使用其提供的方法来添加文本、图像和表格。

你可以根据需要修改示例代码,并根据自己的要求添加更多的文本、图像、表格和其他元素来生成自定义的PDF文件。

reportlab库是一个功能强大的PDF生成库,提供了广泛的功能和选项,可以满足各种PDF生成需求。你可以通过查阅reportlab的官方文档来了解更多关于该库的详细信息和更高级的用法。

b. 使用WeasyPrint库创建PDF文件示例代码

from weasyprint import HTMLdef create_pdf(output_path):# 创建一个HTML文件html_content = """<html><head><title>My PDF</title></head><body><h1>Hello, World!</h1><img src="image.jpg" alt="Image" width="200" height="200"><table><tr><th>Name</th><th>Age</th><th>Country</th></tr><tr><td>John</td><td>25</td><td>USA</td></tr><tr><td>Emily</td><td>30</td><td>Canada</td></tr><tr><td>David</td><td>35</td><td>UK</td></tr></table></body></html>"""# 将HTML内容转换为PDF文件HTML(string=html_content).write_pdf(output_path)# 使用示例
output_path = "output.pdf"  # 输出PDF文件路径create_pdf(output_path)

在示例代码中,我们使用WeasyPrint库的HTML类来将HTML内容转换为PDF文件。首先,我们创建一个包含所需内容的HTML字符串。然后,我们使用HTML(string=html_content)创建一个HTML对象,并使用write_pdf(output_path)方法将其转换为PDF文件并保存到指定的输出路径。

你可以根据需要修改示例代码中的HTML内容,并添加更多的标记和样式来生成自定义的PDF文件。WeasyPrint库支持HTML和CSS,因此你可以使用HTML和CSS的各种功能和特性来创建复杂的布局和样式。

WeasyPrint库还提供了其他功能,例如从URL、文件或文件流中加载HTML内容,并支持更高级的PDF生成选项。你可以查阅WeasyPrint的官方文档以获取更多关于该库的详细信息和更高级的用法。

(四)导出为其他格式示例代码

在这里插入图片描述

除了PyPDF2和PyPDF4之外,还有其他一些库可以帮助你将PDF文件转换为其他格式。以下是一些常用的库和示例代码:

  1. pdfminer.six库:可以用于提取PDF文件的文本内容。
import io
from pdfminer.converter import TextConverter
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPagedef extract_text_from_pdf(pdf_path):resource_manager = PDFResourceManager()output = io.StringIO()converter = TextConverter(resource_manager, output)with open(pdf_path, "rb") as file:interpreter = PDFPageInterpreter(resource_manager, converter)for page in PDFPage.get_pages(file):interpreter.process_page(page)text = output.getvalue()converter.close()output.close()return text# 使用示例
pdf_path = "input.pdf"  # 输入PDF文件路径text = extract_text_from_pdf(pdf_path)
print(text)

在示例代码中,我们使用pdfminer.six库的TextConverter类将PDF文件的文本内容输出到StringIO对象中。

  1. pdf2image库:可以将PDF文件的每一页转换为图像
from pdf2image import convert_from_pathdef convert_pdf_to_images(pdf_path, output_path):images = convert_from_path(pdf_path)for i, image in enumerate(images):image_path = f"{output_path}/page_{i+1}.jpg"image.save(image_path, "JPEG")# 使用示例
pdf_path = "input.pdf"  # 输入PDF文件路径
output_path = "output_images"  # 输出图像的目录路径convert_pdf_to_images(pdf_path, output_path)

这段代码与之前使用pdf2image库的示例代码相同,可以将PDF文件的每一页转换为图像。

  1. pdfkit库:可以将PDF文件转换为HTML
import pdfkitdef convert_pdf_to_html(pdf_path, output_path):pdfkit.from_file(pdf_path, output_path)# 使用示例
pdf_path = "input.pdf"  # 输入PDF文件路径
output_path = "output.html"  # 输出HTML文件路径convert_pdf_to_html(pdf_path, output_path)

这段代码与之前使用pdfkit库的示例代码相同,可以将PDF文件转换为HTML文件。

这些示例代码可以帮助你开始将PDF文件转换为其他格式。请确保在使用这些库之前先安装它们,并参考它们的官方文档以获取更多详细信息和更高级的用法。

(五)提取元数据示例代码

下面是使用PyPDF4库提取元数据示例代码:

import PyPDF4def extract_metadata_from_pdf(pdf_path):with open(pdf_path, "rb") as file:reader = PyPDF4.PdfFileReader(file)metadata = reader.getDocumentInfo()return metadata# 使用示例
pdf_path = "input.pdf"  # 输入PDF文件路径metadata = extract_metadata_from_pdf(pdf_path)
print("Title:", metadata.title)
print("Author:", metadata.author)
print("Subject:", metadata.subject)
print("Producer:", metadata.producer)
print("Created Date:", metadata.created)

在这个示例中,我们使用PyPDF4库的PdfFileReader类打开PDF文件,并使用getDocumentInfo()方法获取PDF文件的元数据。返回的metadata对象包含了标题、作者、主题、制作者和创建日期等信息。

(六)OCR光学字符识别示例代码

在这里插入图片描述

要将PDF文件中的图像文字识别为可编辑的文本,你可以使用OCR(光学字符识别)库结合Python的PDF文件处理库。

  1. 使用pdf2imagepytesseract库进行OCR的示例代码

首先,确保你已经安装了pdf2imagepytesseract库。你可以使用以下命令来安装它们:

pip install pdf2image pytesseract

接下来,使用以下示例代码来进行OCR识别:

import pytesseract
from pdf2image import convert_from_pathdef ocr_from_pdf(pdf_path):pages = convert_from_path(pdf_path)result = ""for page in pages:text = pytesseract.image_to_string(page, lang='eng')result += textreturn result# 使用示例
pdf_path = "input.pdf"  # 输入PDF文件路径text = ocr_from_pdf(pdf_path)
print(text)

在示例代码中,我们首先使用convert_from_path()函数从PDF文件中提取图像页。然后,我们使用pytesseract.image_to_string()函数将每个图像页中的文字识别为字符串。最后,我们将所有识别的文本合并到一个结果字符串中。

请注意,这里使用的是英文语言模型(lang='eng')。如果你处理的是其他语言的PDF文件,可以根据需要设置适当的语言模型。此外,OCR的准确性可能受到图像质量、文字清晰度和语言模型的影响。

这个示例代码使用了pdf2imagepytesseract库,但还有其他OCR库可供选择,如textractpyocr等。你可以根据自己的需求选择合适的OCR库来进行PDF文件中图像文字的识别。

  1. 使用textract库进行OCR的示例代码

首先,确保你已经安装了textract库。你可以使用以下命令来安装它:

pip install textract

接下来,使用以下示例代码来进行OCR识别:

import textractdef ocr_from_pdf(pdf_path):text = textract.process(pdf_path, method='tesseract', language='eng')return text.decode('utf-8')# 使用示例
pdf_path = "input.pdf"  # 输入PDF文件路径text = ocr_from_pdf(pdf_path)
print(text)

在示例代码中,我们使用textract.process()函数来处理PDF文件。我们指定了OCR方法为Tesseract,并设置语言为英文(language='eng')。函数返回的结果是识别的文本,我们使用decode('utf-8')将其解码为字符串。

请注意,使用textract库进行OCR时,你需要确保已经安装了Tesseract OCR引擎,并且设置了正确的语言数据。你可以根据需要安装Tesseract并下载所需的语言数据。

这个示例代码使用了textract库来进行OCR识别,它是一个通用的文本提取库,支持多种文件格式的文本提取,包括PDF文件。你可以根据自己的需求选择适合的OCR库来进行PDF文件中图像文字的识别。

  1. 使用pyocr进行OCR示例代码
import pyocr
from PIL import Imagedef ocr_from_image(image_path):tools = pyocr.get_available_tools()if len(tools) == 0:print("OCR工具未找到")returntool = tools[0]  # 使用第一个可用的OCR工具image = Image.open(image_path)text = tool.image_to_string(image, lang='eng', builder=pyocr.builders.TextBuilder())return text# 使用示例
image_path = "image.jpg"  # 输入图像文件路径text = ocr_from_image(image_path)
print(text)

在这个示例代码中,我们首先使用pyocr.get_available_tools()函数获取可用的OCR工具列表,并选择第一个工具进行OCR识别。

然后,我们使用Image.open()函数打开输入的图像文件。

接下来,我们使用选定的OCR工具的image_to_string()函数将图像中的文字识别为文本。我们还指定了lang='eng'参数来设置识别的语言为英语,你可以根据需要调整语言参数。

最后,我们返回识别的文本结果。

请注意,使用pyocr库进行OCR时,你需要确保已经安装了相应的OCR引擎,并且设置了正确的语言数据。你可以根据需要安装OCR引擎(如Tesseract)并下载所需的语言数据。

这个示例代码使用了pyocr库来进行OCR识别,它提供了对多种OCR引擎的封装,包括Tesseract、CuneiForm等。你可以根据自己的需求选择适合的OCR库来进行。

(七)编辑PDF文件示例代码

在这里插入图片描述

  1. 添加文本和图像示例代码

下面是使用PyPDF4库在PDF文件中添加文本和图像的示例代码:

from PyPDF4 import PdfFileReader, PdfFileWriter
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letterdef add_text_to_pdf(input_pdf, output_pdf, text, x, y):pdf = PdfFileReader(input_pdf)writer = PdfFileWriter()page = pdf.getPage(0)  # 获取第一页page.mergePage(blank_page_with_text(text, x, y))  # 合并带有文本的空白页面writer.addPage(page)with open(output_pdf, 'wb') as f:writer.write(f)def blank_page_with_text(text, x, y):c = canvas.Canvas('blank.pdf', pagesize=letter)c.drawString(x, y, text)c.save()return PdfFileReader('blank.pdf').getPage(0)# 使用示例
input_pdf = 'input.pdf'  # 输入PDF文件路径
output_pdf = 'output.pdf'  # 输出PDF文件路径
text = 'Hello, World!'  # 要添加的文本内容
x = 100  # 文本的横坐标位置
y = 100  # 文本的纵坐标位置add_text_to_pdf(input_pdf, output_pdf, text, x, y)

在上面的示例代码中,我们定义了一个add_text_to_pdf()函数,它接受输入PDF文件的路径、输出PDF文件的路径、要添加的文本内容以及文本的横纵坐标位置作为参数。

首先,我们使用PdfFileReader()函数打开输入PDF文件,并创建一个PdfFileWriter()对象来写入新的PDF文件。

然后,我们使用getPage(0)方法获取输入PDF文件的第一页。

接下来,我们使用blank_page_with_text()函数创建一个带有指定文本的空白页面,并将其与输入PDF文件的第一页合并。

然后,我们将合并后的页面添加到PdfFileWriter()对象中。

最后,我们使用write()方法将生成的PDF文件写入输出文件。

blank_page_with_text()函数使用reportlab库创建一个带有指定文本的空白页面,然后将其转换为PyPDF4库的PageObject对象。

请注意,上述代码中的文本位置坐标是相对于页面的左下角的,以点(1/72英寸)为单位。你可以根据需要调整文本的位置。

此外,如果你想在PDF文件中添加图像元素,你可以使用类似的方法。你可以使用reportlab库创建一个带有图像的空白页面,然后将其与输入PDF文件的页面合并。

  1. 修改文本和图像示例代码

使用PyMuPDF(也称为fitz)和ReportLab。这些库提供了更多的功能来处理PDF文件中的文本和图像。

a. 使用PyMuPDF(fitz)库修改PDF文件中文本和图像的示例代码:

import fitzdef modify_pdf(input_pdf, output_pdf):doc = fitz.open(input_pdf)for page in doc:# 修改文本modify_text(page)# 修改图像modify_image(page)doc.save(output_pdf)doc.close()def modify_text(page):# 获取所有文本块text_blocks = page.getTextBlocks()for block in text_blocks:# 修改文本样式block[4]['fontname'] = 'Arial'block[4]['size'] = 12block[4]['color'] = (0, 0, 1)  # 蓝色page.setTextBlocks(text_blocks)def modify_image(page):# 获取所有图像块
text_blocks = page.getImageList()for block in text_blocks:# 修改图像位置和大小x, y, width, height = block[:4]new_x = x + 50  # 增加50个单位的水平偏移量new_y = y + 50  # 增加50个单位的垂直偏移量new_width = width * 1.5  # 增加50%的宽度new_height = height * 1.5  # 增加50%的高度block[:4] = new_x, new_y, new_width, new_heightpage.setImageList(text_blocks)# 使用示例
input_pdf = 'input.pdf'
output_pdf = 'output.pdf'modify_pdf(input_pdf, output_pdf)

请注意,PyMuPDF(fitz)库使用的是MuPDF渲染引擎,支持对PDF文件进行更高级的修改。你可以根据具体的需求,修改示例代码中的文本和图像处理部分,以实现你想要的修改效果。

b. 使用ReportLab库修改PDF文件的文本和图像

下面是一个使用ReportLab库修改PDF文件文本和图像的示例代码:

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from reportlab.lib.units import inch
from reportlab.lib import utilsdef modify_pdf(input_pdf, output_pdf):# 创建画布c = canvas.Canvas(output_pdf, pagesize=letter)# 打开输入PDF文件with open(input_pdf, 'rb') as f:# 读取每一页的内容并进行修改for page in utils.pagesizes.iter_pagesizes(f):c.setPageSize(page)c.showPage()# 修改文本modify_text(c)# 修改图像modify_image(c)# 保存修改后的PDF文件c.save()def modify_text(c):# 修改文本c.setFont("Helvetica", 12)c.drawString(1 * inch, 10 * inch, "Modified Text")def modify_image(c):# 修改图像image_path = "image.jpg"c.drawImage(image_path, 2 * inch, 2 * inch, width=2 * inch, height=2 * inch)# 使用示例
input_pdf = 'input.pdf'
output_pdf = 'output.pdf'modify_pdf(input_pdf, output_pdf)

在这个示例中,我们使用ReportLab库创建了一个画布,并打开输入的PDF文件。然后,我们遍历每一页的内容,并在画布上进行修改。在modify_text函数中,我们使用setFontdrawString方法修改文本内容和样式。在modify_image函数中,我们使用drawImage方法修改图像的位置和大小。

请注意,为了修改图像,你需要提供正确的图像路径,并根据需要调整图像的位置和尺寸。

这是一个基本示例,你可以根据需要进行更复杂的修改操作。使用ReportLab库可以实现更高级的文本和图像处理,包括添加表格、绘制图形等。你可以查阅ReportLab的文档以获取更多详细信息和示例代码。

c. 删除内容示例代码

下面是使用PyPDF4库删除PDF文件内容的示例代码:

from PyPDF4 import PdfReader, PdfWriterdef delete_pdf_elements(input_pdf, output_pdf, pages_to_delete=None, text_to_delete=None, images_to_delete=None):# 读取输入PDF文件with open(input_pdf, 'rb') as f:reader = PdfReader(f)writer = PdfWriter()for page_num in range(len(reader.pages)):page = reader.pages[page_num]# 删除指定页面if pages_to_delete and page_num + 1 in pages_to_delete:continue# 删除指定文本if text_to_delete:remove_text(page, text_to_delete)# 删除指定图像if images_to_delete:remove_images(page, images_to_delete)writer.add_page(page)# 保存修改后的PDF文件with open(output_pdf, 'wb') as output_file:writer.write(output_file)def remove_text(page, text_to_delete):# 在页面中搜索并删除指定文本content = page.extract_text()for text in text_to_delete:content = content.replace(text, "")# 清空页面内容page.set_contents([])# 重新添加修改后的内容page.add_content(content.encode("utf-8"))def remove_images(page, images_to_delete):# 删除指定图像for image in page.images:if image["name"] in images_to_delete:page.remove_image(image["name"])# 使用示例
input_pdf = 'input.pdf'
output_pdf = 'output.pdf'# 删除第2页和第4页
pages_to_delete = [2, 4]# 删除指定文本
text_to_delete = ["Hello", "World"]# 删除指定图像(按图像名称)
images_to_delete = ["image1", "image2"]delete_pdf_elements(input_pdf, output_pdf, pages_to_delete, text_to_delete, images_to_delete)

在示例代码中,我们定义了remove_text函数和remove_images函数来删除指定的文本和图像。在delete_pdf_elements函数中,我们读取输入的PDF文件,并遍历每一页进行处理。根据提供的参数,我们删除指定的页面、文本和图像。最后,我们将修改后的内容写入输出的PDF文件。

请注意,PyPDF4库的用法可能与PyPDF2库有所不同,因此需要根据库的文档进行适当的调整。此外,图像的删除是根据图像名称进行匹配的,因此需要确保提供正确的图像名称。

d. 旋转和裁剪示例代码

下面是使用PyPDF4库进行旋转和裁剪操作示例代码:

from PyPDF4 import PdfReader, PdfWriterdef rotate_and_crop_pdf(input_pdf, output_pdf, rotation_angle=0, crop_box=None):# 读取输入PDF文件with open(input_pdf, 'rb') as f:reader = PdfReader(f)writer = PdfWriter()for page_num in range(len(reader.pages)):page = reader.pages[page_num]# 旋转页面page.rotate = (page.rotate + rotation_angle) % 360# 裁剪页面if crop_box:page.cropBox.lowerLeft = (crop_box[0], crop_box[1])page.cropBox.upperRight = (crop_box[2], crop_box[3])writer.add_page(page)# 保存修改后的PDF文件with open(output_pdf, 'wb') as output_file:writer.write(output_file)# 使用示例
input_pdf = 'input.pdf'
output_pdf = 'output.pdf'# 顺时针旋转90度
rotation_angle = 90# 定义裁剪框的坐标(左下角和右上角)
crop_box = [100, 100, 500, 500]rotate_and_crop_pdf(input_pdf, output_pdf, rotation_angle, crop_box)

在示例代码中,我们定义了一个名为rotate_and_crop_pdf的函数,用于旋转和裁剪PDF页面。该函数接受输入PDF文件路径、输出PDF文件路径、旋转角度和裁剪框坐标作为参数。

在函数内部,我们首先使用PdfReader打开输入PDF文件,并创建一个PdfWriter对象来保存修改后的PDF文件。然后,我们遍历输入PDF的每一页,并对每一页进行旋转和裁剪操作。

对于旋转操作,我们将当前页面的旋转角度与指定的旋转角度相加,并使用模运算确保角度在0到359之间。

对于裁剪操作,我们使用cropBox属性来设置页面的裁剪框。裁剪框由左下角和右上角的坐标定义,我们将传入的裁剪框坐标赋值给cropBox属性。

最后,我们将修改后的页面添加到PdfWriter对象中,并使用write方法将结果写入输出PDF文件。

请注意,旋转角度是以顺时针方向为正值的角度。裁剪框的坐标是以页面的左下角为原点,以点(单位为1/72英寸)为单位的坐标。

e. 添加链接和导航示例代码

下面是使用PyPDF4库添加链接和导航示例代码

from PyPDF4 import PdfReader, PdfWriter
from PyPDF4.pdf import Destinationdef add_link_to_pdf(input_pdf, output_pdf, page_num, link_rect, destination):# 读取输入PDF文件with open(input_pdf, 'rb') as f:reader = PdfReader(f)writer = PdfWriter()for i in range(len(reader.pages)):page = reader.pages[i]if i == page_num - 1:# 创建链接注释link_annot = page.add_link_annotation(link_rect, destination)page.add_annotation(link_annot)writer.add_page(page)# 保存修改后的PDF文件with open(output_pdf, 'wb') as output_file:writer.write(output_file)# 使用示例
input_pdf = 'input.pdf'
output_pdf = 'output.pdf'
page_num = 1  # 链接所在的页面编号(从1开始)
link_rect = [100, 100, 200, 200]  # 链接的矩形区域坐标(左下角和右上角)
destination = Destination(page_num, 'XYZ', left=None, top=None, zoom=1)  # 目标页面和显示方式add_link_to_pdf(input_pdf, output_pdf, page_num, link_rect, destination)

在示例代码中,我们定义了一个名为add_link_to_pdf的函数,用于在PDF文件中添加链接。该函数接受输入PDF文件路径、输出PDF文件路径、链接所在的页面编号、链接的矩形区域坐标和目标页面的信息作为参数。

在函数内部,我们使用PdfReader打开输入PDF文件,并创建一个PdfWriter对象来保存修改后的PDF文件。然后,我们遍历输入PDF的每一页。

当遍历到指定的页面时,我们使用add_link_annotation方法在页面上创建一个链接注释。我们将链接的矩形区域坐标和目标页面的信息作为参数传递给add_link_annotation方法。

最后,我们将修改后的页面添加到PdfWriter对象中,并使用write方法将结果写入输出PDF文件。

在示例代码中,我们使用了Destination类来定义目标页面的信息。Destination类接受目标页面的编号、显示方式和其他可选参数。在示例中,我们使用了页面编号、显示方式为’XYZ’(使用坐标和缩放比例)以及默认的其他参数。

f. 加密和保护示例代码

在这里插入图片描述

下面是使用PyPDF4库对PDF文件进行加密和保护示例代码:

from PyPDF4 import PdfReader, PdfWriterdef encrypt_pdf(input_pdf, output_pdf, user_password, owner_password):# 读取输入PDF文件with open(input_pdf, 'rb') as f:reader = PdfReader(f)writer = PdfWriter()# 设置加密参数writer.encrypt(user_password, owner_password, use_128bit=True)for page in reader.pages:writer.add_page(page)# 保存加密后的PDF文件with open(output_pdf, 'wb') as output_file:writer.write(output_file)# 使用示例
input_pdf = 'input.pdf'
output_pdf = 'output.pdf'
user_password = 'user123'
owner_password = 'owner456'encrypt_pdf(input_pdf, output_pdf, user_password, owner_password)

在示例代码中,我们定义了一个名为encrypt_pdf的函数,用于加密和保护PDF文件。该函数接受输入PDF文件路径、输出PDF文件路径、用户密码和所有者密码作为参数。

encrypt_pdf函数内部,我们使用PdfReader打开输入PDF文件,并创建一个PdfWriter对象来保存加密后的PDF文件。

然后,我们使用encrypt方法设置加密参数。在示例中,我们传递了用户密码和所有者密码作为参数,并设置use_128bit=True以使用128位加密算法。你可以根据需要自定义密码和加密参数。

接下来,我们遍历输入PDF的每一页,并将其添加到PdfWriter对象中。

最后,我们使用write方法将加密后的PDF文件写入输出文件。

使用示例代码时,你需要将input_pdf替换为你要加密的PDF文件路径,output_pdf替换为加密后的PDF文件保存路径,以及user_passwordowner_password替换为你想要设置的用户密码和所有者密码。

这个示例代码演示了如何使用PyPDF4库对PDF文件进行加密和保护。你还可以进一步探索PyPDF4库的其他功能,例如设置权限、添加水印等。如果有任何进一步的问题,请随时提问。

下面是使用PyPDF4库设置权限和添加水印示例代码:

设置权限示例代码:

from PyPDF4 import PdfReader, PdfWriterdef set_permissions(input_pdf, output_pdf, user_password, owner_password):# 读取输入PDF文件with open(input_pdf, 'rb') as f:reader = PdfReader(f)writer = PdfWriter()# 设置加密参数writer.encrypt(user_password, owner_password, use_128bit=True)# 设置权限writer.add_metadata({'/Encrypt': 'true','/P': '-4','/Length': '40'})for page in reader.pages:writer.add_page(page)# 保存加密后的PDF文件with open(output_pdf, 'wb') as output_file:writer.write(output_file)# 使用示例
input_pdf = 'input.pdf'
output_pdf = 'output.pdf'
user_password = 'user123'
owner_password = 'owner456'set_permissions(input_pdf, output_pdf, user_password, owner_password)

在上述示例代码中,我们定义了一个名为set_permissions的函数,用于设置PDF文件的权限。该函数接受输入PDF文件路径、输出PDF文件路径、用户密码和所有者密码作为参数。

在函数内部,我们使用PdfReader打开输入PDF文件,并创建一个PdfWriter对象来保存加密和设置权限后的PDF文件。

然后,我们使用encrypt方法设置加密参数,与之前的示例相同。

接下来,我们使用add_metadata方法设置权限。在示例中,我们为'/Encrypt'键设置为
‘/Encrypt’: ‘true’,以启用加密,并将'/P'键设置为'-4'以禁用打印权限,将'/Length'键设置为'40'以限制内容更改。

接下来,我们遍历输入PDF的每一页,并将其添加到PdfWriter对象中。

最后,我们使用write方法将加密和设置权限后的PDF文件写入输出文件。

使用示例代码时,你需要将input_pdf替换为你要设置权限的PDF文件路径,output_pdf替换为设置权限后的PDF文件保存路径,以及user_passwordowner_password替换为你想要设置的用户密码和所有者密码。

添加水印:

在这里插入图片描述

from PyPDF4 import PdfReader, PdfWriterdef add_watermark(input_pdf, output_pdf, watermark_text):# 读取输入PDF文件with open(input_pdf, 'rb') as f:reader = PdfReader(f)writer = PdfWriter()for page in reader.pages:# 添加水印page.merge_page(watermark_text)writer.add_page(page)# 保存添加水印后的PDF文件with open(output_pdf, 'wb') as output_file:writer.write(output_file)# 使用示例
input_pdf = 'input.pdf'
output_pdf = 'output.pdf'
watermark_text = 'Confidential'add_watermark(input_pdf, output_pdf, watermark_text)

在上述示例代码中,我们定义了一个名为add_watermark的函数,用于向PDF文件添加水印。该函数接受输入PDF文件路径、输出PDF文件路径和水印文本作为参数。

在函数内部,我们使用PdfReader打开输入PDF文件,并创建一个PdfWriter对象来保存添加水印后的PDF文件。

然后,我们遍历输入PDF的每一页,并使用merge_page方法将水印文本合并到每一页上。

最后,我们使用write方法将添加水印后的PDF文件写入输出文件。

使用示例代码时,你需要将input_pdf替换为你要添加水印的PDF文件路径,output_pdf替换为添加水印后的PDF文件保存路径,以及watermark_text替换为你想要添加的水印文本。

(八)页面提取和重新排序示例代码

当涉及到页面提取和重新排序时,PyPDF4库提供了一些功能来实现这些操作。下面是一些示例代码,演示如何使用PyPDF4库提取特定页面或重新排序PDF文件中的页面:

  1. 页面提取:
from PyPDF4 import PdfReader, PdfWriterdef extract_pages(input_pdf, output_pdf, page_numbers):# 读取输入PDF文件with open(input_pdf, 'rb') as f:reader = PdfReader(f)writer = PdfWriter()# 提取指定页面for page_number in page_numbers:writer.add_page(reader.pages[page_number - 1])# 保存提取后的PDF文件with open(output_pdf, 'wb') as output_file:writer.write(output_file)# 使用示例
input_pdf = 'input.pdf'
output_pdf = 'output.pdf'
pages_to_extract = [1, 3, 5]extract_pages(input_pdf, output_pdf, pages_to_extract)

在上述示例代码中,我们定义了一个名为extract_pages的函数,用于从PDF文件中提取指定的页面。该函数接受输入PDF文件路径、输出PDF文件路径和要提取的页面编号列表作为参数。

在函数内部,我们使用PdfReader打开输入PDF文件,并创建一个PdfWriter对象来保存提取后的PDF文件。

然后,我们遍历要提取的页面编号列表,并使用add_page方法将对应页面添加到PdfWriter对象中。请注意,页面编号从1开始,而在reader.pages中,页面索引从0开始。因此,我们需要将页面编号减去1以匹配正确的页面。

最后,我们使用write方法将提取后的PDF文件写入输出文件。

使用示例代码时,你需要将input_pdf替换为你要提取页面的PDF文件路径,output_pdf替换为提取页面后的PDF文件保存路径,以及pages_to_extract替换为你想要提取的页面编号列表。

  1. 页面重新排序:
from PyPDF4 import PdfReader, PdfWriterdef reorder_pages(input_pdf, output_pdf, page_order):# 读取输入PDF文件with open(input_pdf, 'rb') as f:reader = PdfReader(f)writer = PdfWriter()# 重新排序页面for page_number in page_order:writer.add_page(reader.pages[page_number - 1])# 保存重新排序后的PDF文件with open(output_pdf, 'wb') as output_file:writer.write(output_file)# 使用示例
input_pdf = 'input.pdf'
output_pdf = 'output.pdf'
new_page_order = [3, 1, 2]reorder_pages(input_pdf, output_pdf, new_page_order)

在上述示例代码中,我们定义了一个名为reorder_pages的函数,用于重新排序PDF文件中的页面。该函数接受输入PDF文件路径、输出PDF文件路径和新的页面顺序列表作为参数。

在函数内部,我们使用PdfReader打开输入PDF文件,并创建一个PdfWriter对象来保存重新排序后的PDF文件。

然后,我们遍历新的页面顺序列表,并使用add_page方法将对应页面添加到PdfWriter对象中。同样,我们需要将页面编号减去1以匹配正确的页面。

最后,我们使用write方法将重新排序后的PDF文件写入输出文件。

使用示例代码时,你需要将input_pdf替换为你要重新排序页面的PDF文件路径,output_pdf替换为重新排序页面后的PDF文件保存路径,以及new_page_order替换为新的页面顺序列表。

(九)添加编辑删除注释和标记示例代码

以下是使用PyPDF4库添加、编辑和删除PDF文件中注释和标记的示例代码:

  1. 添加注释:
from PyPDF4 import PdfFileReader, PdfFileWriterdef add_comment(input_path, output_path, page_number, x, y, comment):pdf = PdfFileReader(input_path)page = pdf.getPage(page_number)# 创建注释对象annotation = page.addAnnotation()annotation.update({'/Type': '/Annot','/Subtype': '/Text','/Contents': comment,'/Rect': [x, y, x+200, y+50]  # 注释位置和大小})# 保存修改后的PDFwith open(output_path, 'wb') as file:pdf.write(file)# 示例用法
input_file = 'input.pdf'
output_file = 'output.pdf'
page_num = 0  # 第一页
x_pos = 100   # X坐标
y_pos = 100   # Y坐标
comment_text = '这是一个注释'add_comment(input_file, output_file, page_num, x_pos, y_pos, comment_text)
  1. 编辑注释:
from PyPDF4 import PdfFileReader, PdfFileWriterdef edit_comment(input_path, output_path, page_number, comment_index, new_comment):pdf = PdfFileReader(input_path)page = pdf.getPage(page_number)annotations = page['/Annots']if annotations:# 更新指定索引的注释内容annotation = annotations.getObject()[comment_index]annotation.update({'/Contents': new_comment})# 保存修改后的PDFwith open(output_path, 'wb') as file:pdf.write(file)# 示例用法
input_file = 'input.pdf'
output_file = 'output.pdf'
page_num = 0  # 第一页
comment_index = 0  # 第一个注释的索引
new_comment_text = '修改后的注释'edit_comment(input_file, output_file, page_num, comment_index, new_comment_text)
  1. 删除注释:
from PyPDF4 import PdfFileReader, PdfFileWriterdef delete_comment(input_path, output_path, page_number, comment_index):pdf = PdfFileReader(input_path)page = pdf.getPage(page_number)annotations = page['/Annots']if annotations:# 删除指定索引的注释annotations.getObject().remove(annotations.getObject()[comment_index])# 保存修改后的PDFwith open(output_path, 'wb') as file:pdf.write(file)# 示例用法
input_file = 'input.pdf'
output_file = 'output.pdf'
page_num = 0  # 第一页
comment_index = 0  # 第一个注释的索引delete_comment(input_file, output_file, page_num, comment_index)

请注意,这只是示例代码,实际使用时需要根据具体情况进行调整和扩展。此外,PyPDF4库对于某些高级PDF特性(如多列文本、复杂布局等)的处理可能有限,如果遇到复杂的PDF文件,可能需要考虑使用其他更强大的PDF处理工具。

如果你不想使用PyPDF2库,还有其他方法来添加和编辑PDF文件中的标记。一种方法是使用PDFMiner库,它可以解析PDF文件的结构允许你操作标记。

以下是使用Miner库添加、编辑和删除PDF文件中标记的示例代码:

  1. 添加标记:
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfpage import PDFPage
from pdfminer.pdftypes import resolve1, PDFObjRefdef add_bookmark(input, output_path, page_number, title, parent=None):with open(input_path, 'rb') as file:parser = PDFParser(file)document = PDFDocument(parser)pages = list(PDFPage.create_pages(document))# 获取要添加标记的页面对象page = pages[page_number]# 创建标记对象bookmark = {'Title': title, 'Page': PDFObjRef(page.pageid)}if parent is not None:bookmark['Parent'] = parent# 将标记添加到文档的标记列表中if '/Outlines' in document.catalog:outlines = resolve1(document.catalog['/Outlines'])else:outlines = document.catalog['/Outlines'] = []outlines.append(bookmark)# 保存修改后的PDFwith open(output_path, 'wb') as output_file:parser.write_pdf(output_file)# 示例用法
input_file = 'input.pdf'
output_file = 'output.pdf'
page_num = 0  # 第一页
bookmark_title = '新的标记'add_bookmark(input_file, output_file, page_num, bookmark_title)
  1. 编辑标记:
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdftypes import resolve1def edit_bookmark(input_path, output_path, bookmark_index, new_title):with open(input_path, 'rb') as file:parser = PDFParser(file)document = PDFDocument(parser)# 获取文档的标记列表outlines = resolve1(document.catalog['/Outlines'])# 根据索引获取要编辑的标记对象bookmark = outlines[bookmark_index]# 更新标记的标题bookmark['Title'] = new_title# 保存修改后的PDFwith open(output_path, 'wb') as output_file:parser.write_pdf(output_file)# 示例用法
input_file = 'input.pdf'
output_file = 'output.pdf'
bookmark_index = 0  # 第一个标记的索引
new_title = '修改后的标记'edit_bookmark(input_file, output_file, bookmark_index, new_title)

这些示例代码使用PDFMiner库来操作PDF文件中的标记。请注意,PDFMiner库的使用可能相对复杂,并且需要对PDF文件的结构有一定的了解。因此,在实际使用时,请根据具体需求和情况进行调整和扩展。

  1. 删除标记:

以下是使用PDFMiner库删除PDF文件中标记的示例代码:

from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdftypes import resolve1def delete_bookmark(input_path, output_path, bookmark_index):with open(input_path, 'rb') as file:parser = PDFParser(file)document = PDFDocument(parser)# 获取文档的标记列表outlines = resolve1(document.catalog['/Outlines'])# 根据索引删除标记对象del outlines[bookmark_index]# 保存修改后的PDFwith open(output_path, 'wb') as output_file:parser.write_pdf(output_file)# 示例用法
input_file = 'input.pdf'
output_file = 'output.pdf'
bookmark_index = 0  # 要删除的标记的索引delete_bookmark(input_file, output_file, bookmark_index)

这个示例代码使用PDFMiner库来删除PDF文件中的标记。它打开输入的PDF文件,解析文档并获取标记列表。然后,根据给定的索引删除对应的标记对象。最后,将修改后的PDF保存到输出文件中。

请注意,PDFMiner库的使用可能相对复杂,并且需要对PDF文件的结构有一定的了解。因此,在实际使用时,请根据具体需求和情况进行调整和扩展。

(十)使用PyPDF4库进行表单处理示例代码

在这里插入图片描述

使用PyPDF4库来读取和填写PDF文件中的表单数据,以及创建自定义的表单。以下是一些示例代码,演示了如何使用PyPDF4库进行表单处理。

  1. 读取PDF文件中的表单数据示例代码
from PyPDF4 import PdfReaderdef read_form_data(input_pdf):# 读取输入PDF文件with open(input_pdf, 'rb') as f:reader = PdfReader(f)# 检查PDF是否包含表单if '/AcroForm' not in reader.trailer:print("PDF文件中不包含表单。")return# 获取表单字段数据form = reader.get_form()fields = form.get_fields()# 打印表单字段数据for field in fields:print(f"字段名称: {field['/T']}")print(f"字段值: {field['/V']}")print("-----")# 使用示例
input_pdf = 'form.pdf'
read_form_data(input_pdf)

在上述示例代码中,我们定义了一个名为read_form_data的函数,用于读取PDF文件中的表单数据。该函数接受输入PDF文件路径作为参数。

在函数内部,我们使用PdfReader打开输入PDF文件,并检查PDF是否包含表单。如果PDF文件中不包含表单,我们会打印相应的消息并返回。

然后,我们获取表单对象和表单字段数据。通过遍历字段数据,我们打印每个字段的名称和值。

使用示例代码时,你需要将input_pdf替换为你要读取表单数据的PDF文件路径。

  1. 使用PyPDF4库来填写PDF文件中的表单数据。
from PyPDF4 import PdfReader, PdfWriterdef fill_form_data(input_pdf, output_pdf, form_data):# 读取输入PDF文件with open(input_pdf, 'rb') as f:reader = PdfReader(f)writer = PdfWriter()# 复制页面并填写表单数据for page in reader.pages:writer.add_page(page)# 填写表单字段数据form = writer.get_form()if form:for key, value in form_data.items():form[key] = value# 保存填写表单数据后的PDF文件with open(output_pdf, 'wb') as output_file:writer.write(output_file)# 使用示例
input_pdf = 'form_template.pdf'
output_pdf = 'filled_form.pdf'
form_data = {'Name': 'John Doe','Email': 'johndoe@example.com','Phone': '123-456-7890'
}fill_form_data(input_pdf, output_pdf, form_data)

在上述示例代码中,我们定义了一个名为fill_form_data的函数,用于填写PDF文件中的表单数据。该函数接受输入PDF文件路径、输出PDF文件路径和表单数据作为参数。

在函数内部,我们使用PdfReader打开输入PDF文件,并创建一个PdfWriter对象来保存填写表单数据后的PDF文件。

然后,我们复制输入PDF文件的每个页面,并将其添加到PdfWriter对象中。

接下来,我们获取表单对象,并遍历表单数据字典。对于每个表单字段,我们将其名称作为键,将对应的值填入表单字段。

最后,我们将填写表单数据后的PDF文件保存到输出文件中。

使用示例代码时,你需要将input_pdf替换为你要填写表单数据的PDF文件路径,output_pdf替换为填写表单数据后的PDF文件保存路径,并根据需要修改form_data字典中的字段名称和对应的值。

希望这些示例代码能帮助你读取和填写PDF文件中的表单数据。如果有任何进一步的问题,请随时提问。

  1. 创建自定义表单示例代码

如果你想创建自定义表单,可以使用PyPDF4库来生成一个空白的PDF文件,并在其中添加表单字段。以下是一个示例代码,演示了如何创建一个包含文本字段和复选框字段的自定义表单:

from PyPDF4 import PdfWriter
from PyPDF4.pdf import Fielddef create_custom_form(output_pdf):# 创建一个新的PDF写入器writer = PdfWriter()# 添加页面并设置表单字段page = writer.add_blank_page(width=400, height=400)# 添加文本字段text_field = Field(name='Name',value='',field_type='Text',x=50,y=300,width=200,height=20)page.add_annotation(text_field)# 添加复选框字段checkbox_field = Field(name='Agreement',value='Off',field_type='Button',x=50,y=250,width=20,height=20,button_style='Check')page.add_annotation(checkbox_field)# 保存PDF文件with open(output_pdf, 'wb') as output_file:writer.write(output_file)# 使用示例
output_pdf = 'custom_form.pdf'
create_custom_form(output_pdf)

在上述示例代码中,我们定义了一个名为create_custom_form的函数,用于创建自定义表单。该函数接受输出PDF文件路径作为参数。

在函数内部,我们创建一个新的PdfWriter对象,并添加一个空白页面作为表单的基础。

然后,我们使用Field类创建文本字段和复选框字段,并设置它们的名称、值、类型和位置等属性。对于文本字段,我们指定了宽度和高度,以及文本输入框的位置。对于复选框字段,我们指定了宽度和高度,并将按钮样式设置为“Check”。

最后,我们将表单字段添加到页面中,并将生成的PDF文件保存到输出路径。

使用示例代码时,你需要将output_pdf替换为你想保存自定义表单的PDF文件路径。

(十一)数字签名示例代码

下面是使用ReportLab库生成和验证数字签名的示例代码:

from reportlab.lib import colors
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
from reportlab.lib.utils import md5def sign_pdf(input_path, output_path, signature_path):# 打开PDF文件c = canvas.Canvas(output_path, pagesize=letter)# 读取签名文件with open(signature_path, 'rb') as sign_file:# 加载签名图像c.drawImage(sign_file, 100, 100, width=100, height=100)# 生成MD5哈希值作为数字签名with open(output_path, 'rb') as file:data = file.read()signature = md5(data).hexdigest()# 在PDF页面上添加签名文本c.setFont("Helvetica", 12)c.setFillColor(colors.black)c.drawString(100, 80, "Digital Signature: {}".format(signature))# 保存并关闭PDF文件c.save()print("数字签名已成功应用于PDF文件。")def verify_signature(pdf_path):# 打开PDF文件c = canvas.Canvas(pdf_path)# 获取签名文本signature = c.getPageNumber(1)# 验证签名with open(pdf_path, 'rb') as file:data = file.read()calculated_signature = md5(data).hexdigest()if signature == calculated_signature:print("数字签名有效。")else:print("数字签名无效。")# 调用示例
input_file = 'input.pdf'
output_file = 'output.pdf'
signature_file = 'signature.png'sign_pdf(input_file, output_file, signature_file)
verify_signature(output_file)

在此示例中,我们使用ReportLab库创建一个新的PDF文件,并将签名图像和数字签名文本添加到页面上。数字签名是通过对PDF文件的内容进行MD5哈希计算得到的。在验证签名时,我们再次对PDF文件的内容进行MD5哈希计算,并将其与签名文本进行比较以验证签名的有效性。

请注意,此示例仅用于演示目的。在实际应用中,数字签名的生成和验证通常需要使用更复杂的算法和证书机制。您可能需要进一步研究和实施适合您需求的数字签名方案。

(十二)压缩和优化示例代码

当使用PyMuPDF库进行PDF文件的压缩和优化时,你可以按照以下步骤进行操作:

  1. 安装PyMuPDF库:使用pip命令安装PyMuPDF库,可以在终端中运行以下命令:
pip install PyMuPDF
  1. 导入必要的模块:在Python脚本中导入fitz模块,它是PyMuPDF库的主要模块,提供了PDF文件的处理功能。
import fitz
  1. 打开PDF文件:使用fitz.open()函数打开要处理的PDF文件,并将其赋值给一个变量。
pdf = fitz.open('input.pdf')
  1. 遍历PDF页面:使用pdf.pages属性获取PDF文件中的所有页面,并使用循环遍历每个页面。
for page in pdf.pages:# 在这里进行页面的处理操作
  1. 压缩页面:对于每个页面,你可以使用page.compress()方法进行压缩。该方法接受一个参数,用于指定压缩的级别,可以是0到100之间的整数。较低的级的级别会产生更高的压缩率,但可能会导致图像质量的损失。较高的级别会保留更好的图像质量,但压缩率较低。以下是一个示例代码,演示如何压缩PDF页面:
import fitzdef compress_pdf(input_path, output_path, compression_level=0):pdf = fitz.open(input_path)for page in pdf.pages:page.compress(compression_level)pdf.save(output_path)pdf.close()# 示例使用
input_file = 'input.pdf'
output_file = 'compressed.pdf'
compression_level = 2  # 压缩级别,可以是0到100之间的整数compress_pdf(input_file, output_file, compression_level)

在上述示例中,compress_pdf()函数接受输入文件路径、输出文件路径和压缩级别作为参数。它打开输入文件,遍历每个页面,并使用指定的压缩级别对页面进行压缩。最后,保存并关闭PDF文件。

请注意,压缩级别为0表示最高压缩率但图像质量可能受损,而较高的级别保留更好的图像质量但压缩率较低。你可以根据需要调整压缩级别来平衡文件大小和图像质量。

除了压缩页面,PyMuPDF还提供了其他功能,如裁剪页面、旋转页面、提取文本和图像等。你可以根据具体需求使用PyMuPDF的其他功能来优化PDF文件。

(十三)批量处理示例代码

下面是使用fitz批量处理PDF文件示例代码:

import os
import fitzdef process_pdf_files(input_folder, output_folder):# 遍历输入文件夹中的所有PDF文件for filename in os.listdir(input_folder):if filename.endswith('.pdf'):input_path = os.path.join(input_folder, filename)output_path = os.path.join(output_folder, filename)# 打开PDF文件pdf = fitz.open(input_path)# 在这里进行相应的处理操作,如提取文本、合并文件等# ...# 保存处理后的PDF文件pdf.save(output_path)pdf.close()# 示例使用
input_folder = 'input_folder'
output_folder = 'output_folder'process_pdf_files(input_folder, output_folder)

在上述示例中,process_pdf_files()函数接受输入文件夹路径和输出文件夹路径作为参数。它遍历输入文件夹中的所有PDF文件,并针对每个文件进行处理操作。你可以根据需要在循环中添加适当的处理步骤,如提取文本、合并文件、压缩页面等。最后,保存处理后的PDF文件到输出文件夹。

要使用这个脚本,你需要将输入文件夹中的PDF文件命名为你想要的方式,并将输出文件夹指定为保存处理后的PDF文件的位置。确保在运行脚本之前安装了PyMuPDF库。

使用这个脚本,你可以方便地对大量的PDF文件进行批量处理,节省时间和努力。记得根据具体需求在循环中添加适当的处理步骤。

五、归纳知识点

在这里插入图片描述

当涉及到使用Python处理PDF文件时,以下是一些常用的Python库和相关知识点:

  1. PyMuPDF(也称为fitz):PyMuPDF是一个功能强大的PDF处理库,可以用于打开、读取、修改和保存PDF文件。它提供了许多功能,如压缩页面、裁剪页面、旋转页面、提取文本和图像等。

  2. PyPDF2:PyPDF2是另一个流行的用于处理PDF文件的Python库。它可以用于合并、拆分、旋转和提取PDF文件的页面,以及添加文本、图像和水印等。

  3. ReportLab:ReportLab是一个用于生成PDF文件的Python库。它提供了创建和编辑PDF文档的功能,包括添加文本、图像、表格和图形等。

  4. pdfrw:pdfrw是一个用于读取和写入PDF文件的Python库。它可以用于提取文本、图像和元数据,以及创建新的PDF文件。

  5. PyPDF4:PyPDF4是PyPDF2的更新版本,提供了更多的功能和修复了一些bug。它支持合并、拆分、旋转和提取PDF文件的页面,以及添加文本、图像和水印等。

  6. PDFMiner:PDFMiner是一个用于提取文本和元数据的Python库。它可以将PDF文件转换为可处理的文本格式,以便进行进一步的分析和处理。

  7. Camelot:Camelot是一个用于提取表格数据的Python库。它可以从PDF文件中提取表格,并将其转换为数据框(DataFrame)格式,方便进行数据分析和处理。

  8. tabula-py:tabula-py是另一个用于提取表格数据的Python库。它可以从PDF文件中提取表格,并将其转换为数据框(DataFrame)格式,以便进行进一步的数据处理。

在这里插入图片描述

这些库提供了丰富的功能,可以满足不同的PDF处理需求。根据具体的任务和要求,选择适合的库来处理PDF文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/769005.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

H5实现Web ECharts教程:轻松创建动态数据图表

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

【OpenBayes 官方教程】快速部署通义千问 72B 大模型

本教程主要为大家介绍怎样在 OpenBayes 上快速部署通义千文 72B 大模型&#xff0c;新朋友点击下方链接注册后&#xff0c;即可获得 4 小时 RTX 4090 5 小时 CPU 的免费使用时长哦&#xff01; 注册链接 https://openbayes.com/console/signup?ryuudi_nBBThttps://openbaye…

算法|数学与数论|素数筛

数学与数论|素数筛 1.判断素数 2.朴素筛 3.埃氏筛 4.欧拉筛(线性筛) 心有猛虎&#xff0c;细嗅蔷薇。你好朋友&#xff0c;这里是锅巴的C\C学习笔记&#xff0c;常言道&#xff0c;不积跬步无以至千里&#xff0c;希望有朝一日我们积累的滴水可以击穿顽石。 质数(素数)&…

【教程】高效数据加密混淆方法及实现简介

背景 在需要对数据进行传输或者表达时&#xff0c;通常要求数据加密的安全级别不高&#xff0c;但希望加解密时间复杂度尽可能低。这时使用传统的对称加密&#xff08;如3DES、AES&#xff09;或非对称加密&#xff08;如RSA、ECC&#xff09;显然不太适合。因为加密的安全级别…

【MySQL】10. 复合查询(重点)

复合查询&#xff08;重点&#xff09; 前面我们讲解的mysql表的查询都是对一张表进行查询&#xff0c;在实际开发中这远远不够。 1. 基本查询回顾 数据还是使用之前的雇员信息表 在标题7的位置&#xff01; mysql> select * from emp where sal > 500 or job MANAG…

【数据结构取经之路】队列循环队列

目录 引言 队列的性质 队列的基本操作 初始化 判空 销毁 队列的长度 插入 删除 返回队头元素 循环队列 假溢出 空与满的判定 实现 初始化 插入 判空 销毁 删除 返回队列长度 返回队列头元素 判满 引言 队列和栈一样&#xff0c;也是数据结构的一种&…

特征工程 | 数据清洗、异常值处理、归一化、标准化、特征提取

目录 一. 数据清洗1. 数据清洗&#xff1a;格式内容错误数据清洗2. 数据清洗&#xff1a;逻辑错误清洗3. 数据清洗&#xff1a;去除不需要的数据4. 数据清洗&#xff1a;关联性验证 二. 异常值的处理1. 删除2. 填充 三. 归一化和标准化1. 归一化2. 标准化 四. 特征提取1. One-H…

MyBatis是纸老虎吗?(六)

经过前面一些列文章的梳理&#xff0c;我们已将MyBatis框架所需要的资源都准备好了&#xff1a;数据库连接信息储存在Configuration对象中的Environment属性中&#xff08;该对象中有这样几个属性String类型的id&#xff0c;TransactionFactory类型的transactionFactory、DataS…

如何优雅的爬取公众号文章

目录 相关函数库介绍 代码例子 IP池免费送 相关函数库介绍 在合法合规的前提下&#xff0c;爬取微信公众号文章可以使用以下几个Python库&#xff1a; requests&#xff1a;这是一个非常流行的HTTP库&#xff0c;用于发送各种HTTP请求。它简单易用&#xff0c;能够高效地处…

关于序列化和反序列化

什么是序列化&#xff0c;什么是反序列化 简单来说&#xff1a; 序列化&#xff1a;将数据结构或对象转换成二进制字节流的过程反序列化&#xff1a;将在序列化过程中所生成的二进制字节流转换成数据结构或者对象的过程 为什么要进行序列化 我们要将java对象进行网络传输&a…

TorchAcc:基于 TorchXLA 的分布式训练框架

演讲人&#xff1a;林伟&#xff0c;阿里云研究员&#xff0c;阿里云人工智能平台 PAI 技术负责人 本文旨在探讨阿里云 TorchAcc&#xff0c;这是一个基于 PyTorch/XLA 的大模型分布式训练框架。 过去十年 AI 领域的显著进步&#xff0c;关键在于训练技术的革新和模型规模的快…

详细剖析多线程2----线程安全问题(面试高频考点)

文章目录 一、概念二、线程不安全的原因三、解决线程不安全问题--加锁&#xff08;synchronized&#xff09;synchronized的特性 四、死锁问题五、内存可见性导致的线程安全问题 一、概念 想给出⼀个线程安全的确切定义是复杂的&#xff0c;但我们可以这样认为&#xff1a; 在多…

立体统计图表绘制方法(凸显式环图)

立体统计图表绘制方法&#xff08;凸显式环图&#xff09; 记得我学统计学的时候&#xff0c;那些统计图表大都是平面的框框图&#xff0c;很呆板&#xff0c;就只是表现出统计的意义就好了。在网络科技发展进步的当下&#xff0c;原来一些传统的统计图表都有了进一步的创新。在…

RDGCN翻译

RDGCN翻译 Relation-Aware Entity Alignment for Heterogeneous Knowledge Graphs 面向异质知识图谱的关系感知实体对齐 阅读时间&#xff1a;2024.03.24 领域&#xff1a;知识图谱&#xff0c;知识对齐 作者&#xff1a;Yuting Wu等人 PKU 出处&#xff1a;IJCAI Abstract…

HarmonyOS NEXT应用开发之听歌识曲水波纹特效案例

介绍 在很多应用中&#xff0c;会出现点击按钮出现水波纹的特效。 效果图预览 使用说明 进入页面&#xff0c;点击按钮&#xff0c;触发水波纹动画。再次点击按钮&#xff0c;停止水波纹动画。 实现思路 本例涉及的关键特性和实现方案如下&#xff1a; 要实现存在两个连续…

C++ - 类和对象(上)

目录 一、类的定义 二、访问限定符 public&#xff08;公有&#xff09; protected&#xff08;保护&#xff09; private&#xff08;私有&#xff09; 三、类声明和定义分离 四、外部变量和成员变量的区别与注意 五、类的实例化 六、类对象的模型 七、类的this指针…

TCP详解

一、TCP报文段结构 1、源端口号和目的端口号都是16位&#xff0c;范围从&#xff08;1-65535&#xff0c;0不可用&#xff09; 2、序列号&#xff1a;在建立连接时由内核生成的随机数作为其初始值&#xff0c;通过 SYN 报文传给接收端主机&#xff0c;每发送一次数据&#xff0…

C语言数据结构易错知识点(5)(插入排序、选择排序)

插入排序&#xff1a;直接插入排序、希尔排序 选择排序&#xff1a;直接选择排序、堆排序 上述排序都是需要掌握的&#xff0c;但原理不会讲解&#xff0c;网上有很多详尽地解释&#xff0c;本文章主要分享一下代码实现上应当注意的事项 1.直接插入排序&#xff1a; 代码实…

拥抱C++的深度和复杂性,挖掘更多可能 !——《C++20高级编程(第5版)》

&#xff0c;C难以掌握&#xff0c;但其广泛的功能使其成为游戏和商业软件应用程序中最常用的语言。即使是有经验的用户通常也不熟悉许多高级特性&#xff0c;但C20的发布提供了探索该语言全部功能的绝佳机会。《C20高级编程(第5版)》为C的必要内容提供了一个代码密集型、面向解…

(AtCoder Beginner Contest 325) ---- D - Printing Machine -- 题解

目录 D - Printing Machine&#xff1a; 题目大意&#xff1a; 思路解析&#xff1a; 代码实现&#xff1a; D - Printing Machine&#xff1a; 题目大意&#xff1a; 思路解析&#xff1a; 打印一次后&#xff0c;需要充电一微秒后才能再次打印就可以看作每微妙只能打印一…