How to Convert HTML to a PDF in Python

1.django自带方法:http://docs.djangoproject.com/en/dev/howto/outputting-pdf/

需要安装包ReportLab,只需简单的几行,但没发现中文解决方法

2.包PDFlib http://www.pdflib.org/

3.HTMLdoc http://www.htmldoc.org/ 这是个命令行脚本。

4.pisa http://pypi.python.org/pypi/pisa/3.0.10,可解决中文pdf转发问题

sudo easy_install pisa

需要的安装包:

ReportLab http://pypi.python.org/pypi/reportlab

Html5lib http://code.google.com/p/html5lib/

pisa http://pypi.python.org/pypi/pisa/3.0.10



def write_pdf(template_src, ctx):
#########Set FONT (微软雅黑)#################
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
#path_to_your_font = '/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc'
path_to_your_font = 'baojia/wqy-zenhei.ttc'
pdfmetrics.registerFont(TTFont('msyh', path_to_your_font))
from sx.pisa3 import pisa_default
pisa_default.DEFAULT_FONT["helvetica"]="msyh"

import cStringIO
import ho.pisa as pisa
template = get_template(template_src)
html = template.render(ctx)
result = cStringIO.StringIO()

#如果需要访问远程资源需要将远程资源读到本地,作为临时文件保存
#读取方法:pisa.pisaLinkLoader(url).getFileName
url = ''

pdf = pisa.pisaDocument(cStringIO.StringIO(
html.encode("UTF-8")), result,link_callback = pisa.pisaLinkLoader(url).getFileName)

#生成PDF
if not pdf.err:
response = HttpResponse(result.getvalue(), mimetype='application/pdf')
now = datetime.datetime.now()
response['Content-Disposition'] = 'attachment; filename=baojia%s.pdf' % now.strftime('%Y%m%d%H%M%S')
return response
else:
return HttpResponse('error')


2-8行是为了解决中文字体问题

Freebsd 安装文泉驿字体

%cd /usr/ports/x11-fonts/wqy
make install clean


中文解决参考文档:

http://edisonlz.javaeye.com/blog/635745

http://wiki.woodpecker.org.cn/moin/MiscItems/2008-08-08

另附 很简单的html生成pdf的unix命令wkhtmltopdf

官方网址: https://code.google.com/p/wkhtmltopdf/

http://www.lovelucy.info/wkhtmltopdf-and-pdf2htmlex.html

在Ubuntu及ArchLinux上直接下指令安裝即可:

apt-get install wkhtmltopdf

使用方法:

wkhtmltopdf --help

