用Python实现办公自动化(自动化处理PDF文件)

news2024/12/23 18:15:30

自动化处理 PDF 文件

目录

自动化处理 PDF 文件

谷歌浏览器 Chrome与浏览器驱动ChromeDriver安装

(一)批量下载 PDF 文件

1.使用Selenium模块爬取多页内容

2.使用Selenium模块下载PDF文件

3.使用urllib模块来进行网页的下载和保存 

4.使用urllib&Selenium模块判断下载和保存

(二)批量合并 PDF 文件

(三)批量拆分 PDF 文件

(四)批量加密 PDF 文件

(五)批量为 PDF 文件添加水印

1.自定义函数创建水印文件

2.自定义函数添加水印

3.使用循环为每个PDF文件添加水印


Chrome:浏览器

Selenium:是一个用于浏览器自动化测试的工具集,是一个完整的自动化测试框架

WebDriver:是Selenium的一个关键组件,用于控制和操作浏览器

ChromeDriver:是Webdriver的一个实现,专门用于控制和操作Google Chrome浏览器

谷歌浏览器 Chrome与浏览器驱动ChromeDriver安装

Chrome 73 版本以后, ChromeDriver 和 Chrome 版本是一对一,版本号是一样的。

查看网址:Chrome for Testing availability

a1e28477038e47f695d2dbb386991b56.png

39ec7a20717549bab53f4d3793c9949b.png

“安装路径展示”

5705e144bf984a6a9933c8913b60f5a4.png

6ccb967539b640698537999d8202ace1.png

(一)批量下载 PDF 文件

1.使用Selenium模块爬取多页内容

 Eg:以下载巨潮资讯网的上市公司公告PDF文件为例。

“获取公告总数”

8557a3dc07cf420a8dc696dd939a75a9.png

d3f6b665469942a99ba028711c0a5cda.png

“获取[下一页]单击按钮”

7f7e9eeaf6d74272b1f0c71753b4ff3f.png

“获取公告标题和网址”

3fa681ece5584a1490c9e9efd6e8cabf.png

d1b47c132bc142fa8ba08ef4c5d16e41.png

95e7b97459814d85a94d1949e844f3a8.png

"python程序完整代码"

在Selenium 4之后的版本中,由于引入了新的查找策略,原来的基于by_*方法的查找方式已经被弃用,需要使用新的方法。“find_element”配合By类来进行元素定位。

# 利用Selenium模块模拟鼠标单击"下一页"按钮
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import re

# 1.获取公告总数和单页次数
browser = webdriver.Chrome()
url = "http://www.cninfo.com.cn/new/fulltextSearch?notautosubmit=&keyWord=理财"
browser.get(url)
time.sleep(5)
data = browser.page_source
p_count = '<span class="total-box" style="">约 (.*?) 条'
count = re.findall(p_count, data)[0]
pages = int(int(count) / 10)
# 2.用Selenium模块模拟单击”下一页“按钮
datas = []
datas.append(data)
for i in range(1):
    browser.find_element(
        By.XPATH,
        '//*[@id="fulltext-search"]/div[2]/div/div/div[3]/div[3]/div[2]/div/button[2]',
    ).click()
    time.sleep(3)
    data = browser.page_source
    datas.append(data)
    time.sleep(3)
# 3.将列表转换为字符串
alldata = "".join(datas)
browser.quit()
# 4.通过正则表达式提取公告标题和网址
p_title = '<span title="" class="r-title">(.*?)</a>'
p_href = '<a target="_blank" href="(.*?)".*?<span title='
# 5.将提取公告标题和网址的正则表达式应用到汇总了所有页面源代码的字符串变量alldata中
title = re.findall(p_title, alldata)
href = re.findall(p_href, alldata)
# 6.对爬取到的数据进行清洗工作
for i in range(len(title)):
    title[i] = re.sub("<.*?>", "", title[i])
    href[i] = "http://www.cninfo.com.cn" + href[i]
    href[i] = re.sub("amp;", "", href[i])
    print(str(i + 1) + "." + title[i])
    print(href[i])

