让我们来谈谈PDF｡
我们如何处理它们？
我的意思是, 我们已经在上一节中学习了如何使用Python处理文件, 你可以想象,
我们可以处理任何我们学习过的关于图像处理的文件, 但我们也学习了,
我们可以处理任何文本文件, 任何PDF文件, 任何CSV或Excel文件｡
这些都是我们可以在Python中处理和使用的文件类型｡
在本节中, 我们将讨论PDF及其工作原理, 这些PDF知识将转换为不同的文件格式｡
我们将在后面的机器学习课程中讨论Excel文件和CSV文件｡
但是现在, 让我们来看看如何使用Python来简化我们的工作｡
现在, 我将链接到一些PDF文件, 我们将在本节中使用这些文件｡
我们有一个简单的虚拟PDF文件｡
我们有另一个PDF文件, 实际上有两个页面｡
然后我们会有一个水印PDF, 我们将在本节的最终项目中保存它｡
但我们还是回到这里吧｡
根据我们目前了解到的情况, 你认为我们的第一步是什么？
好的, 我们的第一步是找到一个库, 我们可以使用Python来处理PDF文件｡
准备好这一部分｡
我有一个非常令人印象深刻的网站, 可能是你见过的最好的网站, 可能是最干净, 最现代的网站｡
当谈到我们要安装的软件包时, 我们会安装一个叫做PIP三安装的软件包｡
页：1
是的｡
PDF格式｡
两个｡
现在有很多软件包, 我们可以安装, 当它涉及到PDF｡
这是我为这门课推荐的｡
现在, 在安装的过程中, 我已经安装好了｡
让我给你看看他们的网站文档是什么样的｡
准备好｡
真漂亮
在这里｡
哇哦｡
好吧, 我知道了
我不知道为什么, 但出于某种原因, python文档网站并不是最漂亮的｡
我是说, 这都是主观的, 对吧？
有些人喜欢这样, 但它不会让您对使用PDF感到兴奋｡
这个网站怎么办？
不管怎样, 你可以看到在这里, 它实际上不是一个大的图书馆｡
您可以单击文档并再次通读所有内容｡
但我们还是先学基础吧｡
所以我要做的第一件事就是把pi pdf导入到｡
我们要做的是处理第一个, 虚拟PDF, 就是这个PDF文件, 它是一个单独的页面,
上面写着“虚拟PDF文件”｡
没什么太刺激的｡
现在就去
我们怎么才能打开这个文件？
我们从前面的课程中了解到了这一点, 对吧？
我们可以使用open命令, 我们会说dummy dot pdf, 我可以这样说, 因为我们在同一个文件夹中｡
我有一个PDF文件, 我已经创建, 所以我只是说, 嘿, 从同一目录抓取虚拟pdf｡
在这里, 我们先读一下, 因为我想读这个文件, 然后写为文件, 现在打印文件,
看看我们得到了什么｡
我将运行这个文件, 用Python三个pdf点饼｡
看看会发生什么｡
好吧, 我会的
我收到一条短信｡
说唱歌手的名字, 假PDF.
好吧, 看起来起作用了｡
让我们再深入研究一下, 看看它是否真的有效｡
实际上, 我们可以使用PDF来读取文件｡
是这样｡
我们开始吧
我们可以说reader等于pie pdf, 并使用方法pdf｡
文件读取器｡
再来一次｡
它允许我们读取这个Python文件｡
所以我们给予它放在这里｡
然后我们将打印阅读器, 我们可以要求一些页面｡
同样, 这是随库提供的, 让我们运行它, 看看会发生什么｡
好吧, 我们得到一个错误｡
它表示pdf读取警告PDF文件读取器流文件对象不是二进制模式｡
那是什么意思？
记住, 二进制是1和0.
好吧, 我知道了
如果我点击“傻瓜”｡
模拟pdf｡
这不是我们认为的PDF, 这是pdf应该的样子｡
但是您可以看到, 根据您运行的程序, 它可能无法读取PDF文件｡
所以我们需要做的, 这只是一个标准, 你必须记住, 是我们想要读取二进制｡
先读取, 然后转换为二进制｡
这里所发生的就是创建一个文件流对象｡
所以它会把文件对象转换成二进制模式｡
以便将pdf转换为文件阅读器｡
可以读取此二进制文件对象｡
现在如果我再运行一次, 看看这个｡
它能够读取它｡
它告诉我这个只有一页｡
如果我做两页. pdf并运行这个｡
我们有两页纸｡
太棒了｡
让我们把这个弄清楚｡
回到我们的pdf｡
我为给这个pdf文件命名感到难过｡
我不应该对这个pdf那么刻薄｡
我下次我会改进我的命名惯例｡
所以就像我们在用pi pdf进行图像处理时看到的那样, 我们可以做很多事情来处理这个图像｡
例如, 我可以在这里做get page｡
如果我得到了一个页面, 比如说第一个页面, 我就运行这个｡
我们在这里得到页面对象｡
现在看起来像是乱码, 因为这是PDF创建的特殊对象｡
但如果我做了像第一页这样的事情, 在这种情况下就会是第二页｡
我得到一个错误, 一个索引错误, 说列表索引超出范围, 因为虚拟pdf只有一页｡
我们还可以做不同的事情, 比如, 旋转这张图像, 我们将它旋转180度｡
如果我运行这个｡
这不管用｡
这是为什么呢？
这是因为ppdf2使用了reader对象, 但是它需要知道旋转什么｡
在我们的例子中, 我们实际上必须让阅读器的页面旋转它｡
所以我们必须做一些类似reader dot的事情｡
获取页面｡
获取我们的虚拟pdf的第一页｡
并将其赋给page变量, 这样我们就有了page对象, 记住一个page对象和一个reader对象｡
我现在运行这个程序, 我得到页面对象没有属性旋转, 我可能骗了你一点, 以证明这里的一个观点｡
这个rotate对象听起来像是它应该有的东西, 但实际上它不是我们想要的正确名称｡
那么我们该如何解决这个问题呢？
这又回到了我们阅读文档的过程中｡
如果我回到文件读取器, 让我们搜索, 旋转, 或者回到这里, 我们会看到我们有页面对象类, 我们有,
对吗？
我们有页面对象｡
如果我点击这里, 我们可以找到旋转｡
我们有一些东西, 我们有合并旋转页面｡
我们继续, 继续, 继续, 好的, 我们顺时针旋转, 逆时针旋转, 角度｡
看来这就是我们需要的｡
我们实际上没有旋转方法, 但是你看这里, 这是我们如何计算库的功能｡
如果我们想的话, 我们也有规模｡
所以我们就顺时针复制旋转或者逆时针旋转｡
我们只做90个｡
如果我保存这个然后逃跑｡
好的, 我们在这里得到了一个对象, 但这个对象实际上在内存中｡
如果我回到我的假人那里｡
什么都没有改变, 因为我们没有真正保存任何东西｡
这些都在我的电脑内存里｡
当这个程序停止运行时, 它就会被丢弃｡
因此, 让我们更新我们的虚拟PDF, 以实际写入和逆时针旋转｡
我们如何才能做到这一点？
嗯, 用另一个带关键字的｡
所以在开的里面我们称之为开的, 我们称之为弯曲的.
我不知道这是否是你如何拼写板球, 所以让我们去倾斜点pdf｡
我们要打开这个文件, 然后以二进制格式写入｡
我们将称之为文件｡
在这里, 我们要将文件写入这个新文件｡
但我们如何才能做到这一点呢？
这个库给了我们一个叫做writer对象的东西, 这样我们就可以创建一个writer变量｡
而这个写入器变数会使用｡
PDF dot pdf而不是文件阅读器｡
我们有一份文件｡
作家｡
这使得我们可以写对象和记忆, 所以现在我可以说writer｡
点点｡
好吧, 我知道了
为了使命名约定适当, 假设这将是新文件｡
所以我们会说新文件｡
让我们来看看这是否有效｡
我去清场｡
让我们来运行这个｡
好吧, 我会的
我们有倾向于PDF｡
但是我们实际上忘记了做一件事, 因为我们刚刚打开了一个writer对象, 但我们实际上并没有在其中写入任何PDF｡
理想情况下, 我们得到旋转的页面并在其中写入, 对吗？
那么我们能做些什么呢？
是删除这里的打印｡
我们已经旋转了页面, 现在有了writer对象, 我们可以说writer, dot, add page,
然后给予它旋转过的页面.
所以现在如果我再运行一次｡
又去倾斜｡
好吧, 我们再一次看到了胡言乱语｡
但如果我们打开这个｡
你看那个｡
我们的pdf就是这样旋转的｡
非常, 非常酷｡
这很好, 但有点没用, 对吧？
谁会真正旋转PDF？
这真的很难阅读, 但至少这向您展示了我们处理PDF的能力｡
让我们在下一个视频中做一些更令人兴奋的事情｡
我想让我们做点比这更有用的事｡
我们休息一下下一场见｡