当前位置: 首页 > news >正文

Day29笔记-Python操作pdfPython发送邮件

一、Python操作PDF【了解】

1.pdf 简介

PDF是Portable Document Format的缩写,这类文件通常使用.pdf作为其扩展名。在日常开发工作中,最容易遇到的就是从PDF中读取文本内容以及用已有的内容生成PDF文档这两个任务。

在Python中,可以使用名为PyPDF2的三方库来读取PDF文件,可以使用下面的命令来安装它。

pip install PyPDF2==2.3.1      # 安装指定版本
pip install PyPDF2          # 安装最新版本
2.从PDF中提取文本和加密PDF文件

PyPDF2没有办法从PDF文档中提取图像、图表或其他媒体,但它可以提取文本,并将其返回为Python字符串。

使用PyPDF2中的PdfFileWriterPdfWriter对象可以为PDF文档加密,如果需要给一系列的PDF文档设置统一的访问口令,使用Python程序来处理就会非常的方便。

# 注意:安装:pypdf2     导入:PyPDF2
import PyPDF2
​
# 1.读取pdf文件中的文本内容
# a.获取reader对象
reader = PyPDF2.PdfReader(r'data/XGBoost.pdf')
# b.获取指定页的字典
print(reader.pages)   # 列表,其中的元素是字典
page = reader.pages[0]
print(page)
# c.获取指定页的文本内容
# 废弃的函数
# text = page.extractText()
# print(text)
# 更新之后的函数
text = page.extract_text()    # *****
print(text)
'''
PyPDF2.errors.DeprecationError: extractText is deprecated废弃 and was removed in PyPDF2 3.0.0. Use extract_text instead.
'''
​
# 2.加密pdf文件
# a.创建writer对象
writer = PyPDF2.PdfWriter()
# b.获取已知文件中的每一页,添加到新的文件对象中去
for i in range(len(reader.pages)):page = reader.pages[i]writer.add_page(page)
# c.设置加密
writer.encrypt('abc123')    # *******
​
# d.保存文件
with open(r'data/XGBoost-加密.pdf','wb') as f:writer.write(f)   # 注意和f.write()区别,f.write()只能传参字符串
3.旋转和创建空白pdf文件

可以获得PDF文档的指定页并得到一个PageObject对象,通过PageObject对象的rotateClockwiserotateCounterClockwise方法可以实现页面的顺时针和逆时针方向旋转,通过PageObject对象的add_blank_page方法可以添加一个新的空白页

import  PyPDF2
​
# 1.旋转
# a.创建reader和writer对象
reader = PyPDF2.PdfReader(r'data/XGBoost.pdf')
writer = PyPDF2.PdfWriter()
​
# b.旋转
# 需求1:将第0页顺时针旋转180
# page_0 = reader.pages[0]
# # page_0.rotate(angle),angle为正数:顺时针旋转   angle为负数:逆时针旋转
# page_0.rotate(-90)
# writer.add_page(page_0)
​
# 需求2:批量旋转
for i in range(len(reader.pages)):page = reader.pages[i]if i % 2 == 0:page.rotate(90)     # ******else:page.rotate(-90)writer.add_page(page)
​
# c.添加空白pdf
writer.add_blank_page()
​
# 注意:如果打开新生成的文件,报错文件损坏,则可能是writer是空的
with open(r'data/XGBoost-旋转.pdf','wb') as f:writer.write(f)
​
4.批量添加水印【掌握】

上面提到的PageObject对象还有一个名为mergePage的方法,可以两个PDF页面进行叠加,通过这个操作,我们很容易实现给PDF文件添加水印的功能。例如要给上面的“XGBoost.pdf”文件添加一个水印,我们可以先准备好一个提供水印页面的PDF文件,然后将包含水印的PageObject读取出来,然后再循环遍历“XGBoost.pdf”文件的每个页,获取到PageObject对象,然后通过mergePage方法实现水印页和原始页的合并

import PyPDF2
​
# 1.创建reader和writer对象
src_reader = PyPDF2.PdfReader(r'data/XGBoost.pdf')
water_reader = PyPDF2.PdfReader(r'data/watermark.pdf')
writer = PyPDF2.PdfWriter()
​
# 2.遍历已知文件的每一页对象,和水印页进行合并,最终将合并之后的结果添加到writer中
water_page = water_reader.pages[0]  # 获取水印页对象
for i in range(len(src_reader.pages)):src_page = src_reader.pages[i]  # 获取原文件每一页的对象# 合并# a.merge_page(b):将b合并到a上src_page.merge_page(water_page)   # *****# 将合并之后的对象添加给writerwriter.add_page(src_page)
​
with open(r'data/XGBoost-添加水印.pdf','wb') as f:writer.write(f)