"程序运行结果展示"

d3947b69d2954a2bb3d9235119a0005d.png

2.使用Selenium模块下载PDF文件

在搜索”理财“的结果网址:

http://www.cninfo.com.cn/new/fulltextSearch?notautosubmit=&keyWord=理财

中,单击任意一个公告标题,打开公告PDF文件的下载页面,网址变更为:

http://www.cninfo.com.cn/new/disclosure/detail?orgId=9900014267&announcementId=1219372722&announcementTime=2024-03-22

自动下载页面PDF文件,使用Selenium模块模拟单击页面中的”公告下载

2d7016b2c85a4f328a77ce14f4fa52fb.png

查看源码,右键获取“公告下载”按钮的XPath内容:

//*[@id="noticeDetail"]/div/div[1]/div[3]/div[1]/button

"

文件存在危险,因此 Chrome 已将其拦截

"

daf7286f9c8248aa89350d22298c4740.png

"python程序完整代码【单公告】"

# 利用Selenium模块模拟鼠标单击"下一页"按钮
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
import time

# 设置Chrome驱动本地目录
chromedriver_path = "C:\\Program Files\\Google\\Chrome\\Application\\chromedriver-win64\\chromedriver.exe"
# 创建ChromeOptions对象并设置下载目录
chrome_options = Options()
# 启用无头模式,隐藏 Chrome 窗口以在后台执行。
chrome_options.add_argument("--headless")
# 禁用 GPU 加速。
chrome_options.add_argument("--disable-gpu")
# 这两个参数通常用于 Docker 容器中运行测试。
# chrome_options.add_argument("--no-sandbox")   # 运行在没有沙箱的环境中
# chrome_options.add_argument("--disable-dev-shm-usage")    # 禁用/dev/shm目录用于临时文件存储
# 隐身模式(无痕模式)
chrome_options.add_argument("--incognito")
# 设置浏览器的下载参数
chrome_options.add_experimental_option(
    "prefs",
    {
        "download.default_directory": r"D:\pppp\第4章\批量下载的PDF文件\公告",  # 指定文件下载路径。
        "download.prompt_for_download": False,  # 禁用下载提示对话框(直接开始下载)。
        "download.directory_upgrade": True,  # 启用目录升级,以确保文件下载到指定的文件夹。
        "download_restrictions": 0,  # 禁用下载保护,允许下载所有类型的内容。
        "safebrowsing_for_trusted_sources_enabled": False,  # 禁用针对受信任来源的安全浏览。
        "safebrowsing.enabled": False,  # 禁用安全浏览,允许下载被 Chrome 识别为不安全的文件。
    },
)
# 说明: Selenium从4.10以后不再支持executeable_path参数了,需要使用service对象参数代替
browser = webdriver.Chrome(service=Service(chromedriver_path), options=chrome_options)
browser.get(
    "http://www.cninfo.com.cn/new/disclosure/detail?orgId=9900014267&announcementId=1219372722&announcementTime=2024-03-22"
)
try:
    # 找到下载链接并点击下载文件
    browser.find_element(
        By.XPATH, '//*[@id="noticeDetail"]/div/div[1]/div[3]/div[1]/button'
    ).click()
    time.sleep(30)
    # 退出模拟浏览器。quit 必须要有,否则停留后台,需要在任务管理器中手动关闭
    browser.quit()
    print("下载完毕")
except:
    print("没有PDF文件")

"python程序完整代码【批量】"

# 利用Selenium模块模拟鼠标单击"下一页"按钮
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
import time
import re

# 1.获取公告总数和单页次数
browser = webdriver.Chrome()
url = "http://www.cninfo.com.cn/new/fulltextSearch?notautosubmit=&keyWord=理财"
browser.get(url)
time.sleep(5)
data = browser.page_source
p_count = '<span class="total-box" style="">约 (.*?) 条'
count = re.findall(p_count, data)[0]
pages = int(int(count) / 10)
# 2.用Selenium模块模拟单击”下一页“按钮
datas = []
datas.append(data)
for i in range(1):
    browser.find_element(
        By.XPATH,
        '//*[@id="fulltext-search"]/div[2]/div/div/div[3]/div[3]/div[2]/div/button[2]',
    ).click()
    time.sleep(3)
    data = browser.page_source
    datas.append(data)
    time.sleep(3)
