跳至主要内容

PDF处理

虚拟pdf打印机


pdfFactory 
开源



pdf阅读器

Sumatra PDF

https://www.sumatrapdfreader.org/



为什么 Python 用于 PDF 处理 

如您所知,PDF 处理属于文本分析。大多数文本分析库或框架仅使用 Python 设计。这为文本分析提供了优势。还有一件事,您永远无法在现有的机器学习或自然语言处理框架中直接处理 pdf。除非他们为此证明了显式接口。我们必须先将pdf转换为文本。我们可以使用下述任何库轻松实现这一点。

在线转换pdf

Sejda

每个文档 200 页的免费限制


PDF24 Tools

免费且易于使用的在线PDF工具

FreeOCR
http://www.paperfile.net/
适用于Windows的免费光学字符识别软件,支持大多数Twain扫描仪的扫描,还可以打开大多数扫描的PDF和多页Tiff图像以及流行的图像文件格式,FreeOCR输出纯文本,可以直接导出为Microsoft Word格式。不支持中文




wkhtmltopdfwkhtmltoimage
是使用 QT Webkit 渲染引擎将 HTML 渲染为 PDF 和各种图像格式的命令行工具。这些完全“无头”运行,不需要显示或显示服务。
https://wkhtmltopdf.org/

django-wkhtmltopdf
允许 Django 站点输出动态 PDF。它利用wkhtmltopdf库,允许您使用您知道的技术(HTML 和 CSS)进行编写,并输出 PDF 文件

https://django-wkhtmltopdf.readthedocs.io/en/latest/

django-easy-pdf
https://pypi.org/project/django-easy-pdf/0.1.0/
这个应用程序使得在 Django 中渲染 PDF 文件非常容易。它可用于从简单的 HTML 标记和 CSS 样式创建发票、账单和其他文档。您甚至可以嵌入图像并使用自定义字体

WeasyPrint

是一种智能解决方案,可帮助 Web 开发人员创建 PDF 文档。它将简单的 HTML 页面变成华丽的统计报告、发票、票据……

从技术角度来看,WeasyPrint 是一个 HTML 和 CSS 的可视化渲染引擎,可以导出为 PDF。它旨在支持用于打印的 Web 标准。WeasyPrint 是在 BSD 许可下提供的免费软件

ReportLab

是久经考验、超强大的开源引擎,用于创建复杂的、数据驱动的 PDF 文档和自定义矢量图形。它是免费的、开源的,并且是用 Python 编写的。该软件包每月的下载量超过 50,000 次,是标准 Linux 发行版的一部分,嵌入在许多产品中,并被选中为维基百科的打印/导出功能提供支持。


PDFMiner

是一个从 PDF 文档中提取信息的工具。与其他 PDF 相关工具不同,它完全专注于获取和分析文本数据。PDFMiner 允许获取页面中文本的确切位置,以及其他信息,例如字体或线条。它包括一个 PDF 转换器,可以将 PDF 文件转换为其他文本格式(如 HTML)。它有一个可扩展的 PDF 解析器,可用于文本分析以外的其他目的


pikepdf

是一个新兴的用于 PDF 处理的 Python 库。它是 Python + QPDF = “py” + “qpdf” = “pyqpdf”。如果您查看 PyPDF2 和 pdfrw 之间的比较,您会看到,它提供了一些两者都没有的功能

pdfrw

是一个 Python 库和实用程序,用于读取和写入 PDF 文件

slate


PyPDF2

PyPDF2 是一个纯 python PDF 库,能够拆分、合并、裁剪和转换 PDF 文件的页面。它还可以向 PDF 文件添加自定义数据、查看选项和密码。它可以从 PDF 中检索文本和元数据,也可以将整个文件合并在一起。
https://pythonhosted.org/PyPDF2/index.html



1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# 锁定或加密PDF文件
from PyPDF2 import PdfFileReader, PdfFileWriter

encrypted_file = PdfFileWriter()
original = PdfFileReader("simple_demo.pdf")
number_of_pages = original.numPages

for i in range(number_of_pages):
    page = original.getPage(i)
    encrypted_file.addPage(page)

password = "medium"
encrypted_file.encrypt(password)

with open("new_encrypted.pdf","wb")as file:
    encrypted_file.write(file)                                                                    



# 解锁或解密 PDF 文件
import pikepdf
from tqdm import tqdm

