最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實(shí)現(xiàn)將Markdown一鍵打印為A4專業(yè)文檔

 更新時(shí)間:2026年01月13日 08:47:54   作者:weixin_46244623  
這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)將Markdown一鍵打印為A4專業(yè)文檔,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下

摘要

只需一個(gè) Python 腳本,3 秒完成:從任意 md.md 文件一鍵生成 A4 打印完美適配的 PDF,支持中文、表格、代碼塊防截?cái)?,自動添?帶分隔線的頁眉頁腳 + 動態(tài)頁碼,無需手動調(diào)格式、寫 HTML、調(diào) CSS。 適合技術(shù)文檔、教程、報(bào)告、培訓(xùn)資料,直接打印分發(fā),專業(yè)感拉滿! 零依賴配置,運(yùn)行即得,告別 Word 排版痛苦,解放生產(chǎn)力!

一、功能概覽

本腳本實(shí)現(xiàn) 從 Markdown 文件一鍵生成專業(yè)級 A4 打印友好 PDF,具備以下完整功能:

功能實(shí)現(xiàn)方式
中文支持使用 Microsoft YaHei + SimSun 字體
表格美觀邊框、表頭灰底、自動分頁
代碼塊防截?cái)?/td>page-break-inside: avoid
頁眉(帶下劃線)自定義 header.html
頁腳(帶上劃線 + 動態(tài)頁碼)自定義 footer.html + JavaScript
自動生成臨時(shí)文件tempfile.mkdtemp()
一鍵運(yùn)行無需手動創(chuàng)建 HTML 文件

二、使用方法(3步搞定)

1. 準(zhǔn)備文件結(jié)構(gòu)

項(xiàng)目文件夾/ 

├── md.md ← 你的 Markdown 文檔
├── md_to_a4_pdf.py ← 本腳本

2. 安裝依賴

pip install markdown pdfkit

3. 安裝 wkhtmltopdf

安裝后 修改腳本第 15 行路徑

wkhtmltopdf_path = r"C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe"

4. 運(yùn)行腳本

python md_to_a4_pdf.py

三、運(yùn)行效果

四、源代碼

# -*- coding: utf-8 -*-
"""
A4 打印友好版 PDF 一鍵生成腳本(完整版)
功能:
1. 從 md.md 自動生成 PDF
2. 支持中文字體、表格、代碼塊
3. 帶頁眉(標(biāo)題 + 下劃線)、頁腳(頁碼 + 上劃線)
4. 自動適應(yīng) A4 頁面,不裁切尾部
5. 自動生成 header.html 和 footer.html
"""

import os
import markdown
import pdfkit
import tempfile

# -------------------------------
# 配置參數(shù)(請修改這里)
# -------------------------------
source_md_file = "md.md"                    # 源 Markdown 文件
output_pdf_file = "output_a4.pdf"           # 輸出 PDF 文件名
wkhtmltopdf_path = r"C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe"  # 修改為你的路徑

# 頁眉頁腳內(nèi)容
header_title = "Hive的安裝和配置"           # 頁眉標(biāo)題
footer_text = "第 [page] 頁 / 共 [topage] 頁"  # 頁腳頁碼(wkhtmltopdf 自動替換)

# -------------------------------
# 檢查 wkhtmltopdf
# -------------------------------
if not os.path.exists(wkhtmltopdf_path):
    print(f"錯(cuò)誤:未找到 wkhtmltopdf 可執(zhí)行文件!")
    print(f"請確認(rèn)路徑正確:{wkhtmltopdf_path}")
    print("下載地址:https://wkhtmltopdf.org/downloads.html")
    exit(1)

# -------------------------------
# 檢查 Markdown 文件
# -------------------------------
if not os.path.exists(source_md_file):
    print(f"錯(cuò)誤:找不到源 Markdown 文件:{source_md_file}")
    print("請確保 md.md 與腳本在同一目錄")
    exit(1)

# -------------------------------
# 讀取 Markdown 并轉(zhuǎn) HTML
# -------------------------------
print("正在讀取 Markdown 文件...")
with open(source_md_file, "r", encoding="utf-8") as f:
    md_text = f.read()

html_content = markdown.markdown(
    md_text,
    extensions=["tables", "fenced_code", "nl2br", "toc"]
)