# 3.将列表转换为字符串
alldata = "".join(datas)
browser.quit()
# 4.通过正则表达式提取公告标题和网址
p_title = '<span title="" class="r-title">(.*?)</a>'
p_href = '<a target="_blank" href="(.*?)".*?<span title='
# 5.将提取公告标题和网址的正则表达式应用到汇总了所有页面源代码的字符串变量alldata中
title = re.findall(p_title, alldata)
href = re.findall(p_href, alldata)
# 6.对爬取到的数据进行清洗工作
for i in range(len(title)):
    title[i] = re.sub("<.*?>", "", title[i])
    href[i] = "http://www.cninfo.com.cn" + href[i]
    href[i] = re.sub("amp;", "", href[i])
    print(str(i + 1) + "." + title[i])
    print(href[i])


# 7.批量下载下载PDF文件
def driver_download():
    # 设置Chrome驱动本地目录
    chromedriver_path = "C:\\Program Files\\Google\\Chrome\\Application\\chromedriver-win64\\chromedriver.exe"
    # 创建ChromeOptions对象并设置下载目录
    chrome_options = Options()
    # 启用无头模式,隐藏 Chrome 窗口以在后台执行。
    chrome_options.add_argument("--headless")
    # 禁用 GPU 加速。
    chrome_options.add_argument("--disable-gpu")
    # 隐身模式(无痕模式)
    chrome_options.add_argument("--incognito")
    # 设置浏览器的下载参数
    chrome_options.add_experimental_option(
        "prefs",
        {
            "download.default_directory": r"D:\pppp\第4章\批量下载的PDF文件\公告",  # 指定文件下载路径。
            "download.prompt_for_download": False,  # 禁用下载提示对话框(直接开始下载)。
            "download.directory_upgrade": True,  # 启用目录升级,以确保文件下载到指定的文件夹。
            "download_restrictions": 0,  # 禁用下载保护,允许下载所有类型的内容。
            "safebrowsing_for_trusted_sources_enabled": False,  # 禁用针对受信任来源的安全浏览。
            "safebrowsing.enabled": False,  # 禁用安全浏览,允许下载被 Chrome 识别为不安全的文件。
        },
    )

    # 说明: Selenium从4.10以后不再支持executeable_path参数了,需要使用service对象参数代替
    browser = webdriver.Chrome(
        service=Service(chromedriver_path), options=chrome_options
    )
    return browser


for i in range(len(href)):
    browser = driver_download()
    browser.get(href[i])
    try:
        # 找到下载链接并点击下载文件
        browser.find_element(
            By.XPATH, '//*[@id="noticeDetail"]/div/div[1]/div[3]/div[1]/button'
        ).click()
        time.sleep(30)
        # 退出模拟浏览器。quit 必须要有,否则停留后台,需要在任务管理器中手动关闭
        browser.quit()
        print("下载完毕")
    except:
        print("没有PDF文件")

3.使用urllib模块来进行网页的下载和保存 

案例:网址:

沅陵县国民经济和社会发展第十四个五年规划和二〇三五年远景目标纲要 - 沅陵县人民政府

e203827d882f4158b176fb4b02e894b3.png

“Python程序完整代码”

import os.path

from selenium import webdriver
from selenium.webdriver.common.by import By
from urllib.request import urlretrieve
from selenium.webdriver.chrome.service import Service
import time