使用方法很简单:在shell中直接wkhtmltopdf 源文件 目标文件 就可以了
<think>我们被要求使用Python脚本批量提取PDF中的表格并转换为Excel文件。根据引用资料,我们可以使用多个库来实现,如tabula-py、camelot-py、pdfplumber等。这里我们选择使用pdfplumber,因为它是一个纯Python库,无需Java环境,且对中文支持较好。同时,我们还会使用pandas来处理数据并导出为Excel。 步骤: 1. 安装必要的库:pdfplumber, pandas, openpyxl(用于支持xlsx格式) 2. 编写脚本:遍历指定目录下的所有PDF文件,提取每个PDF文件中的所有表格,并将每个表格保存为单独的Excel文件(或者将同一个PDF的所有表格合并到一个Excel文件的不同sheet中)。 注意:由于PDF中的表格可能跨页,我们需要考虑如何处理。这里我们假设每个页面独立处理,即每个页面上的表格分别提取。如果表格跨页,可能需要额外的处理,这比较复杂,我们这里先按每页提取。 方案: 我们将为每个PDF文件创建一个Excel文件,其中每个表格放在单独的工作表(sheet)中,并以页码命名工作表(例如“第1页”,“第2页”等)。如果一个PDF有多页,每页可能有多个表格?但pdfplumber是按页提取表格,每页返回一个表格列表(可能包含多个表格)。因此,我们还需要考虑一页有多个表格的情况。 具体步骤: 1. 遍历指定文件夹中的所有PDF文件。 2. 对于每个PDF文件,使用pdfplumber打开。 3. 遍历PDF的每一页。 4. 对于每一页,使用`extract_tables()`方法提取表格(返回一个列表,每个元素代表一个表格,表格本身是二维列表)。 5. 将提取的每个表格转换为pandas DataFrame。 6. 将同一页的多个表格分别保存到同一个Excel文件的不同工作表中(为了避免工作表名称重复,我们可以在工作表名称中加入表格序号,例如“第1页-表1”,“第1页-表2”)。 7. 保存Excel文件,文件名与PDF文件同名,扩展名改为.xlsx。 但是,注意:pdfplumber在提取表格时,可能会将一页中的多个表格合并到一个列表中(即一个表格在列表中是一个元素)。所以,我们只需要遍历每一页的表格列表即可。 代码结构: 我们将编写一个函数来处理单个PDF文件,然后循环调用该函数。 注意:处理过程中可能会遇到没有表格的页面,我们需要跳过。 安装命令(在命令行中执行): ``` pip install pdfplumber pandas openpyxl ``` 下面是一个示例脚本:</think>我将为您提供完整的Python脚本解决方案,用于批量提取PDF中的表格数据并转换为Excel文件。这个方案基于pdfplumber库,它能够高效处理PDF表格提取任务。 ### Python脚本实现方案 ```python import os import pdfplumber import pandas as pd from datetime import datetime def extract_tables_from_pdf(pdf_path): """ 从单个PDF文件中提取所有表格数据 :param pdf_path: PDF文件路径 :return: 包含所有表格数据的字典{sheet_name: DataFrame} """ tables_dict = {} with pdfplumber.open(pdf_path) as pdf: for i, page in enumerate(pdf.pages): # 提取当前页面的表格 page_tables = page.extract_tables() if not page_tables: continue for j, table in enumerate(page_tables): # 创建DataFrame并清理空行 df = pd.DataFrame(table[1:], columns=table[0]) df = df.dropna(how='all').reset_index(drop=True) # 生成工作表名称 sheet_name = f"Page_{i+1}_Table_{j+1}" tables_dict[sheet_name] = df return tables_dict def batch_convert_pdf_to_excel(input_folder, output_folder): """ 批量处理PDF文件夹中的文件 :param input_folder: 输入PDF文件夹路径 :param output_folder: 输出Excel文件夹路径 """ if not os.path.exists(output_folder): os.makedirs(output_folder) processed_count = 0 error_files = [] for filename in os.listdir(input_folder): if filename.lower().endswith('.pdf'): pdf_path = os.path.join(input_folder, filename) excel_name = f"{os.path.splitext(filename)[0]}_{datetime.now().strftime('%Y%m%d')}.xlsx" excel_path = os.path.join(output_folder, excel_name) try: # 提取表格数据 tables_data = extract_tables_from_pdf(pdf_path) if tables_data: # 保存到Excel with pd.ExcelWriter(excel_path) as writer: for sheet_name, df in tables_data.items(): df.to_excel(writer, sheet_name=sheet_name, index=False) processed_count += 1 print(f"✅ 成功处理: {filename} -> {excel_name}") else: print(f"⚠️ 未找到表格: {filename}") except Exception as e: error_files.append(filename) print(f"❌ 处理失败: {filename} - {str(e)}") print(f"\n处理完成: {processed_count}个文件成功转换") if error_files: print(f"失败文件: {', '.join(error_files)}") # 使用示例 if __name__ == "__main__": input_dir = "path/to/your/pdf_folder" # 替换为您的PDF文件夹路径 output_dir = "path/to/output/excel_folder" # 替换为输出文件夹路径 batch_convert_pdf_to_excel(input_dir, output_dir) ``` ### 使用说明 1. **安装依赖库**: ```bash pip install pdfplumber pandas openpyxl ``` 2. **脚本功能**: - 自动遍历指定文件夹中的所有PDF文件 - 提取每页中的多个表格 - 清理空行和无效数据 - 为每个表格创建独立的工作表 - 文件名自动添加日期戳防止覆盖 - 错误处理和日志输出 3. **执行步骤**: - 修改脚本末尾的`input_dir`和`output_dir`路径 - 运行脚本:`python pdf_to_excel.py` - 查看控制台输出的处理结果 ### 注意事项 1. **复杂表格处理**: - 对于跨页表格,可能需要手动合并 - 包含图片的单元格可能无法正确提取 - 建议测试样本文件确认提取效果 2. **性能优化**: - 大文件处理时可添加`pages`参数限制处理页数 - 使用`table_settings`参数调整表格识别精度[^4] ```python # 示例:调整表格提取参数 table = page.extract_table(table_settings={ "vertical_strategy": "lines", "horizontal_strategy": "lines" }) ``` 3. **中文支持**: - 确保PDF使用标准中文字体 - 如遇乱码问题,可尝试: ```python with pdfplumber.open(pdf_path, laparams={"detect_vertical": False}) as pdf: # 处理文件 ``` ### 示例输出结构 ``` 输出文件夹/ ├── 发票_20240515.xlsx │ ├── Page_1_Table_1 (工作表) │ └── Page_2_Table_1 (工作表) ├── 报告_20240515.xlsx │ ├── Page_1_Table_1 │ └── Page_3_Table_1 └── ... ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值