# -------------------------------
# 臨時(shí)目錄:自動生成 header.html 和 footer.html
# -------------------------------
temp_dir = tempfile.mkdtemp(prefix="pdf_gen_")
header_path = os.path.join(temp_dir, "header.html")
footer_path = os.path.join(temp_dir, "footer.html")

# 生成 header.html(帶下劃線)
header_html = f"""<!DOCTYPE html>
<html><head><meta charset="utf-8"><style>
    body {{ margin:0; padding:0; font-family:"Microsoft YaHei","SimSun",sans-serif; font-size:10pt; }}
    .c {{ text-align:center; padding:5px 0; }}
    .line {{ border-bottom:1px solid #999; margin-top:4px; }}
</style></head><body>
<div class="c">{header_title}</div>
<div class="line"></div>
</body></html>"""

# 生成 footer.html(帶上劃線)
# 生成 footer.html(帶 JS 動態(tài)頁碼)
footer_html = """<!DOCTYPE html>
<html><head><meta charset="utf-8"><style>
    body {margin:0;padding:0;font-family:"Microsoft YaHei","SimSun",sans-serif;font-size:10pt;text-align:center;}
    .line {border-top:1px solid #999;margin:4px 0;}
</style>
<script>
    function subst() { 
        var vars = {}; 
        location.search.substring(1).split("&").forEach(function(p){
            var pair = p.split("="); vars[pair[0]] = decodeURIComponent(pair[1]);
        }); 
        return vars; 
    }
    document.addEventListener('DOMContentLoaded', function(){
        var v = subst(); 
        var el = document.getElementById('pageInfo');
        if(el) el.innerHTML = '第 ' + v.page + ' 頁 / 共 ' + v.topage + ' 頁';
    });
</script>
</head><body>
<div class="line"></div>
<div id="pageInfo" style="padding:5px 0;"></div>
</body></html>"""

with open(header_path, "w", encoding="utf-8") as f:
    f.write(header_html)
with open(footer_path, "w", encoding="utf-8") as f:
    f.write(footer_html)

print(f"臨時(shí)頁眉頁腳已生成:{temp_dir}")

# -------------------------------
# 完整 HTML 頁面
# -------------------------------
full_html = f"""<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>{header_title}</title>
<style>
@page {{
    size: A4;
    margin: 27mm 18mm 27mm 18mm; /* 上右下左,為頁眉頁腳留空間 */
}}
body {{
    font-family: "Microsoft YaHei", "SimSun", "Arial", sans-serif;
    line-height: 1.7;
    margin: 0;
    color: #333;
}}
h1, h2, h3, h4 {{ color: #2c3e50; margin-top: 1.2em; page-break-after: avoid; }}
table {{ border-collapse: collapse; width: 100%; margin: 10px 0; page-break-inside: auto; }}
th, td {{ border: 1px solid #999; padding: 8px; text-align: left; }}
th {{ background-color: #f5f5f5; font-weight: bold; }}
pre, code {{
    background: #f8f8f8;
    border-radius: 4px;
    page-break-inside: avoid;
    font-family: Consolas, "Courier New", monospace;
}}
pre {{ padding: 12px; overflow: auto; }}
code {{ padding: 2px 6px; font-size: 90%; }}
p, ul, ol, blockquote {{ page-break-inside: avoid; }}
</style>
</head>
<body>
{html_content}
</body>
</html>"""

# -------------------------------
# PDF 配置
# -------------------------------
print("正在配置 PDF 生成參數(shù)...")
config = pdfkit.configuration(wkhtmltopdf=wkhtmltopdf_path)

options = {
    'page-size': 'A4',
    'margin-top': '27mm',
    'margin-bottom': '27mm',
    'margin-left': '18mm',
    'margin-right': '18mm',
    'zoom': '0.95',
    'encoding': 'UTF-8',
    'enable-local-file-access': None,

    # 自定義頁眉頁腳(帶線)
    'header-html': header_path,
    'header-spacing': '5',

    'footer-html': footer_path,
    'footer-spacing': '5',
    # 必須添加以下三行
    'enable-javascript': None,
    'javascript-delay': '500',
    'no-stop-slow-scripts': None,
}

# -------------------------------
# 生成 PDF
# -------------------------------
print("正在生成 PDF,請稍候...")
try:
    pdfkit.from_string(
        full_html,
        output_pdf_file,
        configuration=config,
        options=options
    )
    print(f"PDF 生成成功!")
    print(f"文件:{os.path.abspath(output_pdf_file)}")
    print(f"頁眉頁腳臨時(shí)文件可刪除:{temp_dir}")