# 设置Chrome驱动本地目录
chromedriver_path = "C:\\Program Files\\Google\\Chrome\\Application\\chromedriver-win64\\chromedriver.exe"
# 说明: Selenium从4.10以后不再支持executeable_path参数了,需要使用service对象参数代替
browser = webdriver.Chrome(service=Service(chromedriver_path))
url = "http://www.yuanling.gov.cn/yuanling/c132955/202112/ac08a665e96644ad8e6e31215f518c77.shtml"
browser.get(url)
time.sleep(2)
# XPath选择所有图片
img_elements = browser.find_elements(
    By.XPATH, "/html/body/div[2]/div[2]/div[2]/div/img"
)
# 循环遍历图片元素并下载图片
for img in img_elements:
    src = img.get_attribute("src")
    print(src.title())
    # src为要下载文件的URL地址;filename参数用于指定下载后文件的保存路径和文件名。
    urlretrieve(src, filename=os.path.join("D:\\pppp\\test\\", src.split("/")[-1]))
# 关闭WebDriver
browser.quit()

"查看下载图片"

4542ab2c98e64835b4d70d15effa6e42.png

4.使用urllib&Selenium模块判断下载和保存

如果图片是Base64编码的,则会进行解码后保存;否则,会直接根据图片的源地址进行保存。

“Python程序完整代码”

import os.path

from selenium import webdriver
from selenium.webdriver.common.by import By
from urllib.request import urlretrieve
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
import time

# 设置Chrome驱动本地目录
chromedriver_path = "C:\\Program Files\\Google\\Chrome\\Application\\chromedriver-win64\\chromedriver.exe"
# 创建ChromeOptions对象并设置下载目录
chrome_options = Options()
# 启用无头模式,隐藏 Chrome 窗口以在后台执行。
chrome_options.add_argument("--headless")
# 禁用 GPU 加速。
chrome_options.add_argument("--disable-gpu")
# 隐身模式(无痕模式)
chrome_options.add_argument("--incognito")
# 设置浏览器的下载参数
chrome_options.add_experimental_option(
    "prefs",
    {
        "download.default_directory": r"D:\pppp\test2",  # 指定文件下载路径。
        "download.prompt_for_download": False,  # 禁用下载提示对话框(直接开始下载)。
        "download.directory_upgrade": True,  # 启用目录升级,以确保文件下载到指定的文件夹。
        "download_restrictions": 0,  # 禁用下载保护,允许下载所有类型的内容。
        "safebrowsing_for_trusted_sources_enabled": False,  # 禁用针对受信任来源的安全浏览。
        "safebrowsing.enabled": False,  # 禁用安全浏览,允许下载被 Chrome 识别为不安全的文件。
    },
)
# 说明: Selenium从4.10以后不再支持executeable_path参数了,需要使用service对象参数代替
browser = webdriver.Chrome(service=Service(chromedriver_path), options=chrome_options)
url = "http://www.yuanling.gov.cn/yuanling/c132955/202112/ac08a665e96644ad8e6e31215f518c77.shtml"
browser.get(url)
time.sleep(2)
# XPath选择所有图片
img_elements = browser.find_elements(
    By.XPATH, "/html/body/div[2]/div[2]/div[2]/div/img"
)
# 循环遍历图片元素并下载图片
counter = 1
for img in img_elements:
    try:
        # 获取图片的源地址
        src = img.get_attribute("src")

        # 如果图片是Base64编码的,则需要解码并保存
        if src.startswith("data:image"):
            import base64

            data = src.split(",")[1]
            with open(f"image_{counter}.png", "wb") as file:
                file.write(base64.b64decode(data))
        else:
            # 直接通过源地址保存图片
            import urllib.request

            urllib.request.urlretrieve(
                src, filename=os.path.join("D:\\pppp\\test2\\", f"image_{counter}.png")
            )
        counter += 1
    except Exception as e:
        print(f"Error saving image: {e}")

# 关闭浏览器
browser.quit()

“下载保存结果展示”

95c1ff3dfb144f9ead864a970794a306.png

(二)批量合并 PDF 文件

“合并前PDF文件”

2af9264942e44ec99b33e209e77c60a8.png

“Python完整程序代码”

# 导入pathlib模块中的Path()函数,用于完成路径相关操作
from pathlib import Path

# 使用Python第三方模块PyPDF2来操控PDF文件.PdfReader类用于读取PDF文件,PdfMerger类用于合并PDF文件
from PyPDF2 import PdfReader, PdfMerger

