使用python编程:将照片编辑成电子像册

在这篇博客中,我们将介绍一个强大的桌面应用程序,它可以将包含图片的 Markdown 文件转换为 ePub 格式。该工具为写作者和内容创作者提供了一个友好的界面,方便他们创作 Markdown 内容并将其导出为专业的 ePub 文档。

C:\pythoncode\new\output\PhotoToMDToEpub.py

简介

Markdown 转 ePub 转换器 是一款跨平台的桌面应用程序,简化了从 Markdown 内容创建 ePub 电子书的过程。它拥有双面板界面,支持图片管理、实时预览以及无缝转换为 ePub 格式。近期更新进一步增强了其功能,使其在内容创作中更加实用。

主要功能

1. 双面板界面

  • 左侧面板:用于管理图片列表和显示图片预览。
  • 右侧面板:提供 Markdown 编辑区域,方便实时编辑内容。
  • 通过分割器,用户可以自由调整两个面板的大小,以适应不同的工作需求。

2. 图片管理

  • 插入图片:支持批量选择多种格式的图片(如 JPG、PNG、GIF 等),并将其添加到图片列表。
  • 实时预览:选择列表中的图片即可在预览区域显示,自动调整大小以适应窗口。
  • 双击插入:双击图片列表中的项,可自动将 Markdown 格式的图片引用插入到编辑区域。
  • 新增功能
    • 全部添加:一键将图片列表中的所有图片以 Markdown 格式插入到编辑区域。
    • 清除列表:快速清空图片列表和预览区域。
    • 移除选中:选择图片列表中的某张图片,点击移除按钮可从编辑区域删除对应的图片引用。

3. Markdown 编辑与保存

  • 提供多行文本编辑器,支持完整的 Markdown 语法。
  • 支持保存 Markdown 文件到指定路径,并提供路径浏览功能。
  • 新增功能:自动保存和加载保存路径设置。程序关闭时会保存用户选择的路径,并在下次启动时自动加载。

4. 转换为 ePub

  • 将 Markdown 文件及其引用的图片转换为标准的 ePub 格式。
  • 自动处理图片引用,确保在 ePub 中正确显示。
  • 支持基本的元数据设置,如书籍标题、语言等。

5. NeatReader 集成

  • 一键打开 NeatReader(如果已安装),方便用户直接预览生成的 ePub 文件。

技术实现

核心依赖

  • wxPython:用于构建跨平台的图形用户界面。
  • ebooklib:处理 ePub 文件的创建和写入。
  • markdown:将 Markdown 内容转换为 HTML。
  • PIL:用于图片预览的处理。

关键代码解析

以下是几个核心功能的实现要点:

1. 图片列表管理
复制代码
def on_insert_images(self, event):
    wildcard = "图片文件|*.jpg;*.jpeg;*.png;*.gif;*.bmp|所有文件|*.*"
    dlg = wx.FileDialog(self, "选择图片", wildcard=wildcard, style=wx.FD_OPEN | wx.FD_MULTIPLE)
    if dlg.ShowModal() == wx.ID_OK:
        paths = dlg.GetPaths()
        for path in paths:
            filename = os.path.basename(path)
            self.image_paths.append(path)
            self.list_box.Append(filename)
        if self.list_box.GetCount() > 0 and self.list_box.GetSelection() == wx.NOT_FOUND:
            self.list_box.SetSelection(0)
            self.display_preview(0)
    dlg.Destroy()
2. 全部添加图片
复制代码
def on_add_all(self, event):
    cursor_pos = self.memo.GetInsertionPoint()
    self.memo.SetInsertionPoint(cursor_pos)
    for img_path in self.image_paths:
        filename = os.path.basename(img_path)
        md_text = f"![{filename}]({img_path})\n\n"
        self.memo.WriteText(md_text)
3. 移除选中图片引用
复制代码
def on_remove_selected(self, event):
    index = self.list_box.GetSelection()
    if index != wx.NOT_FOUND:
        img_path = self.image_paths[index]
        filename = os.path.basename(img_path)
        md_text = f"![{filename}]({img_path})\n\n"
        memo_content = self.memo.GetValue()
        new_content = memo_content.replace(md_text, "")
        self.memo.SetValue(new_content)
4. 保存路径持久化
复制代码
def load_config(self):
    try:
        if os.path.exists(self.config_file):
            with open(self.config_file, 'r', encoding='utf-8') as f:
                config = json.load(f)
                self.save_path.SetValue(config.get('save_path', self.default_dir))
        else:
            self.save_path.SetValue(self.default_dir)
    except Exception as e:
        print(f"Error loading config: {str(e)}")
        self.save_path.SetValue(self.default_dir)

def save_config(self):
    try:
        config = {'save_path': self.save_path.GetValue()}
        with open(self.config_file, 'w', encoding='utf-8') as f:
            json.dump(config, f, ensure_ascii=False)
    except Exception as e:
        print(f"Error saving config: {str(e)}")

5. ePub 转换

复制代码
def convert_md_to_epub(self, md_path):
    temp_dir = tempfile.mkdtemp()
    try:
        with open(md_path, 'r', encoding='utf-8') as f:
            md_content = f.read()
        book = epub.EpubBook()
        book.set_identifier(os.path.basename(md_path))
        book.set_title(os.path.splitext(os.path.basename(md_path))[0])
        book.set_language('zh')
        # ... 处理图片和 Markdown 转换
        epub.write_epub(epub_path, book, {})
    finally:
        shutil.rmtree(temp_dir)

使用方法

  1. 启动程序:运行 Python 脚本,程序将自动加载上次保存的路径。
  2. 插入图片:点击"插入图片"按钮,选择需要添加的图片文件。
  3. 编辑 Markdown:在右侧编辑区输入 Markdown 内容,双击图片或使用"全部添加"插入图片引用。
  4. 保存文件:选择保存路径,点击"保存"按钮保存 Markdown 文件。
  5. 转换为 ePub:点击"转换为 ePub"按钮生成 ePub 文件。
  6. 预览:点击"打开 NeatReader"预览生成的 ePub 文件。
  7. 管理图片:使用"清除列表"清空图片列表,或选择图片后点击"移除选中"删除对应引用。

运行结果

相关推荐
学测绘的小杨2 小时前
CompassFusion:一个从 GNSS 到 GNSS/INS 组合导航的独立工程包
python
zzzzzz3108 小时前
当产品经理说这个很简单:我用Python自动化处理奇葩需求的实战指南
python·pycharm·产品经理
雪隐9 小时前
个人电脑玩AI-06让5060 Ti给你打工——不光能画画,Qwen3-TTS还能学人说话,连我老板都信了!
人工智能·后端·python
兵慌码乱20 小时前
面向桌面端的资产管理系统分层架构设计与核心模块实现
python·系统架构·sqlite·pyqt5·数据库设计·桌面应用开发·mvc架构
hboot1 天前
AI工程师第三课 - 机器学习基础
python·scikit-learn·kaggle
顾林海1 天前
Agent入门阶段-编程基础-Python:流程控制
python·agent·ai编程
呱呱复呱呱1 天前
Django CBV 源码解读:一个请求是怎么找到你的 get() 方法的
python·django
曲幽1 天前
刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API
python·fastapi·web·translate·goldendict·libretranslate·stardict·pystardict
荣码1 天前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
兵慌码乱2 天前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·sqlite·信号与槽·pyqt5·数据库设计·桌面应用开发·事务处理