passwords = [line.strip() for line in open("passwordlist.txt")]
for password in tqdm(passwords, "Decrypting PDF"):
    try:
        with pikepdf.open("new_encrypted.pdf", password=password) as pdf:
            print(f"Password for the PDF file is {password}")
            break
    except pikepdf._qpdf.PasswordError as e:
        continue



# 用Python创建PDF文件
from reportlab.pdfgen import canvas
report = canvas.Canvas("file1.pdf")
report.drawString(50, 800, "This is an example for Medium")
report.save()



# 合并多个PDF文件
from PyPDF2 import PdfFileReader, PdfFileMerger

first_file = PdfFileReader("file1.pdf")
second_file = PdfFileReader("file2.pdf")

output = PdfFileMerger()

output.append(first_file)
output.append(second_file)
output.write("new_merged.pdf")



# 给PDF文件添加水印
from PyPDF2 import PdfFileReader,PdfFileWriter

original_file = "file1.pdf"
watermarked_pdf = "PDF_watermarked.pdf"
output_file = "output.pdf"

input_file = open(original_file, 'rb')
input_pdf = PdfFileReader(input_file)
watermark_file = open(watermarked_pdf, 'rb')
watermark_pdf = PdfFileReader(watermark_file)
watermark_page = watermark_pdf.getPage(0)
pdf_page = input_pdf.getPage(0)

pdf_page.mergePage(watermark_page)
output = PdfFileWriter()
output.addPage(pdf_page)
output_file = open(output_file, 'wb')
output.write(output_file)
output_file.close()
watermark_file.close()
input_file.close()


识别pdf


pdfplumber


Camelot

仅适用于基于文本的PDF,不适用于扫描的文档

pip install "camelot-py[cv]"



tika

https://tika.apache.org/

https://github.com/chrismattmann/tika-python

https://stackoverflow.com/questions/17098675/searching-text-in-a-pdf-using-python

https://stackoverflow.com/questions/33073972/how-can-i-use-tika-packagehttps-github-com-chrismattmann-tika-python-in-pyth


https://tika.apache.org/1.25/gettingstarted.html

# 批量处理

E:\>java -jar E:\tika-app-1.25.jar -i D:\DZFP\PDF -o D:\DZFP\Parse -t

首先下载并运行服务

java -jar C:\tika-server-1.25.jar

1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import tika
tika.TikaClientOnly = True
from tika import parser

parsed = parser.from_file(r"E:\新建文件夹\031001700211_53042251.pdf",xmlContent=True)
# print(parsed["metadata"])
print(parsed["content"])

my_dict=parsed["metadata"]

import json
# print(json.dumps(my_dict, ensure_ascii=False, indent=4, sort_keys=True))
# print(dir(my_dict.get("resourceName")))
name = my_dict.get("resourceName")
fp_hm =name.split("'")[1].split('.')[0].split("_")[0]
fp_dm =name.split("'")[1].split('.')[0].split("_")[1]
print(fp_hm,fp_dm)
if fp_dm in parsed["content"] and fp_hm in parsed["content"]:
    print("匹配成功")
else:
    print("匹配不成功")


# 修改服务端口
# java -jar C:\tika-server-1.25.jar --port 1001


import tika
from tika import parser
parsed = parser.from_file(r"C:\Users\DANG\Downloads\031001700211_53042251.pdf",'http://localhost:1001/')
# print(parsed["metadata"])
# print(parsed["content"])
print(type(parsed["content"]))
print(parsed["content"].split()[65:])
print(len(parsed["content"].split()))

# import parser object from tike 
from tika import parser 

# opening pdf file 
parsed_pdf = parser.from_file(r"C:\Users\DANG\Downloads\031001700211_53042251.pdf") 

# saving content of pdf 
# you can also bring text only, by parsed_pdf['text'] 
# parsed_pdf['content'] returns string 
data = parsed_pdf['content'] 

# Printing of content 
print(data) 

# <class 'str'> 
print(type(data))
  
# ['metadata'] attribute returns  
# key-value pairs of meta-data  
print(parsed_pdf['metadata'])  
  
# <class 'dict'> 
print(type(parsed_pdf['metadata']))
# Returns keys applicable for given pdf. 
print(parsed_pdf.keys())





评论

此博客中的热门博文

学习地址