# 1.设置相关文件夹路径
src_folder = Path("D:\\pppp\\第4章\\批量下载的PDF文件\\公告\\")
des_file = Path("D:\\pppp\\第4章\\批量下载的PDF文件\\公告\\合并后的公告文件.PDF")
if not des_file.parent.exists():
    des_file.parent.mkdir(parents=True)
file_list = list(src_folder.glob("*.PDF"))
# 2.逐个读取PDF文件并进行合并
merger = PdfMerger()
outputPages = 0
for pdf in file_list:
    inputfile = PdfReader(str(pdf))
    merger.append(inputfile)
    pageCount = len(inputfile.pages)
    print(f"{pdf.name} 页数:{pageCount}")
    outputPages += pageCount
# 3.将合并后的PDF文件写入指定的路径中
merger.write(str(des_file))
# 4.关闭PdfFileMerger对象,释放占用的系统资源
merger.close()
print(f"\n合并后的总页数:{outputPages}")

“合并后的PDF文件”

080ebb0331224cf3a35f9e70aff21abc.png

63ac5f05281b4620baa95d34f4cd629d.png

(三)批量拆分 PDF 文件

“Python程序完整代码”

# 采用按照固定页数进行拆分的方式
# 导入pathlib模块中的Path()函数,用于完成路径相关操作
from pathlib import Path

# 使用Python第三方模块PyPDF2来操控PDF文件.PdfReader类用于读取PDF文件,PdfWriter类用于输出PDF文件
from PyPDF2 import PdfReader, PdfWriter

# 1.0 设置相关文件夹路径
src_folder = Path("D:\\pppp\\第4章\\批量下载的PDF文件\\公告\\")
file_list = list(src_folder.glob("*.PDF"))
# 2.0 逐个读取PDF文件并获取页数,计算拆分后的份数,每份的页数设置为5
step = 5
for pdf in file_list:
    inputfile = PdfReader(str(pdf))
    pages = len(inputfile.pages)
    if pages <= step:
        print(f"【{pdf.name}】页数为{pages},小于等于每份的页数{step},不做拆分")
        continue
    parts = pages // step + 1
    # 3.0 根据份数进行循环,计算每一份的开始页码和结束页码
    for pt in range(parts):
        start = step * pt
        if pt != (parts - 1):
            end = start + step - 1
        else:
            end = pages - 1
        # 4.0 拆分PDF文件,调用路径对象的stem属性获取文件的主名
        outputfile = PdfWriter()
        for pn in range(start, end + 1):
            outputfile.add_page(inputfile.pages[pn])
        pt_name = f"{pdf.stem}_第{pt+1}部分.pdf"
        pt_file = src_folder / pt_name
        with open(pt_file, "wb") as f_out:
            outputfile.write(f_out)
    # 5.0 输出拆分完毕的信息
    print(f"【{pdf.name}】页数为{pages},拆分为{parts}部分")

“批量拆分后的信息”

7090a8cabddf40ababfe49a5d6c174de.png

9a3e9ad99bb44a5c9999ca61f99e3573.png

(四)批量加密 PDF 文件

为PDF文件设置打开密码来防止泄密。

“Python完整代码”

"""
为PDF文件设置打开密码来防止泄密
"""
# 导入pathlib模块中的Path()函数,用于完成路径相关操作
from pathlib import Path

# 使用Python第三方模块PyPDF2来操控PDF文件.PdfReader类用于读取PDF文件,PdfWriter类用于输出PDF文件
from PyPDF2 import PdfReader, PdfWriter

# 1.0 设置相关文件夹路径
src_folder = Path("D:\\pppp\\第4章\\批量下载的PDF文件\\公告\\")
file_list = list(src_folder.glob("*.PDF"))
# 2.0 逐个读取PDF文件
for pdf in file_list:
    inputfile = PdfReader(str(pdf))
    outputfile = PdfWriter()
    pageCount = len(inputfile.pages)
    for page in range(pageCount):
        outputfile.add_page(inputfile.pages[page])
    # 3.0 将PDF文件的打开密码设置为“123456”
    outputfile.encrypt("123456")
    # 4.0 设置加密后的PDF文件名
    des_name = f"{pdf.stem}_secret.pdf"
    des_file = src_folder / des_name
    with open(des_file, "wb") as f_out:
        outputfile.write(f_out)

