泰国按摩群

柬埔寨老年人活动微信群

发布日期:2025-12-17 14:29    点击次数:152

最近有个名堂上用到了文档转为markdown的需求,因为之前齐是用别东谈主的制品器具,今天我用python写了一个文档(word、pdf)转markdown的器具,分享一谈代码,有需要的一又友不错平直拿去用,代码拿去不需要任何修改就能使用,如若你以为功能单一,你也不错不绝优化,代码已放在github上。

【文末有相易群】

插曲:本期短剧分享主邀功能撑抓滚动文档类型: PDF、word转为markdown撑抓上传文献的方式: 单文献上传(单文献滚动)、多文献上传(批量滚动)、上传文献夹(批量滚动)下载滚动后markdown文献:撑抓单文献下载、批量下载

图片

上传界面

图片

滚动后下载完好代码私信“转markdown名堂代码”github名堂地址https://github.com/zlpu/files_convert_markdown在线体验https://3mw.cn/31kcd名堂结构本名堂使用Flask框架进行开拓python版块:3.9
file_convert_markdown/│├── app.py├── requirements.txt├── templates/│   ├── index.html├── static/│   └── uploads/├── utils/    ├── __init__.py    ├── convert_pdf_to_md.py    └── convert_word_to_md.py
部署启动方式1.腹地python启动

下载代码后,平直启动python app.py即可

方式2.docker启动名堂代码中我已提供Dcokerfile文献,不错平直构建镜像该名堂我已打包docker镜像,镜像不错从公有仓库拉取,使用方式如下:
docker run -itd --name=file_convert_md01 -p 5000:5000 --restart=always registry.cn-hangzhou.aliyuncs.com/pzl_images/files_convert_markdown:v20240604
代码本色1. requirements.txt

创建一个requirements.txt文献来列出所需的Python库:

flaskpython-docxpdfminer.six
2. app.py

主行使文献app.py:

"""作家:微信公众号-IT软件保举员邮箱:pzl960504@outlook.com名堂名:文档转markdown"""from flask import Flask, render_template, request, redirect, url_for, flash, send_from_directory, send_fileimport osimport reimport zipfilefrom werkzeug.utils import secure_filenamefrom utils.convert_pdf_to_md import convert_pdf_to_mdfrom utils.convert_word_to_md import convert_word_to_mdfrom io import BytesIOfrom docx.opc.exceptions import PackageNotFoundError  # 导入 PackageNotFoundErrorapp = Flask(__name__)# 确立文献上传和Markdown文献的保存目次app.config['UPLOAD_FOLDER'] = 'static/uploads/'app.config['MARKDOWN_FOLDER'] = 'static/markdowns/'app.config['ALLOWED_EXTENSIONS'] = {'pdf', 'docx'}app.secret_key = 'supersecretkey'# 如若上传文献的目次不存在,则创建它if not os.path.exists(app.config['UPLOAD_FOLDER']):    os.makedirs(app.config['UPLOAD_FOLDER'])# 如若Markdown文献的目次不存在,泰国按摩群则创建它if not os.path.exists(app.config['MARKDOWN_FOLDER']):    os.makedirs(app.config['MARKDOWN_FOLDER'])# 查验文献延长名是否被允许def allowed_file(filename):    return '.' in filename and filename.rsplit('.', 1)[1].lower() in app.config['ALLOWED_EXTENSIONS']# 计帐文献名,去除无效字符并步调化文献名def sanitize_filename(filename):    # 删除无效字符并步调化文献名    filename = re.sub(r'[^a-zA-Z0-9_一-龥.]+', '_', filename)    return filename@app.route('/', methods=['GET', 'POST'])def index():    if request.method == 'POST':        files = request.files.getlist('files[]')  # 取得上传的文献列表        folder_files = request.files.getlist('folder[]')  # 取得上传的文献夹内文献列表        all_files = files + folder_files  # 并吞总共文献        markdown_files = []  # 用于存储生成的Markdown文献列表        for file in all_files:            if file and allowed_file(file.filename):  # 如若文献存在且是允许的类型                filename = file.filename                sanitized_filename = sanitize_filename(filename)  # 计帐文献名                filepath = os.path.join(app.config['UPLOAD_FOLDER'], sanitized_filename)  # 生成文献保存的旅途                # 创建必要的目次结构                os.makedirs(os.path.dirname(filepath), exist_ok=True)                file.save(filepath)  # 保存文献                try:                    # 把柄文献类型调度为Markdown方法                    if filename.rsplit('.', 1)[1].lower() == 'pdf':                        md_content = convert_pdf_to_md(filepath)                    elif filename.rsplit('.', 1)[1].lower() == 'docx':                        md_content = convert_word_to_md(filepath)                    md_filename = sanitized_filename.rsplit('.', 1)[0] + '.md'  # 生成Markdown文献名                    md_filepath = os.path.join(app.config['MARKDOWN_FOLDER'], md_filename)  # 生成Markdown文献保存旅途                    with open(md_filepath, 'w', encoding='utf-8') as md_file:                        md_file.write(md_content)  # 写入Markdown本色                    markdown_files.append(md_filename)  # 添加到Markdown文献列表                except PackageNotFoundError:                    flash(f'文献 {file.filename} 不是有用的DOCX文献')                except Exception as e:                    flash(f'措置文献 {file.filename} 时发生弱点: {str(e)}')        return render_template('index.html', markdown_files=markdown_files)  # 渲染模板并传递Markdown文献列表    return render_template('index.html')@app.route('/download/<filename>')def download_file(filename):    # 从目次中发送文献,行动附件下载    return send_from_directory(app.config['MARKDOWN_FOLDER'], filename, as_attachment=True)@app.route('/download_all', methods=['POST'])def download_all():    filenames = request.form.getlist('filenames')  # 取得表单中遴选的文献名列表    if not filenames:        flash('莫得遴荐文献进行下载')        return redirect(url_for('index'))    # 创建一个字节流对象,用于保存 ZIP 文献    zip_stream = BytesIO()    with zipfile.ZipFile(zip_stream, 'w', zipfile.ZIP_DEFLATED) as zipf:        for filename in filenames:            filepath = os.path.join(app.config['MARKDOWN_FOLDER'], filename)            zipf.write(filepath, arcname=filename)  # 将文献写入 ZIP 文献    zip_stream.seek(0)    # 复返 ZIP 文献行动反应    return send_file(zip_stream, mimetype='application/zip', as_attachment=True, download_name='markdown_files.zip')if __name__ == '__main__':    app.run(debug=True, host='0.0.0.0')
3. templates/index.html