二、发送邮件【重要】

1.概念

SMTP(Simple Mail Transfer Protocol),即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。

python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。

Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。

Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负 责发送邮件。

2.邮件服务器设置

1.设置发送方的qq 邮箱

  • 选取邮箱设置

  • 开启smtp协议

  • 发送短信获取授权码

  • 获取qq邮箱授权码

2.设置发送方163 邮箱

  • 选取邮箱设置

  • 开启smtp协议

  • 打开网易邮箱大师,扫码发送短信获取授权码

  • 获取qq邮箱授权码

3.发送邮件流程
  1. 登录邮箱

     import smtplib 
    1. 连接邮箱服务器连接对象 = smtplip.SMTP_SSL(服务器地址, 邮箱服务端口)- 服务器地址:smtp.163.com(163邮箱)、smtp.qq.com(qq邮箱) - 邮箱服务端口:465
    2. 登录邮箱连接对象.login(邮箱账号, 授权码)
  2. 准备数据

    数据指的需要发送的内容。邮件内容的构建需要涉及到另外一个库email,它可以用来构建邮件主题以及各种形式的邮件内容,包括文字内容、图片内容、html内容、附件等
    ​
    from email.mime.multipart
    import MIMEMultipart
    from email.mime.text import MIMEText
    from email.header import Header
    1. 创建邮件对象邮件对象 = MIMEMultipart()
    2. 设置邮件主题主题对象 = Header(邮件标题, 编码方式).encode()邮件对象['Subject'] = 主题对象
    3.设置邮件发送者邮件对象['From'] = '用户名 <用户名>' 4.设置邮件接受者邮件对象['To'] = '收件人1;收件人2;收件人3...' 5. 添加文文字内容文字内容对象 = MIMEText(内容, 类型, 编码方式) - 内容:就是文字符串串- 类型:plain(简单的文字内容)、html(超文本)邮件对象.attach(文字对象)
  3. 发送邮件

    1.连接对象.sendmail(发件人, 收件人, 邮件对象.as_string()) 
    2.连接对象.quit()
4.实现
4.1发送文本

注意:有时候会涉及到发送 html邮件,html格式的邮件本质还是文本格式的邮件,所有文件的构建方式和普通文本文件的构建方式差不多:

