Matrix 首页推荐 

Matrix 是少数派的写作社区,我们主张分享真实的产品体验,有实用价值的经验与思考。我们会不定期挑选 Matrix 最优质的文章,展示来自用户的最真实的体验和观点。 
文章代表作者个人观点,少数派仅对标题和排版略作修改。


本文介绍一种通过 Eagle 来管理 Zotero 的图片,同时给图片添加 Zotero 的外部回链,这样你就可以通过图片去定位文献以及图片存在的位置,还可以借助 Python 脚本来辅助完成批量操作的过程。

演示效果

Eagle 软件介绍

Eagle 是一款图片素材管理软件,可帮助用户有效组织、管理和使用图片素材。它提供直观易用的界面,让用户能快速浏览和搜索图片素材库。此外,Eagle 还提供强大的标签和分类功能,让用户按需整理和归类图片素材,创建自己的图片素材库。

思路讲解

Zotero 标注的图片位置

Zotero 的标注图片一般在(你定义的)数据库文件夹的cache->library下面:

Zotero标注图片的位置

Zotero 回链的组成

Zotero 的回链按 PDF 文件夹、页码、注释号=图片名称 (自动命名的)的格式组成,例如:

zotero://open-pdf/library/items/9P4STCK8?page=2&annotation=IDMC67ZS

 

需要注意的是,缺少注释号或者页码并不会打断跳转,只是缺少了精确定位。

其实对于标注的信息,还可以通过图片名进行精准定位:

格式:zotero://open-pdf/library/items/图片名?annotation=图片名
示例:zotero://open-pdf/library/items/ZZR39PI7?annotation=ZZR39PI7

这样就可以通过图片名称知道 Zotero 的外部回链了。

批量导入 Eagle

由于 Eagle 对图片的管理形式并不是文件夹的管理方式,素材存储在 E:\PandaMemos.library\images 路径下,命名并不规则 (这一点和 Zotero 的 PDF 管理一样),如何批量导入图片也是一个问题。


不过我发现在设置里面有一项自动导入的选项:


它会在该路径下生成一个文件夹为你的库名,比如我的库名为 PandaMemos,则在 D:\PandaNotes\Y-图形文件存储 路径下就会生成名为 PandaMemos 的文件夹,只要把图片放入该文件夹中,它就会自动移动图片到 Eagle 库中。

批量添加外部回链

Eagle 除了手动添加链接外,其它图片的标签、注释、外部链接等信息一般在图片文件夹中的 metadata.json 中管理。

其中的"url":"zotero://open-pdf/library/items/L46PP6VC?annotation=L46PP6VC" 就是外部回链。以通过图片名称定位到文件夹,并在定位到图片路径后修改图片的基本信息,还可以添加外部链接。

Python 脚本的实现

综上所述,Zotero 图片的来源,以及导入 Eagle 和添加外部回链的流程就很清晰了,接下来就可以写对应的 Python 把 Zotero 的文献图片导入 Eagle,同时对重复的图片名选择不添加,之后等待 Eagle 导入全部的图片后,通过图片名定位到图片的文件夹路径,修改 metatable 文件,附上图链,完成任务。

第一步

检测重复图片后,复制图片到 Eagle 的快速导入文件夹

# -*- coding: utf-8 -*-
"""
Created on Fri Sep  1 07:21:40 2023
@author: 熊猫别熬夜
"""
import os
import shutil
import time
import json
# 源文件夹路径
source_folder = r"D:\Zotero\cache\library"
# 目标文件夹路径
destination_folder = "D:/PandaNotes/Y-图形文件存储/PandaMemos"
# 目标文件夹路径2
eagle_folder = "E:\PandaMemos.library\images"

# 遍历source_folder文件夹,获取所有png图片的路径和文件名
zotero_pic_paths = []
zotero_pic_filenames = []
for root, dirs, files in os.walk(source_folder):
    for filename in files:
        if filename.endswith(".png"):
            file_path = os.path.join(root, filename)
            zotero_pic_paths.append(file_path)
            zotero_pic_filenames.append(filename)