except Exception as e:
    print(f"PDF 生成失敗:{e}")
    exit(1)

# -------------------------------
# 結(jié)束提示
# -------------------------------
print("\n" + "="*50)
print("所有任務(wù)完成!")
print("1. 打開 output_a4.pdf 即可查看打印效果")
print("2. 支持直接打印,A4 完美適配")
print("3. 頁眉有下劃線,頁腳有上劃線,專業(yè)美觀")
print("="*50)

到此這篇關(guān)于Python實(shí)現(xiàn)將Markdown一鍵打印為A4專業(yè)文檔的文章就介紹到這了,更多相關(guān)Python打印Markdown內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Django框架反向解析操作詳解

    Django框架反向解析操作詳解

    這篇文章主要介紹了Django框架反向解析操作,結(jié)合實(shí)例形式詳細(xì)分析了Django框架相關(guān)定義、原理、使用方法及操作注意事項(xiàng),需要的朋友可以參考下
    2019-11-11
  • 如何解決flask修改靜態(tài)資源后緩存文件不能及時(shí)更改問題

    如何解決flask修改靜態(tài)資源后緩存文件不能及時(shí)更改問題

    在本篇內(nèi)容里小編給大家整理的是關(guān)于如何解決flask修改靜態(tài)資源后緩存文件不能及時(shí)更改問題,需要的朋友們可以學(xué)習(xí)下。
    2020-08-08
  • Python爬蟲之爬取淘女郎照片示例詳解

    Python爬蟲之爬取淘女郎照片示例詳解

    這篇文章主要介紹了Python爬蟲之爬取淘女郎照片示例詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • python中繞過反爬蟲的方法總結(jié)

    python中繞過反爬蟲的方法總結(jié)

    在本篇文章里小編給大家整理的是一篇關(guān)于python中繞過反爬蟲的方法總結(jié)內(nèi)容,需要的朋友們可以參考下。
    2020-11-11
  • Python爬蟲解析網(wǎng)頁的4種方式實(shí)例及原理解析

    Python爬蟲解析網(wǎng)頁的4種方式實(shí)例及原理解析

    這篇文章主要介紹了Python爬蟲解析網(wǎng)頁的4種方式實(shí)例及原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 對python sklearn one-hot編碼詳解

    對python sklearn one-hot編碼詳解

    今天小編就為大家分享一篇對python sklearn one-hot編碼詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • python 對字典按照value進(jìn)行排序的方法

    python 對字典按照value進(jìn)行排序的方法

    這篇文章主要介紹了python 對字典按照value進(jìn)行排序的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • Django 日志配置按日期滾動的方法

    Django 日志配置按日期滾動的方法

    今天小編就為大家分享一篇Django 日志配置按日期滾動的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • scipy.interpolate插值方法實(shí)例講解

    scipy.interpolate插值方法實(shí)例講解

    這篇文章主要介紹了scipy.interpolate插值方法介紹,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12
  • Python中TypeError: int object is not iterable錯(cuò)誤分析及解決辦法

    Python中TypeError: int object is not 

    在Python中,當(dāng)你嘗試對一個(gè)非迭代對象(如整數(shù)、浮點(diǎn)數(shù)等)使用迭代操作(如for循環(huán)、列表推導(dǎo)式中的迭代等)時(shí),會觸發(fā)TypeError: 'int' object is not iterable錯(cuò)誤,所以本文給大家介紹了Python中TypeError: int object is not iterable錯(cuò)誤分析及解決辦法
    2024-08-08

最新評論

北京市| 湖南省| 进贤县| 台东市| 玛沁县| 常熟市| 瓮安县| 昌宁县| 苏州市| 锡林浩特市| 南陵县| 乐山市| 罗城| 苏尼特右旗| 澄城县| 临夏市| 南华县| 长治市| 启东市| 昌黎县| 天水市| 新营市| 沐川县| 文成县| 涿州市| 宜昌市| 休宁县| 永和县| 双柏县| 牙克石市| 桦甸市| 上栗县| 邯郸市| 鄂州市| 无极县| 汤阴县| 铜川市| 连江县| 焦作市| 白水县| 紫阳县|