“查看加密文件”

50a439690aff4df6a3748276c9aa420f.png

de015a0a70e1442a96fd1dceead3e7db.png

(五)批量为 PDF 文件添加水印

为了防止PDF文件内容被他人随意盗用,可以为PDF文件添加水印。

1.自定义函数创建水印文件

要批量添加水印,需准备一个PDF格式的水印文件。

“Python程序代码”

"""
为PDF文件添加水印,防止他人随意盗用
"""
# 导入pathlib模块中的Path()函数,用于完成路径相关操作
from pathlib import Path

# 使用Python第三方模块PyPDF2来操控PDF文件.PdfReader类用于读取PDF文件,PdfWriter类用于输出PDF文件
from PyPDF2 import PdfReader, PdfWriter

# 使用Python第三方模块reportlab来制作水印文件
from reportlab.lib.units import cm
from reportlab.pdfgen import canvas
import reportlab.pdfbase.ttfonts


def create_watermark(content):
    """
    自定义函数:创建水印文件,并对水印文字的字体,字号等格式进行设置
    """
    # 设置水印文件的文件名
    file_name = "水印.PDF"
    # 设置水印文件的页面大小,默认大小是21cm×29.7cm
    a = canvas.Canvas(file_name, pagesize=(30 * cm, 30 * cm))
    # 设置页面的坐标原点,默认(0,0)左下角
    a.translate(5 * cm, 0 * cm)
    # 注册水印文字要使用的字体,注意:如果水印文字为中文,需使用显示中文的字体,否则水印文字会显示为乱码
    reportlab.pdfbase.pdfmetrics.registerFont(
        reportlab.pdfbase.ttfonts.TTFont(
            "阿里巴巴普惠体", "D:\\pppp\\第4章\\Alibaba-PuHuiTi-Regular.ttf"
        )
    )
    # 设置水印文字的字体
    a.setFont("阿里巴巴普惠体", 25)
    # 设置水印文字的旋转角度
    a.rotate(30)
    # 设置水印文字的填充颜色
    a.setFillColorRGB(0, 0, 0)
    # 设置水印文字的透明度
    a.setFillAlpha(0.2)
    # 在页面绘制6行6列的水印文字
    for i in range(0, 30, 5):
        for j in range(0, 30, 5):
            # drawString()的前两个参数为文字的坐标,第三个参数为文字的内容
            a.drawString(i * cm, j * cm, content)
    a.save()
    return file_name

2.自定义函数添加水印

为每一页PDF都添加水印。

“Python程序代码”

def add_watermark(pdf_file_in, pdf_file_mark, pdf_file_out):
    """
    自定义函数:为每一页PDF文件添加水印
    """
    outputfile = PdfWriter()
    inputfile = PdfReader(pdf_file_in)
    pageCont = len(inputfile.pages)
    markfile = PdfReader(pdf_file_mark)
    # 读取PDF文件的每一页,与水印文件融合后添加到PdfWriter对象中
    for i in range(pageCont):
        page = inputfile.pages[i]
        page.merge_page(markfile.pages[0])
        outputfile.add_page(page)
    with open(pdf_file_out, "wb") as f_out:
        outputfile.write(f_out)

3.使用循环为每个PDF文件添加水印

“Python程序代码”

# 1.0 设置相关文件夹路径
src_folder = Path("D:\\pppp\\第4章\\批量下载的PDF文件\\公告\\")
des_folder = Path("D:\\pppp\\第4章\\批量下载的PDF文件\\公告添加水印后\\")
if not des_folder.exists():
    des_folder.mkdir(parents=True)