# 遍历eagle_folder文件夹及其子文件夹,获取所有png图片的文件名
eagle_pic_filenames = []
eagle_pic_paths= []
for root, dirs, files in os.walk(eagle_folder):
    for filename in files:
        if filename.endswith(".png"):
            file_path = os.path.join(root, filename)
            eagle_pic_paths.append(file_path)
            eagle_pic_filenames.append(filename)

# 计数器变量
duplicate_count = 0
copy_count = 0

# 检查zotero_pic_filenames中的文件名是否存在于eagle_pic_filenames中,如果不存在则复制图片到destination_folder
destination_files=[]
new_copy_files=[]
for i in range(len(zotero_pic_filenames)):
    if zotero_pic_filenames[i] not in eagle_pic_filenames:
        source_file = zotero_pic_paths[i]
        destination_file = os.path.join(destination_folder, zotero_pic_filenames[i])
        new_copy_files.append(zotero_pic_filenames[i])
        # print(destination_file)
        shutil.copyfile(source_file, destination_file)
        copy_count += 1
    else:
        duplicate_count += 1

# 输出重复的图片数量和复制的图片数量
print(f"重复的图片数量:{duplicate_count}")
print(f"复制的图片数量:{copy_count}")

第二步

对 Zotero 和 Eagle 中具有相同名称的图片进行修改 meatdata 文件,添加 Zotero 外部回链

为避免有些图片没有命名上去,等你 Eagle 把图片全部导入后,就可以运行这一步了。

# -*- coding: utf-8 -*-
"""
Created on Fri Sep  1 06:09:38 2023
@author: 熊猫别熬夜
"""

import os
import time
import json

# 源文件夹路径
source_folder = r"D:\Zotero\cache\library"

# 目标文件夹路径
destination_folder = "E:\PandaMemos.library\images"

# 遍历目标文件夹及其子文件夹
i=0
for root, dirs, files in os.walk(destination_folder):
    for filename in files:
        # 检查文件扩展名是否为PNG
        if filename.endswith(".png"):
            # 构建目标文件的完整路径
            destination_file = os.path.join(root, filename)

            # 检查源文件夹中是否存在相同名称的图片
            source_file = os.path.join(source_folder, filename)
            if os.path.exists(source_file):
                # 输出/metadata.json文件路径
                metadata_file = os.path.join(root, "metadata.json")
                print(metadata_file)
                i=i+1
                # 读取metadata.json文件
                with open(metadata_file, "r",encoding="utf-8") as file:
                    data = json.load(file)
                # 修改"folders"的值为"LLZPQ91WQ8KFR"
                pic_name=filename.split(".")[0]

                zotero_url=f"zotero://open-pdf/library/items/{pic_name}?annotation={pic_name}"
                data["url"] = zotero_url
                # data["folders"] = ["LLZPQ91WQ8KFR"]
                # 写入修改后的数据到metadata.json文件
                with open(metadata_file, "w",encoding="utf-8") as file:
                    json.dump(data, file)

print(f"✅总计修改了{i}个metadata")

小结

Eagle 提供了强大的标签和分类功能,让用户按需整理和归类图片素材,不过我推荐以文件夹为主,标签为辅的形式进行管理,如果检测到相同的图片,选择应用原来的图片就行了。

如果你想导入 Obsidian 进行管理的话,这里推荐 Obsidian 的另一种附件管理神器 Billfish,把 Eagle 导出的素材包导入 Billfish 中时,图片回链保存。

我一开始尝试用 Billfish 来批量添加回链的,不过图片的信息不好批量添加,因此转向了 Eagle,用 Eagle 的定期地发送素材包到 Billfish 里面也算是一种方法了。

> 下载 少数派 2.0 客户端、关注 少数派公众号,解锁全新阅读体验 📰

> 实用、好用的 正版软件,少数派为你呈现 🚀