使用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. 管理图片:使用"清除列表"清空图片列表,或选择图片后点击"移除选中"删除对应引用。

运行结果

相关推荐
桥Dopey12 分钟前
Python常用的第三方模块之【jieba库】支持三种分词模式:精确模式、全模式和搜索引擎模式(提高召回率)
人工智能·python·分词模式
亚力山大抵38 分钟前
实验2 python的TCP群聊系统实现
服务器·python·tcp/ip
想学好英文的ikun41 分钟前
【MCP】第二篇:IDE革命——用MCP构建下一代智能工具链
ide·人工智能·python·ai·个人开发·mcp
凌叁儿1 小时前
从零开始搭建Django博客③--前端界面实现
前端·python·django
穆易青1 小时前
2025.04.23【探索工具】| STEMNET:高效数据排序与可视化的新利器
python·信息可视化·数据分析·ordering·visualisation
DKPT1 小时前
正则表达式与python使用
笔记·python·学习·面试·正则表达式
LouisCanBe2 小时前
Python 环境管理工具选择与安装实践:Conda 与 uv
linux·python
limengshi1383922 小时前
使用Python将YOLO的XML标注文件转换为TXT文件格式
xml·python·yolo
矢志航天的阿洪2 小时前
伪谱法求解最优控制问题(附Python代码)
开发语言·python
贵沫末2 小时前
AI——神经网络以及TensorFlow使用
人工智能·python·线性回归