from email.mime.text import MIMEText
文本对象 = MIMEText(内容字符串, 'html', 编码方式) 
邮件对象.attach(文本对象)
'''
获取发送方邮箱的授权码:qq授权码:qzoepkfnqecxhddc163授权码:HRHVSCXKGSVWYRKG
​
发送方的SMTP服务器:smtp.163.comsmtp.qq.comsmtp.126.com
'''
​
# 需求:发送方:163邮箱  接受方:qq,同学的qq,163
# 一、导入模块
import  smtplib   # 发送邮件
from email.mime.text import MIMEText    # emial:构建邮件      MIMEText:文本对象
​
# 二、封装函数:
# 发送方账号
sender_account = '18501970795@163.com'
# 接收方账号
recivers_acount = ['1490980468@qq.com','2440311490@qq.com']
# a.构建邮件
def form_email():# 创建MIMEText对象data = MIMEText('今天星期四,天气很好~~~~')# 主题data['Subject'] = '通过Python发送纯文本文件'# 发送方data["From"] = sender_account# 接收方data["To"] = ';'.join(recivers_acount)return data
​
# b.发送邮件
def send_email():data = form_email()
​# smtp服务器mail_host = 'smtp.163.com'# 创建连接对象smtp_obj = smtplib.SMTP_SSL(mail_host,465)# 登录发送方的邮箱账号,需要给定授权码,注意:不是邮箱的登录密码sender_allow_pwd  = 'HRHVSCXKGSVWYRKG'smtp_obj.login(sender_account,sender_allow_pwd)print('邮箱登录成功~~~~~~')# 发送邮件smtp_obj.sendmail(sender_account,recivers_acount,data.as_string())# 退出smtp_obj.quit()print('邮件发送成功~~~~~~')
​
if __name__ == '__main__':send_email()
​# 注意:运行该程序之前,可以先关闭防火墙,杀毒软件
4.2发送html
# 需求:发送方:163邮箱  接受方:qq,同学的qq,163
# 一、导入模块
import  smtplib   # 发送邮件
from email.mime.text import MIMEText    # emial:构建邮件      MIMEText:文本对象
from email.mime.multipart import MIMEMultipart   # 构建多个内容
​
# 二、封装函数:
# 发送方账号
sender_account = '18501970795@163.com'
# 接收方账号
recivers_acount = ['1490980468@qq.com','2440311490@qq.com']
​
# a.构建邮件
def form_email():# 创建MIMEText对象data = MIMEMultipart()# 主题data['Subject'] = '通过Python发送html文本文件'# 发送方data["From"] = sender_account# 接收方data["To"] = ';'.join(recivers_acount)# 正文:html文本html_str = '''<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>html邮件正文内容</h1>
<ol><li>教学部</li><li>行政部</li><li>财务部</li><li>运营部</li>
</ol>
<table width="500" border="1" cellspacing="0"><tr align="center"><td>姓名</td><td>年龄</td><td>性别</td><td>地址</td></tr><tr align="center"><td>张明</td><td>10</td><td>male</td><td>上海</td></tr><tr align="center"><td>小王</td><td>11</td><td>female</td><td>北京</td></tr>
</table>
</body>
</html>'''text = MIMEText(html_str,'html','utf-8')   # utf-8是文本内容的编码格式data.attach(text)return data
​
# b.发送邮件
def send_email():data = form_email()
​# smtp服务器mail_host = 'smtp.163.com'# 创建连接对象smtp_obj = smtplib.SMTP_SSL(mail_host,465)# 登录发送方的邮箱账号,需要给定授权码,注意:不是邮箱的登录密码sender_allow_pwd  = 'HRHVSCXKGSVWYRKG'smtp_obj.login(sender_account,sender_allow_pwd)print('邮箱登录成功~~~~~~')# 发送邮件smtp_obj.sendmail(sender_account,recivers_acount,data.as_string())# 退出smtp_obj.quit()print('邮件发送成功~~~~~~')
​
if __name__ == '__main__':send_email()
​# 注意:运行该程序之前,可以先关闭防火墙,杀毒软件
4.3发送图片
from email.mime.image import MIMEImage
图片对象 = MIMEImage(图片二进制数据)
# 需求:发送方:163邮箱  接受方:qq,同学的qq,163
# 一、导入模块
import  smtplib   # 发送邮件
from email.mime.text import MIMEText    # emial:构建邮件      MIMEText:文本对象
from email.mime.multipart import MIMEMultipart   # 构建多个内容
from email.mime.image import MIMEImage   # 图片
​
# 二、封装函数:
# 发送方账号
sender_account = '18501970795@163.com'
# 接收方账号
recivers_acount = ['1490980468@qq.com','2440311490@qq.com']
​
# a.构建邮件
def form_email():# 创建MIMEText对象data = MIMEMultipart()# 主题data['Subject'] = '通过Python发送html文本文件'# 发送方data["From"] = sender_account# 接收方data["To"] = ';'.join(recivers_acount)
​# 正文内容:图片with open(r'data/logo.png','rb') as f:img_data = f.read()# 构建图片对象img = MIMEImage(img_data)img.add_header('Content-ID','testimg')html_str = """<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>图片邮件内容</h1>
<p><img src="cid:testimg">
</p>
</body>
</html>"""text = MIMEText(html_str, 'html', 'utf-8')# 附加文本data.attach(text)# 附加图片data.attach(img)return data
​
# b.发送邮件
def send_email():data = form_email()
​# smtp服务器mail_host = 'smtp.163.com'# 创建连接对象smtp_obj = smtplib.SMTP_SSL(mail_host,465)# 登录发送方的邮箱账号,需要给定授权码,注意:不是邮箱的登录密码sender_allow_pwd  = 'HRHVSCXKGSVWYRKG'smtp_obj.login(sender_account,sender_allow_pwd)print('邮箱登录成功~~~~~~')# 发送邮件smtp_obj.sendmail(sender_account,recivers_acount,data.as_string())# 退出smtp_obj.quit()print('邮件发送成功~~~~~~')
​
if __name__ == '__main__':send_email()
​# 注意:运行该程序之前,可以先关闭防火墙,杀毒软件
4.4发送文件附件
from email.mime.text import MIMEText
文件对象 = MIMEText(文件二进制数据, 'base64', 编码方式) 
文件对象["Content-Disposition"] = 'attachment; filename="文件名"' 
邮件对象.attach(文件对象)
# 需求:发送方:163邮箱  接受方:qq,同学的qq,163
# 一、导入模块
import  smtplib   # 发送邮件
from email.mime.text import MIMEText    # emial:构建邮件      MIMEText:文本对象
from email.mime.multipart import MIMEMultipart   # 构建多个内容
​
# 二、封装函数:
# 发送方账号
sender_account = '18501970795@163.com'
# 接收方账号
recivers_acount = ['1490980468@qq.com','2440311490@qq.com']
​
# a.构建邮件
def form_email():# 创建MIMEText对象data = MIMEMultipart()# 主题data['Subject'] = '通过Python发送html文本文件'# 发送方data["From"] = sender_account# 接收方data["To"] = ';'.join(recivers_acount)
​# 附件with open(r'data/致橡树.txt','r',encoding='gbk') as f:file_data = f.read()# 构建文本对象text = MIMEText(file_data, 'base64', 'gbk')  # gbk是文件的编码格式# 将文本对象设置为附件text["Content-Disposition"] = 'attachment; filename="lianxi.txt"'# 附加文本data.attach(text)return data
​
# b.发送邮件
def send_email():data = form_email()
​# smtp服务器mail_host = 'smtp.163.com'# 创建连接对象smtp_obj = smtplib.SMTP_SSL(mail_host,465)# 登录发送方的邮箱账号,需要给定授权码,注意:不是邮箱的登录密码sender_allow_pwd  = 'HRHVSCXKGSVWYRKG'smtp_obj.login(sender_account,sender_allow_pwd)print('邮箱登录成功~~~~~~')# 发送邮件smtp_obj.sendmail(sender_account,recivers_acount,data.as_string())# 退出smtp_obj.quit()print('邮件发送成功~~~~~~')
​
if __name__ == '__main__':send_email()
​# 注意:运行该程序之前,可以先关闭防火墙,杀毒软件 

相关文章:

Day29笔记-Python操作pdfPython发送邮件

一、Python操作PDF【了解】 1.pdf 简介 PDF是Portable Document Format的缩写&#xff0c;这类文件通常使用.pdf作为其扩展名。在日常开发工作中&#xff0c;最容易遇到的就是从PDF中读取文本内容以及用已有的内容生成PDF文档这两个任务。 在Python中&#xff0c;可以使用名为P…...

Seata分布式事务实践

理论篇 什么是事务 关于事务我们一定会想到下面这四大特性: 原子性:所有操作要么全都完成&#xff0c;要么全都失败。 一致性: 保证数据库中的完整性约束和声明性约束。 隔离性:对统一资源的操作不会同时发生的。 持久性:对事务完成的操作最终会持久化到数据库中。 理解&…...

数字IC设计\FPGA 职位经典笔试面试整理--基础篇2

1. 卡诺图 逻辑函数表达式可以使用其最小项相加来表示&#xff0c;用所有的最小项可以转换为卡诺图进行逻辑项化简 卡诺图讲解资料1 卡诺图讲解资料2 卡诺图讲解资料3 最小项的定义 一个函数的某个乘积项包含了函数的全部变量&#xff0c;其中每个变量都以原变量或反变量的形…...

(务必收藏)推荐市面上8款AI自动写文献综述的网站

在当前的学术研究和论文写作中&#xff0c;AI技术的应用已经变得越来越普遍。特别是在文献综述这一环节&#xff0c;AI工具能够显著提高效率并减少人工劳动。以下是市面上8款推荐的AI自动写文献综述的网站&#xff1a; 一、千笔-AIPassPaper 是一款备受好评的AI论文写作平台&…...

【python】运算符

学习目标 了解 Python 中常见 算术&#xff08;数学&#xff09;运算符赋值运算符 算术&#xff08;数学&#xff09;运算符 a 是 10&#xff0c;b 是 20 运算符描述实例加两个对象相加 a b 输出结果 30-减得到负数或是一个数减去另一个数 a - b 输出结果 -10*乘两个数相…...

C++深入学习string类成员函数(1):默认与迭代

引言 在 C 编程中&#xff0c;std::string 类是处理字符串的核心工具之一。作为一个动态管理字符数组的类&#xff0c;它不仅提供了丰富的功能&#xff0c;还通过高效的内存管理和操作接口&#xff0c;极大地方便了字符串操作。通过深入探讨 std::string 的各类成员函数&#…...

DataGrip远程连接Hive

学会用datagrip远程操作hive 连接前提条件&#xff1a; 注意&#xff1a;mysql是否是开启状态 启动hadoop集群 start-all.sh 1、启动hiveserver2服务 nohup hiveserver2 >> /usr/local/soft/hive-3.1.3/hiveserver2.log 2>&1 & 2、beeline连接 beelin…...

go 读取excel

一、安装依赖 go get github.com/tealeg/xlsx二、main.go package mainimport "fmt" import "github.com/tealeg/xlsx"type Student struct {Name stringSex string }func (student Student) show() {fmt.Printf("Name:%s Sex:%s\r\n", stude…...

Linux进阶系列(四)——awk、sed、端口管理、crontab

目录 1. 写在前面2. awk —— 强大的文本处理工具2.1 awk 概述2.2 awk 脚本结构2.3 awk 的内置变量2.4 awk 的高级用法2.5 awk实践 3. sed —— 流式文本编辑器3.1 sed 的基本语法3.2 sed 常用命令3.3 sed 的高级用法 4. Linux 端口管理4.1 端口的概念4.2 查看端口状态4.3 开放…...

利用Metasploit进行信息收集与扫描

Metasploit之信息收集和扫描 在本文中&#xff0c;我们将学习以下内容 使用Metasploit被动收集信息 使用Metasploit主动收集信息 使用Nmap进行端口扫描 使用db_nmap方式进行端口扫描 使用ARP进行主机发现 UDP服务探测 SMB扫描和枚举 SSH版本扫描 FTP扫描 SMTP枚举 …...

基于Pytorch框架的深度学习MODNet网络精细人像分割系统源码

第一步&#xff1a;准备数据 人像精细分割数据&#xff0c;可分割出头发丝&#xff0c;为PPM-100开源数据 第二步&#xff1a;搭建模型 MODNet网络结构如图所示&#xff0c;主要包含3个部分&#xff1a;semantic estimation&#xff08;S分支&#xff09;、detail prediction…...

Go语言中的并发编程

Go语言中的并发编程Go语言中的并发编程主要依赖于两个核心概念&#xff1a;goroutine 和 channel。1. Goroutinegoroutine 的特点结束 goroutine2. Channel创建 Channel发送和接收数据Channel 的类型使用 select 语句简单的多个 goroutine使用 WaitGroup 等待所有 goroutine 完…...

python学习笔记(3)——控制语句

控制语句 我们在前面学习的过程中&#xff0c;都是很短的示例代码&#xff0c;没有进行复杂的操作。现在&#xff0c;我们将开始学习流程控制语句。 前面学习的变量、数据类型&#xff08;整数、浮点数、布尔&#xff09;、序列&#xff08;字符串、列表、元组、字 典、集合&am…...

关系数据库设计之Armstrong公理详解

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 一、Armstrong公理简介 Armstrong公理是一组在关系数据库理论中用于推导属性依赖的基本规则。这些公理是以著名计算机科学家威廉阿姆斯特朗&…...

【Geoserver使用】SRS处理选项

文章目录 前言一、Geoserver的三种SRS处理二、对Bounding Boxes计算的影响总结 前言 今天来看看Geoserver中发布图层时的坐标参考处理这一项。根据Geoserver官方文档&#xff0c;坐标参考系统 (CRS) 定义了地理参考空间数据与地球表面实际位置的关系。CRS 是更通用的模型&…...

python里面的单引号和双引号的区别

在Python中&#xff0c;单引号&#xff08;‘’&#xff09;和双引号&#xff08;“”&#xff09;在大多数情况下是等价的&#xff0c;没有本质区别。它们都用于创建字符串。以下是一些关键点&#xff1a; 功能相同&#xff1a; 两者都可以用来定义字符串&#xff0c;例如&…...

为什么不要在循环,条件或嵌套函数中调用hooks

为什么不要在循环&#xff0c;条件或嵌套函数中调用hooks 前言useState Hook 的工作原理具体实现1、初始化2、第一次渲染3、后续渲染4、事件处理简单代码实现 为什么顺序很重要Bad Component 第一次渲染Bad Component 第二次渲染 总结 前言 自从 React 推出 hooks 的 API 后&a…...

将成功请求的数据 放入apipost接口测试工具,发送给后端后,部分符号丢失

将成功请求的数据 放入apipost接口测试工具&#xff0c;发送给后端后&#xff0c;部分符号丢失 apipost、接口测试、符号、丢失、错乱、变成空格背景 做CA对接&#xff0c;保存CA系统的校验数据&#xff0c;需要模仿前端请求调起接口&#xff0c;以便测试功能完整性。 问题描…...

N诺计算机考研-错题

B A.LLC,逻辑链路控制子层。一个主机中可能有多个进程在运行,它们可能同时与其他的一些进程(在同一主机或多个主机中)进行通信。因此在一个主机的 LLC子层的一个服务访问点,以便向多个进程提供服务。B.MAC地址,称为物理地址、硬件地址,也称为局域网地址,用来定义网络设…...

vue3 数字滚动组件封装

相关参考文献 干货满满!如何优雅简洁地实现时钟翻牌器(支持JS/Vue/React) Vue3 插件方式 安装插件: countup.js 封装组件: components/count-up/index.js <template><div class="countup-wrap"><slot name="prefix"></slot&g…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...