跳至主要内容

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://pyperclip.readthedocs.io/en/latest/ import pyperclip while True :     # pyperclip.copy('Hello, world!')     # pyperclip.paste()     # pyperclip.waitForPaste()     print ( pyperclip. waitForNewPaste ( ) )     # 获取要输入新的坐标,也可以通过autohotkey import time import pyautogui  as pag import os   try :     while True :         print ( "Press Ctrl-C to end" )         x , y = pag. position ( )   # 返回鼠标的坐标         posStr = "Position:" + str ( x ) . rjust ( 4 ) + ',' + str ( y ) . rjust ( 4 )         print ( posStr )   # 打印坐标         time . sleep ( 0.2 )         os . system ( 'cls' )   # 清楚屏幕 except KeyboardInterrupt :     print ( 'end....' )     # 打印消息 import pyautogui import time import pyperclip   content = """   呼叫龙叔! 第二遍! 第三遍! 第四遍...

学习地址

清华大学计算机系课程攻略 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...

mysql 入门

资料 https://dinfratechsource.com/2018/11/10/how-to-install-latest-mysql-5-7-21-on-rhel-centos-7/ https://dev.mysql.com/doc/refman/5.7/en/linux-installation-yum-repo.html https://www.runoob.com/mysql/mysql-create-database.html https://www.liquidweb.com/kb/install-java-8-on-centos-7/ 工具 https://www.heidisql.com/ HeidiSQL是免费软件,其目标是易于学习。 “ Heidi”使您可以从运行数据库系统MariaDB,MySQL,Microsoft SQL或PostgreSQL的计算机上查看和编辑数据和结构 MySQL 连接时尽量使用 127.0.0.1 而不是 localhost localhost 使用的 Linux socket,127.0.0.1 使用的是 tcp/ip 为什么我使用 localhost 一直没出问题 因为你的本机中只有一个 mysql 进程, 如果你有一个 node1 运行在 3306, 有一个 node2 运行在 3307 mysql -u root -h localhost -P 3306 mysql -u root -h localhost -P 3307 都会连接到同一个 mysql 进程, 因为 localhost 使用 Linux socket, 所以 -P 字段直接被忽略了, 等价于 mysql -u root -h localhost mysql -u root -h localhost 而 -h 默认是 localhost, 又等价于 mysql -u root mysql -u root 为了避免这种情况(比如你在本地开发只有一个 mysql 进程,线上或者 qa 环境有多个 mysql 进程)最好的方式就是使用 IP mysql -u root -h 127 .0 .0 .1 -P 3307 strac...