file_list = list(src_folder.glob("*.PDF"))
# 2.0依次为每个PDF文件添加水印
for pdf in file_list:
    pdf_file_in = str(pdf)
    # 设置水印的文本内容
    pdf_file_mark = create_watermark("巨潮资讯网")
    pdf_file_out = str(des_folder / pdf.name)
    add_watermark(pdf_file_in, pdf_file_mark, pdf_file_out)

“水印文件查看”

042f7787749744fbb39e0338ecf1a1d9.png

c092638d201942b19b47532fac5c8e1b.png

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

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

相关文章

前端性能优化-Table渲染速度优化

教务系统-排课页面性能优化总结 一、前言 在公司教务系统中,排课页面慢的令人发指,在某些情况由于数据量大导致页面主进程卡死,遂组织进行一次排查优化,现记录一下 二、效果对比 以下数据均为UAT环境 Performence对比 更改前: 主进程渲染时间为 8s 教务系统-排课页面性…

SpringBoot+uniApp宠物领养小程序系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1.保存宠物信息代码2.提交订单信息代码3.查询评论信息代码 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SpringBootuniApp框架开发的宠物领养微信小程序系统。…

wps 开发插件

官方文档参考wps官方文档参考 1.环境安装 安装wps https://www.wps.cn/ 安装Node.js https://nodejs.org/en 安装代码编辑器 Visual Studio Code https://code.visualstudio.com/ 环境检查-进入cmd查看 node -v2.demo 2.1 demo下载 打开vscode&#xff0c;新建终端 安装…

渗透测试练习题解析 5(CTF web)

1、[安洵杯 2019]easy_serialize_php 1 考点&#xff1a;PHP 反序列化逃逸 变量覆盖 【代码审计】 通过 GET 的方式获取参数 f 的值&#xff0c;传递给变量 function 定义一个过滤函数&#xff0c;过滤掉特定字符&#xff08;用空字符替换&#xff09; 下面的代码其实没什么用…

面试智力题

面试智力题 二进位bit1. 题目&#xff1a;一千杯水&#xff0c;一杯水有毒&#xff0c;怎么用10只老鼠&#xff0c;把这杯水找出来&#xff08;1&#xff09;解法1&#xff1a;常规法&#xff08;2&#xff09;bit法&#xff08;位数法&#xff09; (3) 时间法三级目录 二进位b…

Flutter Web 的未来,Wasm Native 即将到来

早在去年 Google I/O 发布 Flutter 3.10 的时候就提到过&#xff0c; Flutter Web 的未来会是 Wasm Native &#xff0c;当时 Flutter 团队就表示&#xff0c;Flutter Web 的定位不是设计为通用 Web 的框架&#xff0c;类似的 Web 框架现在有很多&#xff0c;而 Flutter 的定位…

Vision-Language Models for Vision Tasks: A Survey

论文地址&#xff1a;https://arxiv.org/pdf/2304.00685.pdf 项目地址&#xff1a;https://github.com/jingyi0000/VLM_survey 一、综述动机 视觉语言模型&#xff0c;如CLIP&#xff0c;以其独特的训练方式显著简化了视觉识别任务的流程。它减少了对大量精细标注数据的依赖&a…

文生图大模型三部曲:DDPM、LDM、SD 详细讲解!

1、引言 跨模态大模型是指能够在不同感官模态(如视觉、语言、音频等)之间进行信息转换的大规模语言模型。当前图文跨模态大模型主要有&#xff1a; 文生图大模型&#xff1a;如 Stable Diffusion系列、DALL-E系列、Imagen等 图文匹配大模型&#xff1a;如CLIP、Chinese CLIP、…

Rust---有关介绍

目录 Rust---有关介绍变量的操作Rust 数值库&#xff1a;num某些基础数据类型序列(Range)字符类型单元类型 发散函数表达式&#xff08;&#xff01; 语句&#xff09; Rust—有关介绍 得益于各种零开销抽象、深入到底层的优化潜力、优质的标准库和第三方库实现&#xff0c;Ru…

Unity中UI系统1——GUI