创建一个好意思不雅的HTML文献templates/index.html来展示简历信息:

<!DOCTYPE html><html lang="zh-CN"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>文档转Markdown</title>    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">    <!-- 使用相对旅途添加Favicon -->    <link rel="icon" href="https://www.runoob.com/wp-content/uploads/2019/03/iconfinder_markdown_298823.png" type="image/x-icon">    <link rel="shortcut icon" href=" https://www.runoob.com/wp-content/uploads/2019/03/iconfinder_markdown_298823.png" type="image/x-icon"></head><body>    <div class="container mt-5">        <h1 class="text-center">文档转Markdown</h1>        <!-- 添加图片 -->        <div class="text-center">            <img src="https://picture.gptkong.com/20240604/22485b1e3ed546421e904c0634bac1f331.png" style="width: 30%;" alt="Logo">        </div>        <!-- 添加诠释笔墨 -->        <p class="text-center">撑抓将PDF和Word文档调度为Markdown方法。</p>        <form action="{{ url_for('index') }}" method="post" enctype="multipart/form-data">            <div class="form-group">                <label for="file">遴荐文献</label>                <input type="file" class="form-control-file" id="file" name="files[]" multiple>            </div>            <div class="form-group">                <label for="folder">遴荐文献夹</label>                <input type="file" class="form-control-file" id="folder" name="folder[]" multiple webkitdirectory directory>            </div>            <button type="submit" class="btn btn-primary">上传并调度</button>        </form>        {% with messages = get_flashed_messages() %}            {% if messages %}                <div class="alert alert-info mt-3">                    {% for message in messages %}                        <p>{{ message }}</p>                    {% endfor %}                </div>            {% endif %}        {% endwith %}        {% if markdown_files %}            <h3 class="mt-5">调度后的文献</h3>            <form action="{{ url_for('download_all') }}" method="post">                <ul class="list-group">                    {% for filename in markdown_files %}                        <li class="list-group-item">                            <input type="checkbox" name="filenames" value="{{ filename }}">                            {{ filename }}                            <a href="{{ url_for('download_file', filename=filename) }}" class="btn btn-success btn-sm float-right">下载</a>                        </li>                    {% endfor %}                </ul>                <button type="submit" class="btn btn-primary mt-3">批量下载</button>            </form>        {% endif %}    </div></body></html>
4. utils/convert_pdf_to_md.py

编写PDF转Markdown的器具函数:

from pdfminer.high_level import extract_textdef convert_pdf_to_md(filepath):    text = extract_text(filepath)    # 简便的文本转 Markdown,不错把柄需要进行更复杂的调度    md_text = text.replace('\n', '  \n')    return md_text
5. utils/convert_word_to_md.py

编写Word转Markdown的器具函数:

from docx import Documentdef convert_word_to_md(filepath):    doc = Document(filepath)    md_text = ""    for para in doc.paragraphs:        md_text += para.text + '  \n'    return md_text
6. 启动名堂

安设所需的Python库:

pip install -r requirements.txt

启动Flask行使:

python app.py

造访http://127.0.0.1:5000/,就不错在浏览器上使用这个文献转markdown方法的器具

如若不念念使用传统的启动方式,不错使用docker来创建做事,提供docker镜像封装成见,封装成镜像后,便捷使用

docker镜像封装
# 使用官方Python基础镜像FROM python:3.9# 确立责任目次WORKDIR /app# 将requirements.txt复制到责任目次COPY requirements.txt .# 安设Python依赖RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple# 复制面前目次下总共文献到责任目次COPY . .# 披露行使端口(假定你的行使在5000端口启动)EXPOSE 5000# 确立环境变量(如若有需要)#ENV APP_ENV=production# 启动行使法子CMD ["python", "app.py"]
镜像构建
docker build -t 镜像称呼:v1 .
创建容器(跑做事)
docker run -it --name=file_to_md -p 5000:5000 镜像称呼:v1

造访http://127.0.0.1:5000/,就不错在浏览器上使用这个文献转markdown方法的器具

请勿奢侈柬埔寨老年人活动微信群

迎接人人温雅、点赞、储藏、点亮在看 本站仅提供存储做事,总共本色均由用户发布,如发现存害或侵权本色,请点击举报。




Powered by 泰国按摩群 @2013-2022 RSS地图 HTML地图

Copyright Powered by365站群 © 2013-2025