在这篇博客中,我们将介绍一个强大的桌面应用程序,它可以将包含图片的 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"\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"\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)
使用方法
- 启动程序:运行 Python 脚本,程序将自动加载上次保存的路径。
- 插入图片:点击"插入图片"按钮,选择需要添加的图片文件。
- 编辑 Markdown:在右侧编辑区输入 Markdown 内容,双击图片或使用"全部添加"插入图片引用。
- 保存文件:选择保存路径,点击"保存"按钮保存 Markdown 文件。
- 转换为 ePub:点击"转换为 ePub"按钮生成 ePub 文件。
- 预览:点击"打开 NeatReader"预览生成的 ePub 文件。
- 管理图片:使用"清除列表"清空图片列表,或选择图片后点击"移除选中"删除对应引用。
运行结果