介绍 工作原理和主要作用 基本控件 a.文本和按钮控件 练习&#xff1a; b.多选框和单选框 练习&#xff1a; 用的是第三种方法 c.输入框和拖动框 练习&#xff1a; 练习二&#xff1a; e.图片绘制和框 练习&#xff1a; 复合控件 a.工具栏和选择网格 练习&#xff1a; b.滚动视…

关于OcenaBase v4.2中,分区转移和负载均衡的技术解读

OceanBase​​​​​​​​​​​​​​作为一款原生分布式数据库&#xff0c;其核心的技术特性之一是高可扩展性&#xff0c;其具体表现在两个方面&#xff1a; 首先&#xff0c;是灵活的扩缩容能力&#xff0c;包括垂直扩缩容和水平扩缩容&#xff1a; 垂直扩缩容&#xff…

android APP monkey 测试

monkey 测试 一、电脑ADB安装及使用详解1、什么是 Monkey 测试2、什么是ADB3、ADB的作用4、安装前提条件5、ADB下载6、ADB安装与配置 二、连接安卓手机检查是否连接上安卓手机windows端安装ADB驱动 三、 monkey测试操作指令演示指令APP包名查看方式测试效果 一、电脑ADB安装及使…

蜜罐技术---德迅猎鹰

什么是蜜罐 蜜罐是一种互联网安全系统&#xff0c;部署诱饵和陷阱在关键网络入口&#xff0c;诱导攻击者攻击伪装目标&#xff0c;保护真实资产&#xff0c;并且对攻击者做行为取证和追踪溯源&#xff0c;定位攻击者自然人身份&#xff0c;提升主动防御能力&#xff0c;让安全…

Ps:阈值

阈值 Threshold命令可将灰度图像或彩色图像转换为仅包含黑色和白色的二值图像。 Ps菜单&#xff1a;图像/调整/阈值 Adjustments/Threshold Ps菜单&#xff1a;图层/新建调整图层/阈值 New Adjustment Layer/Threshold 阈值命令通过设置一个特定的亮度阈值&#xff08;阈值色阶…

EasyCVR视频汇聚平台海康Ehome2.0与5.0设备接入时的配置区别

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

ZCMU操作系统课程实验 - 实验1-Linux的使用

登录 1. 打开这个东西 2. 在 文件 - > 打开 中打卡机房里VMOS文件里的这个东东 3. 然后依次操作下去好了&#xff0c;有红色的选项&#xff0c;我都是选的"Do nothing"。完成后就会出现这样一个黑框框。 4. 让你登录。输入&#xff1a;root。密码&…

第十七章 Kafka

一、特性 - 高吞吐、低延迟 - 高伸缩性 - 持久性、可靠性 - 容错性 - 高并发 通过 O(1)的磁盘数据结构提供消息的持久化&#xff0c;这种结构对于即使数以 TB 的消息存储也能够保持长时间的稳定性能。 高吞吐量&#xff1a;即使是非常普通的硬件 Kafka 也可以支持每秒数百…

MSOX3104T是德科技MSOX3104T示波器

181/2461/8938产品概述&#xff1a; Keysight MSOX3104T X 系列示波器提供您更快获得测量见解所需的所有性能和功能&#xff0c;再次重新定义了您对通用示波器的期望。除了触摸的优点外&#xff0c;内置 USB 主机和 USB 设备端口还使 PC 连接变得容易。InfiniiVision MSOX3104…

Nginx 日志输出配置json格式

nginx日志输出配置json格式 nginx服务器日志相关指令主要有两条&#xff1a; (1) 一条是log_format&#xff0c;用来设置日志格式 (2) 另外一条是access_log&#xff0c;用来指定日志文件的存放路径、格式和缓存大小。 log_format指令用来设置日志的记录格式&#xff0c;它的语…

【面试八股总结】传输控制协议TCP(一)

一、什么是TCP协议 TCP是传输控制协议Transmission Control Protocol TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。 面向连接的&#xff1a;每条TCP连接杜只能有两个端点&#xff0c;每一条TCP连接只能是点对点的&#xff08;一对一&#xff09;可靠的&#xff1a…