清华大学计算机系课程攻略 https://github.com/PKUanonym/REKCARC-TSC-UHT 浙江大学课程攻略共享计划 https://github.com/QSCTech/zju-icicles https://home.unicode.org/ 世界上的每个人都应该能够在手机和电脑上使用自己的语言。 http://codecanyon.net   初次看到这个网站,小伙伴们表示都惊呆了。原来代码也可以放在网上卖的?!! 很多coder上传了各种代码,每个代码都明码标价。看了下销售排行,有的19刀的卖了3万多份,额di神啊。可以看到代码的演示效果,真的很漂亮。代码以php、wordpress主题、Javascript、css为主,偏前台。 https://www.lintcode.com/ 算法学习网站,上去每天刷两道算法题,走遍天下都不怕。 https://www.codecademy.com/ 包含在线编程练习和课程视频 https://www.reddit.com/ 包含有趣的编程挑战题,即使不会写,也可以查看他人的解决方法。 https://ideone.com/ 在线编译器,可运行,可查看代码示例。 http://it-ebooks.info/ 大型电子图书馆,可即时免费下载书籍。 刷题 https://github.com/jackfrued/Python-100-Days https://github.com/kenwoodjw/python_interview_question 面试问题 https://github.com/kenwoodjw/python_interview_question https://www.journaldev.com/15490/python-interview-questions#python-interpreter HTTP 身份验证 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Authentication RESTful 架构详解 https://www.runoob.com/w3cnote/restful-architecture.html https://www.rosettacode.org/wiki/Rosetta_C...

MechanicalSoup

用于自动与网站交互的 Python 库。 MechanicalSoup 自动存储和发送 cookie,跟踪重定向,并且可以跟踪链接和提交表单。 它不执行 JavaScript。 https://github.com/MechanicalSoup/MechanicalSoup https://mechanicalsoup.readthedocs.io/en/stable/index.html https://realpython.com/python-web-scraping-practical-introduction/ pip show Mechanicalsoup 找到模块的安装位置 https://stackoverflow.com/questions/54352162/download-file-with-mechanicalsoup # Install dependencies # pip install requests # pip install BeautifulSoup4 # pip install MechanicalSoup # Import libraries import mechanicalsoup import urllib.request import requests from bs4 import BeautifulSoup import re # Create a browser object that can collect cookies browser = mechanicalsoup.StatefulBrowser() browser.open("https://www.ons.gov.uk/economy/grossdomesticproductgdp/timeseries/l2kq/qna") browser.download_link(link_text=".xls",file="D:/ONS_Data.xls" )

安装和卸载软件(msi\exe)

如何判断一个软件是64位的还是32位的? 情况1、 未安装--右键安装程序查看属性,兼容性,勾选兼容模式查看最低适配是vista的是64位,反之32位, 不太准确 情况2、 已安装--运行软件,64位操作系统打开任务管理器看进程后缀名,带*32就是32位,反之64位 https://www.joci.net/xxbk/126251/ FileMon 和 Regmon 不再可供下载。从Windows 2000 SP4,Windows XP SP2,Windows Server 2003 SP1和Windows Vista开始的Windows版本上,它们已被 Process Monitor 取代 https://adamtheautomator.com/procmon/ Process Monitor 是Windows的高级监视工具,它显示实时文件系统,注册表和进程/线程活动。 它结合了两个旧的Sysinternals实用程序 Filemon 和  Regmon的功能 ,并添加了广泛的增强功能列表,包括丰富的和非破坏性的过滤,全面的事件属性(例如会话ID和用户名),可靠的过程信息,带有集成符号的完整线程堆栈支持每个操作,同时记录到文件等。 它独特的强大功能将使Process Monitor成为您的系统故障排除和恶意软件搜索工具包中的核心实用程序。 https://wikileaks.org/ciav7p1/cms/page_42991626.html HKLM\Software\Microsoft\Cryptography\MachineGuid Machine GUID/Cryptography GUID---该密钥通常用作机器的唯一标识符。它也已用于将两台计算机链接在一起-在某些情况下,计算机GUID是与设备(MP3播放器等)一起传递的。 Machine GUID不是唯一 https://docs.microsoft.com/zh-cn/windows/win32/properties/props-system-identity-uniqueid?redirectedfrom=MSDN UniqueID才是唯一 注册表 是存储系统和应用程序的设置信息 打开注册表的方式很简单:cmd中输入regedit 卸载路径只有一个 已安装32位的程序,如果是系统是32位...