更新了README.md
parent
965af7c53f
commit
cd4d226f34
|
@ -14,9 +14,9 @@
|
||||||
|
|
||||||
### 视频资源
|
### 视频资源
|
||||||
|
|
||||||
1. [《Python零基础教程快速上手》](https://www.bilibili.com/video/BV1FT4y1R7sz) - Python基础部分的视频,因为随堂录制,有的时候声音会有点小,点赞过3000就为大家重新录制一套声音和画面都更好的精讲版视频。
|
视频在抖音和B站都可以找到,有兴趣的小伙伴可以关注我的抖音或B站账号,最近刚刚起号,还希望大家多多支持,非常感谢!
|
||||||
2. [《Python零基础数据库可视化教程》](https://www.bilibili.com/video/BV1dA411w7tu)- 数据库部分的视频,随堂录制,数据库部分讲得比较简单,后面还讲了一些做数据可视化系统的内容,我自己对这套视频不是很满意,点赞过2000之后就重新做一套面向数据分析师精讲数据库的视频,重点放在SQL和业务查询知识上,解决数据分析师日常提数问题。
|
|
||||||
3. [《Scrapy爬虫框架教学》](https://www.bilibili.com/video/BV1QY411F7Vt)- 爬虫框架Scrapy教学视频,随堂录制,讲解了一个爬取淘宝商品信息的项目,有一点实用价值,爬虫本身并不是我感兴趣的内容,就将就看看吧。
|
<img src="res/qrcode.JPG" style="zoom:24%;" />
|
||||||
|
|
||||||
### 文件资源
|
### 文件资源
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@
|
||||||
|
|
||||||
1. 骆昊的Python学习群-1,群号:789050736,2000人大群。
|
1. 骆昊的Python学习群-1,群号:789050736,2000人大群。
|
||||||
2. 骆昊的Python学习群-2,群号:837590310,2000人大群。
|
2. 骆昊的Python学习群-2,群号:837590310,2000人大群。
|
||||||
3. 骆昊的Python学习群-3,群号:784430256,1000人大群。
|
3. 骆昊的Python学习群-3,群号:784430256,2000人大群。
|
||||||
|
|
||||||
<img src="https://github.com/jackfrued/mypic/raw/master/20220616120218.JPG" style="zoom: 75%;">
|
<img src="https://github.com/jackfrued/mypic/raw/master/20220616120218.JPG" style="zoom: 75%;">
|
||||||
|
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 731 KiB |
|
@ -17,7 +17,7 @@ Python语言支持很多种运算符,我们先用一个表格为大家列出
|
||||||
| `is` `is not` | 身份运算符 |
|
| `is` `is not` | 身份运算符 |
|
||||||
| `in` `not in` | 成员运算符 |
|
| `in` `not in` | 成员运算符 |
|
||||||
| `not` `or` `and` | 逻辑运算符 |
|
| `not` `or` `and` | 逻辑运算符 |
|
||||||
| `=` `+=` `-=` `*=` `/=` `%=` `//=` `**=` `&=` `|=` `^=` `>>=` `<<=` | (复合)赋值运算符 |
|
| `=` `+=` `-=` `*=` `/=` `%=` `//=` `**=` `&=` `\|=` `^=` `>>=` `<<=` | (复合)赋值运算符 |
|
||||||
|
|
||||||
>**说明:** 上面这个表格实际上是按照运算符的优先级从上到下列出了各种运算符。所谓优先级就是在一个运算的表达式中,如果出现了多个运算符,应该先执行哪个运算再执行哪个运算的顺序。在实际开发中,如果搞不清楚运算符的优先级,可以使用圆括号来确保运算的执行顺序。
|
>**说明:** 上面这个表格实际上是按照运算符的优先级从上到下列出了各种运算符。所谓优先级就是在一个运算的表达式中,如果出现了多个运算符,应该先执行哪个运算再执行哪个运算的顺序。在实际开发中,如果搞不清楚运算符的优先级,可以使用圆括号来确保运算的执行顺序。
|
||||||
|
|
||||||
|
|
|
@ -15,9 +15,9 @@ pip install PyPDF2
|
||||||
```Python
|
```Python
|
||||||
import PyPDF2
|
import PyPDF2
|
||||||
|
|
||||||
reader = PyPDF2.PdfFileReader('test.pdf')
|
reader = PyPDF2.PdfReader('test.pdf')
|
||||||
page = reader.getPage(0)
|
for page in reader.pages:
|
||||||
print(page.extractText())
|
print(page.extract_text())
|
||||||
```
|
```
|
||||||
|
|
||||||
> **提示**:上面代码中使用的PDF文件“test.pdf”以及下面的代码中需要用到的PDF文件,也可以通过下面的百度云盘地址进行获取。链接:https://pan.baidu.com/s/1rQujl5RQn9R7PadB2Z5g_g 提取码:e7b4。
|
> **提示**:上面代码中使用的PDF文件“test.pdf”以及下面的代码中需要用到的PDF文件,也可以通过下面的百度云盘地址进行获取。链接:https://pan.baidu.com/s/1rQujl5RQn9R7PadB2Z5g_g 提取码:e7b4。
|
||||||
|
@ -36,31 +36,18 @@ pdf2text.py test.pdf
|
||||||
上面的代码中通过创建`PdfFileReader`对象的方式来读取PDF文档,该对象的`getPage`方法可以获得PDF文档的指定页并得到一个`PageObject`对象,通过`PageObject`对象的`rotateClockwise`和`rotateCounterClockwise`方法可以实现页面的顺时针和逆时针方向旋转,通过`PageObject`对象的`addBlankPage`方法可以添加一个新的空白页,代码如下所示。
|
上面的代码中通过创建`PdfFileReader`对象的方式来读取PDF文档,该对象的`getPage`方法可以获得PDF文档的指定页并得到一个`PageObject`对象,通过`PageObject`对象的`rotateClockwise`和`rotateCounterClockwise`方法可以实现页面的顺时针和逆时针方向旋转,通过`PageObject`对象的`addBlankPage`方法可以添加一个新的空白页,代码如下所示。
|
||||||
|
|
||||||
```Python
|
```Python
|
||||||
import PyPDF2
|
reader = PyPDF2.PdfReader('XGBoost.pdf')
|
||||||
|
writer = PyPDF2.PdfWriter()
|
||||||
|
|
||||||
from PyPDF2.pdf import PageObject
|
for no, page in enumerate(reader.pages):
|
||||||
|
if no % 2 == 0:
|
||||||
# 创建一个读PDF文件的Reader对象
|
new_page = page.rotate(-90)
|
||||||
reader = PyPDF2.PdfFileReader('resources/XGBoost.pdf')
|
|
||||||
# 创建一个写PDF文件的Writer对象
|
|
||||||
writer = PyPDF2.PdfFileWriter()
|
|
||||||
# 对PDF文件所有页进行循环遍历
|
|
||||||
for page_num in range(reader.numPages):
|
|
||||||
# 获取指定页码的Page对象
|
|
||||||
current_page = reader.getPage(page_num) # type: PageObject
|
|
||||||
if page_num % 2 == 0:
|
|
||||||
# 奇数页顺时针旋转90度
|
|
||||||
current_page.rotateClockwise(90)
|
|
||||||
else:
|
else:
|
||||||
# 偶数页反时针旋转90度
|
new_page = page.rotate(90)
|
||||||
current_page.rotateCounterClockwise(90)
|
writer.add_page(new_page)
|
||||||
writer.addPage(current_page)
|
|
||||||
# 最后添加一个空白页并旋转90度
|
with open('temp.pdf', 'wb') as file_obj:
|
||||||
page = writer.addBlankPage() # type: PageObject
|
writer.write(file_obj)
|
||||||
page.rotateClockwise(90)
|
|
||||||
# 通过Writer对象的write方法将PDF写入文件
|
|
||||||
with open('resources/XGBoost-modified.pdf', 'wb') as file:
|
|
||||||
writer.write(file)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 加密PDF文件
|
### 加密PDF文件
|
||||||
|
@ -70,14 +57,16 @@ with open('resources/XGBoost-modified.pdf', 'wb') as file:
|
||||||
```Python
|
```Python
|
||||||
import PyPDF2
|
import PyPDF2
|
||||||
|
|
||||||
reader = PyPDF2.PdfFileReader('resources/XGBoost.pdf')
|
reader = PyPDF2.PdfReader('XGBoost.pdf')
|
||||||
writer = PyPDF2.PdfFileWriter()
|
writer = PyPDF2.PdfWriter()
|
||||||
for page_num in range(reader.numPages):
|
|
||||||
writer.addPage(reader.getPage(page_num))
|
for page in reader.pages:
|
||||||
# 通过encrypt方法加密PDF文件,方法的参数就是设置的密码
|
writer.add_page(page)
|
||||||
|
|
||||||
writer.encrypt('foobared')
|
writer.encrypt('foobared')
|
||||||
with open('resources/XGBoost-encrypted.pdf', 'wb') as file:
|
|
||||||
writer.write(file)
|
with open('temp.pdf', 'wb') as file_obj:
|
||||||
|
writer.write(file_obj)
|
||||||
```
|
```
|
||||||
|
|
||||||
### 批量添加水印
|
### 批量添加水印
|
||||||
|
@ -85,23 +74,17 @@ with open('resources/XGBoost-encrypted.pdf', 'wb') as file:
|
||||||
上面提到的`PageObject`对象还有一个名为`mergePage`的方法,可以两个PDF页面进行叠加,通过这个操作,我们很容易实现给PDF文件添加水印的功能。例如要给上面的“XGBoost.pdf”文件添加一个水印,我们可以先准备好一个提供水印页面的PDF文件,然后将包含水印的`PageObject`读取出来,然后再循环遍历“XGBoost.pdf”文件的每个页,获取到`PageObject`对象,然后通过`mergePage`方法实现水印页和原始页的合并,代码如下所示。
|
上面提到的`PageObject`对象还有一个名为`mergePage`的方法,可以两个PDF页面进行叠加,通过这个操作,我们很容易实现给PDF文件添加水印的功能。例如要给上面的“XGBoost.pdf”文件添加一个水印,我们可以先准备好一个提供水印页面的PDF文件,然后将包含水印的`PageObject`读取出来,然后再循环遍历“XGBoost.pdf”文件的每个页,获取到`PageObject`对象,然后通过`mergePage`方法实现水印页和原始页的合并,代码如下所示。
|
||||||
|
|
||||||
```Python
|
```Python
|
||||||
import PyPDF2
|
reader1 = PyPDF2.PdfReader('XGBoost.pdf')
|
||||||
|
reader2 = PyPDF2.PdfReader('watermark.pdf')
|
||||||
|
writer = PyPDF2.PdfWriter()
|
||||||
|
watermark_page = reader2.pages[0]
|
||||||
|
|
||||||
from PyPDF2.pdf import PageObject
|
for page in reader1.pages:
|
||||||
|
page.merge_page(watermark_page)
|
||||||
|
writer.add_page(page)
|
||||||
|
|
||||||
reader1 = PyPDF2.PdfFileReader('resources/XGBoost.pdf')
|
with open('temp.pdf', 'wb') as file_obj:
|
||||||
reader2 = PyPDF2.PdfFileReader('resources/watermark.pdf')
|
writer.write(file_obj)
|
||||||
writer = PyPDF2.PdfFileWriter()
|
|
||||||
# 获取水印页
|
|
||||||
watermark_page = reader2.getPage(0)
|
|
||||||
for page_num in range(reader1.numPages):
|
|
||||||
current_page = reader1.getPage(page_num) # type: PageObject
|
|
||||||
current_page.mergePage(watermark_page)
|
|
||||||
# 将原始页和水印页进行合并
|
|
||||||
writer.addPage(current_page)
|
|
||||||
# 将PDF写入文件
|
|
||||||
with open('resources/XGBoost-watermarked.pdf', 'wb') as file:
|
|
||||||
writer.write(file)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
如果愿意,还可以让奇数页和偶数页使用不同的水印,大家可以自己思考下应该怎么做。
|
如果愿意,还可以让奇数页和偶数页使用不同的水印,大家可以自己思考下应该怎么做。
|
||||||
|
|
Loading…
Reference in New Issue