跳转至

自用脚本

约 42 个字 218 行代码 2 张图片 预计阅读时间 3 分钟

Pdf2Png

将 PDF 文件每一页转换为 PNG 格式的高质量图像文件,主要用于Beamer制作的幻灯片转换至PPT。

pip install pymupdf
"""
PDF 转 PNG 高质量图像脚本(适用于 Beamer 幻灯片转 PPT)
------------------------------------------------------

功能说明:
本脚本基于 PyMuPDF(fitz),将指定 PDF 文件中的每一页转换为高分辨率的 PNG 图像,
适用于将 LaTeX Beamer 制作的幻灯片导出为图片,用于插入 PowerPoint 或其他展示工具。

核心功能:
- 遍历 PDF 文件的所有页
- 使用自定义缩放倍数(默认 zoom=8,相当于 576 DPI 渲染)
- 每页渲染为清晰的 PNG 图像,文件命名为 output_001.png、output_002.png 等
- 特别适用于高质量展示,如学术报告、讲座、教学课件等场景

使用方法:
1. 将待转换的 PDF 文件放在脚本所在目录,并修改 pdf_path 变量为目标路径
2. 运行脚本后,会在同目录下生成逐页命名的 PNG 文件
3. 可将这些图片插入到 PowerPoint 等工具中进行进一步排版或美化

依赖环境:
- Python 3.x
- 第三方库:PyMuPDF(即 fitz)

安装命令:
pip install pymupdf

示例输出:
- output_001.png
- output_002.png
- ...

建议:
- 若输出图像过大,可适当降低 zoom 值(推荐范围 4~8)
- 可扩展为批量转换、图像裁剪、加水印等功能

作者:易公子
"""


import fitz  # PyMuPDF

# 输入 PDF 路径
pdf_path = "PyMFEA软件介绍.pdf"

# 打开 PDF 文件
doc = fitz.open(pdf_path)

for page_num in range(len(doc)):
    page = doc.load_page(page_num)

    # 渲染页面为图像(设置缩放倍数)
    zoom = 8  # 缩放倍数(1=72 DPI,4=288 DPI)
    mat = fitz.Matrix(zoom, zoom)

    pix = page.get_pixmap(matrix=mat, alpha=False)

    # 保存为 PNG
    output_path = f"output_{page_num + 1:03d}.png"
    pix.save(output_path)
    print(f"已保存:{output_path}")

doc.close()

Obsidian2Mkdoc

"""
Obsidian → MkDocs Markdown 格式转换脚本

概述:
--------
本脚本旨在将 Obsidian 风格的 Markdown 文件自动转换为兼容 MkDocs 的语法格式,
用于内容迁移、文档规范化或部署到 MkDocs 静态文档系统中。

核心功能:
--------
1. ✅ 块环境(Callout)转换:
    - 自动识别 Obsidian 的块引用语法 `> [!type]`,并转换为 MkDocs 的 `!!! type` 块格式
    - 支持可选标题,如:
        > [!tip] 自定义标题 → !!! tip "自定义标题"

2. ✅ 加粗样式转换:
    - 将 Obsidian 中的 `**加粗**` 文本转换为 MkDocs 风格的 `==高亮==`

3. ✅ 超链接转换为脚注(Footnotes):
    - 自动识别 Markdown 中非图片的 `[文本](http链接)` 格式
    - 替换为 `文本[^n]` 并在文末添加对应脚注 `[^{n}]: 链接地址`
    - 保留相对路径、本地锚点及图片链接(`![]()`)不做处理

支持的块类型(自动映射):
--------
    note, tip, info, todo → question, success, warning,
    failure, danger, bug, example, quote 等 MkDocs 标准块

使用说明:
--------
1. 将原始 Obsidian 导出的 Markdown 文件重命名为 `input.md`
2. 运行脚本后,会自动生成 `output.md`,其中包含所有格式替换结果
3. 可根据需要进行批处理扩展或集成到构建流程中

适用场景:
--------
- 将 Obsidian 笔记发布到 MkDocs 系统
- 统一 Markdown 风格标准
- 支持构建跨平台、模块化文档体系

作者:易公子
"""


import re
from collections import OrderedDict

# 块类型映射(大小写敏感,Obsidian 到 MkDocs)
block_types = {
    "note": "note",
    "tip": "tip",
    "info": "info",
    "todo": "question",
    "success": "success",
    "warning": "warning",
    "failure": "failure",
    "danger": "danger",
    "bug": "bug",
    "example": "example",
    "quote": "quote",
}

def convert_bold_to_highlight(text_line):
    """
    将 Obsidian 的加粗语法 **内容** 替换为 MkDocs 的高亮语法 ==内容==
    """
    return re.sub(r"\*\*(.+?)\*\*", r"==\1==", text_line)

def convert_block_env(text):
    """
    将 Obsidian 的块环境(> [!type] 可选标题)转换为 MkDocs 的 !!! type "标题" 格式
    """
    pattern = re.compile(r"^> \[!(\w+)\](?:\s+(.*))?$", re.IGNORECASE)

    lines = text.splitlines()
    output = []
    i = 0

    while i < len(lines):
        match = pattern.match(lines[i])
        if match:
            block_type_raw = match.group(1).lower()
            block_title = match.group(2)

            mkdocs_type = block_types.get(block_type_raw, block_type_raw)

            if block_title:
                output.append(f'!!! {mkdocs_type} "{block_title}"')
            else:
                output.append(f"!!! {mkdocs_type}")

            i += 1
            while i < len(lines) and lines[i].startswith(">"):
                content = lines[i][1:].lstrip()
                output.append("    " + content)
                i += 1
        else:
            output.append(lines[i])
            i += 1

    return "\n".join(output)

def convert_links_to_footnotes(text):
    """
    将 Markdown 中非图片且 http/https 开头的链接 [文本](https://...) 转换为脚注:
    文本[^1]
    并在末尾追加:[1]: 链接

    不处理:
    - 图片链接 ![文本](...)
    - 相对链接、锚点 [文本](doc.md#部分)
    """
    link_pattern = re.compile(r"(?<!\!)\[(.*?)\]\((https?://[^\)]+)\)")
    footnotes = OrderedDict()
    current_index = 1

    def replace_link(match):
        nonlocal current_index
        label, url = match.group(1), match.group(2)
        if url not in footnotes:
            footnotes[url] = current_index
            current_index += 1
        return f"{label}[^{footnotes[url]}]"

    # 替换正文中的 http 链接
    converted_text = link_pattern.sub(replace_link, text)

    # 构建脚注区域
    footnote_lines = [f"[^{idx}]: {url}" for url, idx in footnotes.items()]

    if footnote_lines:
        converted_text += "\n\n" + "\n".join(footnote_lines)

    return converted_text

def convert_obsidian_to_mkdocs(text):
    """
    总转换器:执行块环境转换、加粗转高亮、链接转脚注
    """
    text = convert_block_env(text)
    lines = text.splitlines()
    lines = [convert_bold_to_highlight(line) for line in lines]
    text = "\n".join(lines)
    text = convert_links_to_footnotes(text)
    return text

# 示例:读取、转换、保存
if __name__ == "__main__":
    with open("input.md", "r", encoding="utf-8") as f:
        content = f.read()

    converted = convert_obsidian_to_mkdocs(content)

    with open("output.md", "w", encoding="utf-8") as f:
        f.write(converted)