# xlfill2pdf
> 🚧 警告:这是一个"能用就行"的项目!
>
> 💡 如果发现 bug,那一定是特性!
>
> 🔧 代码写得不够优雅?随时欢迎 PR!
>
> 🎯 目标是:能用 > 好用 > 很好用
一个用于将 Excel 文件转换为 PDF 的工具,支持占位符替换、二维码生成、水印添加等功能。
本项目是自用代码整理后的开源版本,功能可能不够完善,但核心功能已经可以正常使用。
欢迎根据实际需求修改代码,如果对你有帮助,请点个星!
## 特性
- 支持变量替换
- 支持多图片自动布局
- 支持二维码生成(普通二维码和带信息二维码)
- 支持水印添加
- 支持自定义字体
- 支持网络图片和本地图片
- 支持网络 Excel 文件
## 安装
```bash
pip install xlfill2pdf
```
## 基础使用
```python
from xlfill2pdf import FontManager, ExcelProcessor
# 创建字体管理器
font_manager = FontManager()
font_manager.set_font("/path/to/your/font.ttf") # 可选:设置自定义字体
# 创建处理器
processor = ExcelProcessor(
font_manager=font_manager,
watermark_text="机密", # 可选:添加水印
watermark_alpha=0.1, # 水印透明度
watermark_angle=-45, # 水印角度
watermark_color=(0, 0, 0) # 水印颜色 (R,G,B)
)
# 处理数据
data = {
"name": "张三",
"id": "12345"
}
# 转换为 PDF
pdf_data = processor.process_excel_to_pdf("template.xlsx", data)
# 保存 PDF
with open("output.pdf", "wb") as f:
f.write(pdf_data)
```
## Excel 模板格式
在 Excel 模板中使用以下格式的占位符:
- 文本占位符:`{{name}}`
- 二维码占位符:`{{id.二维码}}`
## 自定义处理器
可以注册自定义处理器来处理特殊的占位符:
```python
def handle_image(cell, field_name, data_dict):
img = openpyxl.drawing.image.Image("image.png")
img.width = 100
img.height = 100
cell.value = None
column_letter = openpyxl.utils.get_column_letter(cell.column)
anchor = f"{column_letter}{cell.row}"
img.anchor = anchor
return img, column_letter, cell.row # 返回图片对象、锚点、行号
# return 'xxxx' 则替换为 'xxxx'
# 注册处理器
processor.register_handler(".图片", handle_image)
```
## 水印设置
```python
processor = ExcelProcessor(
font_manager=font_manager,
watermark_text="机密文件", # 水印文字
watermark_alpha=0.1, # 透明度 (0-1)
watermark_angle=-45, # 角度
watermark_color=(216, 0, 54) # RGB颜色
)
```
## 生成增加自定义信息的二维码
QRCodeGenerator 是一个功能强大的二维码生成器类,支持在二维码周围添加自定义文字信息。它提供了灵活的配置选项和多种输出格式。
## 主要功能
- 生成标准二维码
- 支持自定义背景尺寸和颜色
- 支持在二维码周围添加文字说明
- 支持自定义字体和字体样式
- 提供多种输出格式(bytes、文件路径、临时文件)
- 支持上下文管理器(Context Manager)
## 初始化参数
- `font_manager`: FontManager 实例,用于管理字体
- `background_size`: 背景图尺寸,默认 (350, 180)
- `background_color`: 背景颜色,默认白色
- `qr_size`: 二维码尺寸,默认 (100, 100)
- `qr_position`: 二维码在背景中的位置,默认 (20, 40)
- `default_font_size`: 默认字体大小,默认 12
- `default_font_color`: 默认字体颜色,默认黑色
- `output_type`: 输出类型,可选 "path"、"temp"、"bytes"
- `output_path`: 输出文件路径(当 output_type 为 "path" 时必需)
## 核心方法
### create_info_qrcode
创建带有文字信息的二维码。
参数:
- `qr_data`: 二维码数据内容
- `text_info`: 文字信息配置字典
```python
from xlfill2pdf import QRCodeGenerator, FontManager
初始化
font_manager = FontManager()
generator = QRCodeGenerator(
font_manager=font_manager,
background_size=(400, 200),
qr_size=(120, 120)
)
创建带信息的二维码
text_info = {
"title": {
"text": "产品信息",
"position": (150, 40),
"font_size": 32,
"color": "black"
},
"code": {
"text": "产品编号:A12345",
"position": (150, 80),
"font_size": 12
}
}
result = generator.create_info_qrcode(
qr_data="https://example.com",
text_info=text_info
)
'''
1. 使用 "path" 输出类型时必须提供 output_path
2. 使用 "temp" 输出类型时,文件会在对象销毁时自动清理
3. 建议使用上下文管理器来确保临时文件的正确清理
4. 文字信息字典中的 "text" 和 "position" 是必需的键
5. 确保使用的字体文件存在且可访问
'''
```
## example
![alt text](docs/before.png)
![alt text](docs/after.png)
![alt text](docs/info_qrcode.png)
## API 参考
### FontManager
字体管理器,用于管理 PDF 生成时使用的字体。
```python
font_manager = FontManager()
font_manager.set_font("/path/to/font.ttf", "FontName")
```
### ExcelProcessor
Excel 处理器,负责转换和生成 PDF。
### ExcelProcessor 参数说明
- `font_manager`: FontManager 实例,用于管理字体
- `prefix`: 变量前缀,默认 "{{"
- `suffix`: 变量后缀,默认 "}}"
- `qrcode_suffix`: 二维码后缀,默认 ".qrcode"
- `image_suffix`: 图片后缀,默认 ".png"
- `info_qrcode_suffix`: 带信息二维码后缀,默认 ".info_qrcode" (新增)
- `use_default_image_handlers`: 是否使用默认图片处理器,默认 True
- `use_default_qrcode_handlers`: 是否使用默认二维码处理器,默认 True
- `use_default_info_qrcode_handlers`: 是否使用默认带信息二维码处理器,默认 True (新增)
- `watermark_text`: 水印文字,默认 None
- `watermark_alpha`: 水印透明度,默认 0.1
- `watermark_angle`: 水印角度,默认 -45
- `watermark_color`: 水印颜色,默认 (0, 0, 0)
- `qrcode_template`: 二维码信息模板,默认 None (新增)
```python
qrcode_template = {
"title": {
"text": "设备标识牌",
"position": (150, 40),
"font_size": 32, # 字体大小 选填
"color": "black", # 字体颜色 选填
}
}
```
## 注意事项
1. 确保系统中安装了所需的字体, 使用默认的字体可能显示错误(如:你显示为尼等)
2. Excel 模板中的占位符格式必须严格匹配
3. 图片处理需要足够的系统内存
4. 临时文件会自动清理
## License
MIT
```
Raw data
{
"_id": null,
"home_page": "https://github.com/xiwen-haochi/xlfill2pdf",
"name": "xlfill2pdf",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.6",
"maintainer_email": null,
"keywords": "excel, pdf, converter",
"author": "'fkl'",
"author_email": "18654198191@163.com",
"download_url": "https://files.pythonhosted.org/packages/14/7f/b81e009557352ca168444a053d933363d479e3cefba01e493d03f9cd9d13/xlfill2pdf-0.2.1.tar.gz",
"platform": null,
"description": "# xlfill2pdf\n\n> \ud83d\udea7 \u8b66\u544a\uff1a\u8fd9\u662f\u4e00\u4e2a\"\u80fd\u7528\u5c31\u884c\"\u7684\u9879\u76ee\uff01\n> \n> \ud83d\udca1 \u5982\u679c\u53d1\u73b0 bug\uff0c\u90a3\u4e00\u5b9a\u662f\u7279\u6027\uff01\n> \n> \ud83d\udd27 \u4ee3\u7801\u5199\u5f97\u4e0d\u591f\u4f18\u96c5\uff1f\u968f\u65f6\u6b22\u8fce PR\uff01\n> \n> \ud83c\udfaf \u76ee\u6807\u662f\uff1a\u80fd\u7528 > \u597d\u7528 > \u5f88\u597d\u7528\n\n\u4e00\u4e2a\u7528\u4e8e\u5c06 Excel \u6587\u4ef6\u8f6c\u6362\u4e3a PDF \u7684\u5de5\u5177\uff0c\u652f\u6301\u5360\u4f4d\u7b26\u66ff\u6362\u3001\u4e8c\u7ef4\u7801\u751f\u6210\u3001\u6c34\u5370\u6dfb\u52a0\u7b49\u529f\u80fd\u3002\n\u672c\u9879\u76ee\u662f\u81ea\u7528\u4ee3\u7801\u6574\u7406\u540e\u7684\u5f00\u6e90\u7248\u672c\uff0c\u529f\u80fd\u53ef\u80fd\u4e0d\u591f\u5b8c\u5584\uff0c\u4f46\u6838\u5fc3\u529f\u80fd\u5df2\u7ecf\u53ef\u4ee5\u6b63\u5e38\u4f7f\u7528\u3002\n\u6b22\u8fce\u6839\u636e\u5b9e\u9645\u9700\u6c42\u4fee\u6539\u4ee3\u7801\uff0c\u5982\u679c\u5bf9\u4f60\u6709\u5e2e\u52a9\uff0c\u8bf7\u70b9\u4e2a\u661f\uff01\n\n## \u7279\u6027\n\n- \u652f\u6301\u53d8\u91cf\u66ff\u6362\n- \u652f\u6301\u591a\u56fe\u7247\u81ea\u52a8\u5e03\u5c40\n- \u652f\u6301\u4e8c\u7ef4\u7801\u751f\u6210\uff08\u666e\u901a\u4e8c\u7ef4\u7801\u548c\u5e26\u4fe1\u606f\u4e8c\u7ef4\u7801\uff09\n- \u652f\u6301\u6c34\u5370\u6dfb\u52a0\n- \u652f\u6301\u81ea\u5b9a\u4e49\u5b57\u4f53\n- \u652f\u6301\u7f51\u7edc\u56fe\u7247\u548c\u672c\u5730\u56fe\u7247\n- \u652f\u6301\u7f51\u7edc Excel \u6587\u4ef6\n\n## \u5b89\u88c5\n\n```bash\npip install xlfill2pdf\n```\n\n## \u57fa\u7840\u4f7f\u7528\n\n```python\nfrom xlfill2pdf import FontManager, ExcelProcessor\n\n# \u521b\u5efa\u5b57\u4f53\u7ba1\u7406\u5668\nfont_manager = FontManager()\nfont_manager.set_font(\"/path/to/your/font.ttf\") # \u53ef\u9009\uff1a\u8bbe\u7f6e\u81ea\u5b9a\u4e49\u5b57\u4f53\n\n# \u521b\u5efa\u5904\u7406\u5668\nprocessor = ExcelProcessor(\n font_manager=font_manager,\n watermark_text=\"\u673a\u5bc6\", # \u53ef\u9009\uff1a\u6dfb\u52a0\u6c34\u5370\n watermark_alpha=0.1, # \u6c34\u5370\u900f\u660e\u5ea6\n watermark_angle=-45, # \u6c34\u5370\u89d2\u5ea6\n watermark_color=(0, 0, 0) # \u6c34\u5370\u989c\u8272 (R,G,B)\n)\n\n# \u5904\u7406\u6570\u636e\ndata = {\n \"name\": \"\u5f20\u4e09\",\n \"id\": \"12345\"\n}\n\n# \u8f6c\u6362\u4e3a PDF\npdf_data = processor.process_excel_to_pdf(\"template.xlsx\", data)\n\n# \u4fdd\u5b58 PDF\nwith open(\"output.pdf\", \"wb\") as f:\n f.write(pdf_data)\n```\n\n## Excel \u6a21\u677f\u683c\u5f0f\n\n\u5728 Excel \u6a21\u677f\u4e2d\u4f7f\u7528\u4ee5\u4e0b\u683c\u5f0f\u7684\u5360\u4f4d\u7b26\uff1a\n\n- \u6587\u672c\u5360\u4f4d\u7b26\uff1a`{{name}}`\n- \u4e8c\u7ef4\u7801\u5360\u4f4d\u7b26\uff1a`{{id.\u4e8c\u7ef4\u7801}}`\n\n## \u81ea\u5b9a\u4e49\u5904\u7406\u5668\n\n\u53ef\u4ee5\u6ce8\u518c\u81ea\u5b9a\u4e49\u5904\u7406\u5668\u6765\u5904\u7406\u7279\u6b8a\u7684\u5360\u4f4d\u7b26\uff1a\n\n```python\ndef handle_image(cell, field_name, data_dict):\n img = openpyxl.drawing.image.Image(\"image.png\")\n img.width = 100\n img.height = 100\n cell.value = None\n column_letter = openpyxl.utils.get_column_letter(cell.column)\n anchor = f\"{column_letter}{cell.row}\"\n img.anchor = anchor\n return img, column_letter, cell.row # \u8fd4\u56de\u56fe\u7247\u5bf9\u8c61\u3001\u951a\u70b9\u3001\u884c\u53f7\n # return 'xxxx' \u5219\u66ff\u6362\u4e3a 'xxxx'\n\n# \u6ce8\u518c\u5904\u7406\u5668\nprocessor.register_handler(\".\u56fe\u7247\", handle_image)\n```\n\n## \u6c34\u5370\u8bbe\u7f6e\n\n```python\nprocessor = ExcelProcessor(\n font_manager=font_manager,\n watermark_text=\"\u673a\u5bc6\u6587\u4ef6\", # \u6c34\u5370\u6587\u5b57\n watermark_alpha=0.1, # \u900f\u660e\u5ea6 (0-1)\n watermark_angle=-45, # \u89d2\u5ea6\n watermark_color=(216, 0, 54) # RGB\u989c\u8272\n)\n```\n\n## \u751f\u6210\u589e\u52a0\u81ea\u5b9a\u4e49\u4fe1\u606f\u7684\u4e8c\u7ef4\u7801\nQRCodeGenerator \u662f\u4e00\u4e2a\u529f\u80fd\u5f3a\u5927\u7684\u4e8c\u7ef4\u7801\u751f\u6210\u5668\u7c7b\uff0c\u652f\u6301\u5728\u4e8c\u7ef4\u7801\u5468\u56f4\u6dfb\u52a0\u81ea\u5b9a\u4e49\u6587\u5b57\u4fe1\u606f\u3002\u5b83\u63d0\u4f9b\u4e86\u7075\u6d3b\u7684\u914d\u7f6e\u9009\u9879\u548c\u591a\u79cd\u8f93\u51fa\u683c\u5f0f\u3002\n\n## \u4e3b\u8981\u529f\u80fd\n\n- \u751f\u6210\u6807\u51c6\u4e8c\u7ef4\u7801\n- \u652f\u6301\u81ea\u5b9a\u4e49\u80cc\u666f\u5c3a\u5bf8\u548c\u989c\u8272\n- \u652f\u6301\u5728\u4e8c\u7ef4\u7801\u5468\u56f4\u6dfb\u52a0\u6587\u5b57\u8bf4\u660e\n- \u652f\u6301\u81ea\u5b9a\u4e49\u5b57\u4f53\u548c\u5b57\u4f53\u6837\u5f0f\n- \u63d0\u4f9b\u591a\u79cd\u8f93\u51fa\u683c\u5f0f\uff08bytes\u3001\u6587\u4ef6\u8def\u5f84\u3001\u4e34\u65f6\u6587\u4ef6\uff09\n- \u652f\u6301\u4e0a\u4e0b\u6587\u7ba1\u7406\u5668\uff08Context Manager\uff09\n\n## \u521d\u59cb\u5316\u53c2\u6570\n\n- `font_manager`: FontManager \u5b9e\u4f8b\uff0c\u7528\u4e8e\u7ba1\u7406\u5b57\u4f53\n- `background_size`: \u80cc\u666f\u56fe\u5c3a\u5bf8\uff0c\u9ed8\u8ba4 (350, 180)\n- `background_color`: \u80cc\u666f\u989c\u8272\uff0c\u9ed8\u8ba4\u767d\u8272\n- `qr_size`: \u4e8c\u7ef4\u7801\u5c3a\u5bf8\uff0c\u9ed8\u8ba4 (100, 100)\n- `qr_position`: \u4e8c\u7ef4\u7801\u5728\u80cc\u666f\u4e2d\u7684\u4f4d\u7f6e\uff0c\u9ed8\u8ba4 (20, 40)\n- `default_font_size`: \u9ed8\u8ba4\u5b57\u4f53\u5927\u5c0f\uff0c\u9ed8\u8ba4 12\n- `default_font_color`: \u9ed8\u8ba4\u5b57\u4f53\u989c\u8272\uff0c\u9ed8\u8ba4\u9ed1\u8272\n- `output_type`: \u8f93\u51fa\u7c7b\u578b\uff0c\u53ef\u9009 \"path\"\u3001\"temp\"\u3001\"bytes\"\n- `output_path`: \u8f93\u51fa\u6587\u4ef6\u8def\u5f84\uff08\u5f53 output_type \u4e3a \"path\" \u65f6\u5fc5\u9700\uff09\n\n## \u6838\u5fc3\u65b9\u6cd5\n\n### create_info_qrcode\n\n\u521b\u5efa\u5e26\u6709\u6587\u5b57\u4fe1\u606f\u7684\u4e8c\u7ef4\u7801\u3002\n\n\u53c2\u6570\uff1a\n- `qr_data`: \u4e8c\u7ef4\u7801\u6570\u636e\u5185\u5bb9\n- `text_info`: \u6587\u5b57\u4fe1\u606f\u914d\u7f6e\u5b57\u5178\n\n```python\nfrom xlfill2pdf import QRCodeGenerator, FontManager\n\u521d\u59cb\u5316\nfont_manager = FontManager()\ngenerator = QRCodeGenerator(\nfont_manager=font_manager,\nbackground_size=(400, 200),\nqr_size=(120, 120)\n)\n\u521b\u5efa\u5e26\u4fe1\u606f\u7684\u4e8c\u7ef4\u7801\ntext_info = {\n\"title\": {\n\"text\": \"\u4ea7\u54c1\u4fe1\u606f\",\n\"position\": (150, 40),\n\"font_size\": 32,\n\"color\": \"black\"\n},\n\"code\": {\n\"text\": \"\u4ea7\u54c1\u7f16\u53f7\uff1aA12345\",\n\"position\": (150, 80),\n\"font_size\": 12\n}\n}\nresult = generator.create_info_qrcode(\nqr_data=\"https://example.com\",\ntext_info=text_info\n)\n\n'''\n1. \u4f7f\u7528 \"path\" \u8f93\u51fa\u7c7b\u578b\u65f6\u5fc5\u987b\u63d0\u4f9b output_path\n2. \u4f7f\u7528 \"temp\" \u8f93\u51fa\u7c7b\u578b\u65f6\uff0c\u6587\u4ef6\u4f1a\u5728\u5bf9\u8c61\u9500\u6bc1\u65f6\u81ea\u52a8\u6e05\u7406\n3. \u5efa\u8bae\u4f7f\u7528\u4e0a\u4e0b\u6587\u7ba1\u7406\u5668\u6765\u786e\u4fdd\u4e34\u65f6\u6587\u4ef6\u7684\u6b63\u786e\u6e05\u7406\n4. \u6587\u5b57\u4fe1\u606f\u5b57\u5178\u4e2d\u7684 \"text\" \u548c \"position\" \u662f\u5fc5\u9700\u7684\u952e\n5. \u786e\u4fdd\u4f7f\u7528\u7684\u5b57\u4f53\u6587\u4ef6\u5b58\u5728\u4e14\u53ef\u8bbf\u95ee\n'''\n\n\n\n```\n\n## example\n![alt text](docs/before.png)\n![alt text](docs/after.png)\n![alt text](docs/info_qrcode.png)\n\n\n## API \u53c2\u8003\n\n### FontManager\n\n\u5b57\u4f53\u7ba1\u7406\u5668\uff0c\u7528\u4e8e\u7ba1\u7406 PDF \u751f\u6210\u65f6\u4f7f\u7528\u7684\u5b57\u4f53\u3002\n\n```python\nfont_manager = FontManager()\nfont_manager.set_font(\"/path/to/font.ttf\", \"FontName\")\n```\n\n### ExcelProcessor\n\nExcel \u5904\u7406\u5668\uff0c\u8d1f\u8d23\u8f6c\u6362\u548c\u751f\u6210 PDF\u3002\n\n\n### ExcelProcessor \u53c2\u6570\u8bf4\u660e\n\n- `font_manager`: FontManager \u5b9e\u4f8b\uff0c\u7528\u4e8e\u7ba1\u7406\u5b57\u4f53\n- `prefix`: \u53d8\u91cf\u524d\u7f00\uff0c\u9ed8\u8ba4 \"{{\"\n- `suffix`: \u53d8\u91cf\u540e\u7f00\uff0c\u9ed8\u8ba4 \"}}\"\n- `qrcode_suffix`: \u4e8c\u7ef4\u7801\u540e\u7f00\uff0c\u9ed8\u8ba4 \".qrcode\"\n- `image_suffix`: \u56fe\u7247\u540e\u7f00\uff0c\u9ed8\u8ba4 \".png\"\n- `info_qrcode_suffix`: \u5e26\u4fe1\u606f\u4e8c\u7ef4\u7801\u540e\u7f00\uff0c\u9ed8\u8ba4 \".info_qrcode\" (\u65b0\u589e)\n- `use_default_image_handlers`: \u662f\u5426\u4f7f\u7528\u9ed8\u8ba4\u56fe\u7247\u5904\u7406\u5668\uff0c\u9ed8\u8ba4 True\n- `use_default_qrcode_handlers`: \u662f\u5426\u4f7f\u7528\u9ed8\u8ba4\u4e8c\u7ef4\u7801\u5904\u7406\u5668\uff0c\u9ed8\u8ba4 True\n- `use_default_info_qrcode_handlers`: \u662f\u5426\u4f7f\u7528\u9ed8\u8ba4\u5e26\u4fe1\u606f\u4e8c\u7ef4\u7801\u5904\u7406\u5668\uff0c\u9ed8\u8ba4 True (\u65b0\u589e)\n- `watermark_text`: \u6c34\u5370\u6587\u5b57\uff0c\u9ed8\u8ba4 None\n- `watermark_alpha`: \u6c34\u5370\u900f\u660e\u5ea6\uff0c\u9ed8\u8ba4 0.1\n- `watermark_angle`: \u6c34\u5370\u89d2\u5ea6\uff0c\u9ed8\u8ba4 -45\n- `watermark_color`: \u6c34\u5370\u989c\u8272\uff0c\u9ed8\u8ba4 (0, 0, 0)\n- `qrcode_template`: \u4e8c\u7ef4\u7801\u4fe1\u606f\u6a21\u677f\uff0c\u9ed8\u8ba4 None (\u65b0\u589e)\n```python\nqrcode_template = {\n \"title\": {\n \"text\": \"\u8bbe\u5907\u6807\u8bc6\u724c\",\n \"position\": (150, 40),\n \"font_size\": 32, # \u5b57\u4f53\u5927\u5c0f \u9009\u586b\n \"color\": \"black\", # \u5b57\u4f53\u989c\u8272 \u9009\u586b\n }\n}\n```\n\n## \u6ce8\u610f\u4e8b\u9879\n\n1. \u786e\u4fdd\u7cfb\u7edf\u4e2d\u5b89\u88c5\u4e86\u6240\u9700\u7684\u5b57\u4f53, \u4f7f\u7528\u9ed8\u8ba4\u7684\u5b57\u4f53\u53ef\u80fd\u663e\u793a\u9519\u8bef\uff08\u5982\uff1a\u4f60\u663e\u793a\u4e3a\u5c3c\u7b49\uff09\n2. Excel \u6a21\u677f\u4e2d\u7684\u5360\u4f4d\u7b26\u683c\u5f0f\u5fc5\u987b\u4e25\u683c\u5339\u914d\n3. \u56fe\u7247\u5904\u7406\u9700\u8981\u8db3\u591f\u7684\u7cfb\u7edf\u5185\u5b58\n4. \u4e34\u65f6\u6587\u4ef6\u4f1a\u81ea\u52a8\u6e05\u7406\n\n## License\n\nMIT\n```\n\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Excel to PDF converter with font support",
"version": "0.2.1",
"project_urls": {
"Homepage": "https://github.com/xiwen-haochi/xlfill2pdf",
"Repository": "https://github.com/xiwen-haochi/xlfill2pdf"
},
"split_keywords": [
"excel",
" pdf",
" converter"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "f8dc7015a7083261e42e0f59e26e8b00107a916b1d793b67d2035e0cae6876db",
"md5": "cc972826385eaced68078e56208989eb",
"sha256": "82f9a4ebf436950335e83f348a3f8585865b3bab8afeb0cef73c36db3ee7e642"
},
"downloads": -1,
"filename": "xlfill2pdf-0.2.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "cc972826385eaced68078e56208989eb",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.6",
"size": 1155370,
"upload_time": "2024-11-14T06:31:03",
"upload_time_iso_8601": "2024-11-14T06:31:03.435219Z",
"url": "https://files.pythonhosted.org/packages/f8/dc/7015a7083261e42e0f59e26e8b00107a916b1d793b67d2035e0cae6876db/xlfill2pdf-0.2.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "147fb81e009557352ca168444a053d933363d479e3cefba01e493d03f9cd9d13",
"md5": "2fa7939559f1d8418f29a91c0a0b6727",
"sha256": "e2ee5eff768d63613557ed49132a7f0b5da49d6af5dca48e61f37c844c804e21"
},
"downloads": -1,
"filename": "xlfill2pdf-0.2.1.tar.gz",
"has_sig": false,
"md5_digest": "2fa7939559f1d8418f29a91c0a0b6727",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6",
"size": 1154910,
"upload_time": "2024-11-14T06:31:05",
"upload_time_iso_8601": "2024-11-14T06:31:05.826474Z",
"url": "https://files.pythonhosted.org/packages/14/7f/b81e009557352ca168444a053d933363d479e3cefba01e493d03f9cd9d13/xlfill2pdf-0.2.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-11-14 06:31:05",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "xiwen-haochi",
"github_project": "xlfill2pdf",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "xlfill2pdf"
}