V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
12345tiger
V2EX  ›  Java

[求思路]求助 PDF 重命名功能实现的思路与优化

  •  
  •   12345tiger · 2019-10-03 20:21:56 +08:00 · 1525 次点击
    这是一个创建于 1877 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景:非计算机专业的

    • 我想做一款对 PDF 文件(学术论文的 PDF )内容提取并按照期刊信息进行重命名及内容写入的小软件。 例如:从 ACS 网站(一个化学杂志网站)下载的论文,默认文件名“jm400459m.pdf”。我要做的是依据杂志名称,年份卷号、页码等将其重命名至“J. Med. Chem. 2013, 56, 12, 5094”

    当前的工作流程:

    • 1 )使用现成的组件从 PDF 文件中提取标题--(使用 docear 的一个组件,org.docear.pdf.PdfDataExtractor )
    • 2 )拿标题去 https://api.crossref.org 的接口上查找对应的 DOI 号(会返回多个结果,手动挑出正确值)
    • 3 )用 DOI 号去 http://search.crossref.org/上查找对应的 citation 信息(返回 ris 格式)
    • 4 )从返回的 ris 格式中挑出杂志名称,年份卷号、页码等信息,组件文件名字符串即“J. Med. Chem. 2013, 56, 12, 5094”
    • 5 )使用 ItextPDF 对 PDF 文件内容进行修改,将 DOI 号写入到 PDF 文件中(使用 com.itextpdf.text.pdf.PdfStamper )
    • 6 )以此对原 PDF 文件进行重命名(使用 renameTo 操作)

    当前存在的问题:

    • A )以上步骤 2、3 都需要联网进行查询,会比较耗时(外网,有时还不稳定,需要 5s 以上)
    • B )重命名操作( 5,6 在一个动作里)耗时很长,经常需要 30s 以上。(另外比较诡异的是,当前这台电脑即使在 windouws 的文件浏览器中进行“新建文件夹操作”也需要很久,10s 以上,找不到原因!)
    • C )当前已经实现从步骤 1-6 一步一步完成,但是耗时较长,请各位大佬给个思路或者关键词,怎样去降低整个操作的时间?
    • D )终极目标:对整个文件夹下面的 PDF 文件,成批次进行重命名(即同时添加多个文件,同时查询多个文件的信息,一个文件操作完自动转到下一个)

    主要问题是以上 A-D,烦请各位大佬给个建议或者关键词,我自己去搜索

    (另:尝试过所谓的性能分析工具,奈何非科班出生,专业背景欠缺完全看不懂。。。)

    第 1 条附言  ·  2021-03-30 10:50:56 +08:00

    最近写文章实在是头大了,又把PDF重命名的搞了下。

    彻底放弃以前的思路,按照@pyder的脚本做了一下,嗯果然好用

    github地址 https://github.com/LiYangChem/SciPDF_Renamer

    作为给其他非科班出身的爱好者一个参考吧

    21 条回复    2019-10-05 12:47:44 +08:00
    redeemer1001
        1
    redeemer1001  
       2019-10-03 20:36:42 +08:00
    联网查询慢,那就多线程嘛。
    B 问题,建议先检查一下硬盘是否健康……

    其实如果不是要求即时获取结果,没必要太追求程序效率,再慢挂一晚上机睡一觉起来,不都搞定了。鲁棒性更重要。
    favourstreet
        2
    favourstreet  
       2019-10-03 20:54:58 +08:00
    一楼就说到了多线程……再一想楼主专业背景欠缺,哎呀……

    B 问题,还有可能是文件系统被塞撑到了。

    多线程还不够快就多进程,去什么什么云上开他几十个虚拟机跑
    7Sasuke7L
        3
    7Sasuke7L  
       2019-10-03 21:02:48 +08:00 via Android
    我一般是下载好后,自己重命名,我感觉这个项目有难度。因为有些 pdf 没有标题,或者是有些 pdf 是扫描文件,甚至有些 pdf 的标题不是你要的标题。而且你的提取会有一定的几率不准确,到头来还得自己修好不准确的部分。比如我是数学专业,有些标题会带有数学字符,这些是无法加入命名的
    also24
        4
    also24  
       2019-10-03 21:28:58 +08:00 via Android
    问题是否可以换一个角度来解决呢?
    例如写针对 ACS 网站的爬虫,这样就可以知道文件是从哪个页面下载下来的,从而补充上相应的信息。
    这样有一个额外的好处是可以保证信息的准确度。
    whatIsGhost
        5
    whatIsGhost  
       2019-10-03 21:45:40 +08:00
    为什么不直接丢进 endnote 或者 zotero 来解决这个问题呢?其中 zotero 可以直接重命名文件
    12345tiger
        6
    12345tiger  
    OP
       2019-10-03 21:58:26 +08:00
    @redeemer1001 多线程对小量的数据提升有效吗?查询返回的结果小于 10k,多线程不是对大文件才有效吗?
    12345tiger
        7
    12345tiger  
    OP
       2019-10-03 21:59:08 +08:00
    @favourstreet 在本地 pc 上使用,搬到云端应该不行。。
    12345tiger
        8
    12345tiger  
    OP
       2019-10-03 22:06:16 +08:00
    @7Sasuke7L 是会存在正确率的问题,大约能有 70 左右。之前也是手动自己搞,但是有时文献量有点大,而且手动重命名很难做到一直保持一直的规范
    @also24 这个不太现实。。。数据库过大(千年以上,主要是 SCI 数据库),而且现在就是去 crossref.org 接口查数据库
    @whatIsGhost 用过 endnote、mendeley、docear、zotero 等文献管理软件,虽然可以重命名但是需要转移到软件指定文件,丧失了原有的文件目录结构。对以上都不是很满意,就自己一直靠文件目录来管理文献,然后就想通过写入 PDF 文件的方式来存储 citation 信息。
    jugelizi
        9
    jugelizi  
       2019-10-03 22:38:06 +08:00
    网络消耗当然是靠多个任务同时运行(在网站未做单 IP 限速的情况下,否则就考虑代理了)
    性质和爬虫是一样的
    redeemer1001
        10
    redeemer1001  
       2019-10-03 23:14:19 +08:00
    @12345tiger 同时发起多个 Http 请求查多个文件的数据。你是不是理解成多线程下载文件了……
    noqwerty
        11
    noqwerty  
       2019-10-04 01:50:48 +08:00 via Android
    @12345tiger endnote 的话就不用操心这些了呀,插参考文献,管理和检索 PDF 都方便很多。感觉你这个写到最后也就是重新造了个轮子。
    diggerdu
        12
    diggerdu  
       2019-10-04 02:00:13 +08:00 via iPhone
    zotfile 可以直接按元信息重命名
    AFuture
        13
    AFuture  
       2019-10-04 02:02:44 +08:00 via iPhone
    readcube……
    pyder
        14
    pyder  
       2019-10-04 09:55:44 +08:00
    写了个 gist: https://gist.github.com/ipudu/b72031f84a0e6cfdf6626a791f8fe380

    如果文章从 ACS 这些地方下载,里面就包含了 DOI 的。

    没有错误处理,对于很新的文章不适用(没有 volume, 没有 page number。。。)

    放到 bash loop 里,可以改多个文章。
    12345tiger
        15
    12345tiger  
    OP
       2019-10-04 11:40:56 +08:00
    @jugelizi
    @redeemer1001
    的确是我理解错了,当前还只是单文件的功能,多文件查询会考虑多线程查询的,谢谢指教
    12345tiger
        16
    12345tiger  
    OP
       2019-10-04 11:54:32 +08:00
    @noqwerty 谢谢推荐,endnote 的确能做到信息检索并 rename,但是需要按照 endnote 中的 group 进行分类,所有的 PDF 也会被 endnote 重新 copy 到指定目录。不知道你有没有体验过十几层的文件夹,数十个项目,数千篇文献( PDF )还有数百个 PPTword 和其他文件。。。endnote 的规则太过机械。所以迫不得已只好自己造轮子啊。。
    @diggerdu 感谢推荐,只浅尝辄止试过 Zotero,zotfile 其实满足了我 80 以上的需求,但跟其他软件一样会 copy 一份新的文件到其软件目录。发现网上有一个跟我一样的想法的需求(依靠 zotfile 老版本 bug 实现?)
    https://forums.zotero.org/discussion/68517/zotfile-renaming-linked-files-but-not-moving-them
    @AFuture 感谢推荐,but readcube 好像存在同样的问题,而且当年试用 readcube 直接把我电脑卡出屎了。。
    @pyder 非常非常感谢大佬的代码,只是我的需求有点复杂,而且不仅仅是 ACS 数据库的文章,其他 RSC wily 等文章没有这么直接的嵌入信息啊,大佬是化学的?
    pyder
        17
    pyder  
       2019-10-04 23:20:22 +08:00 via iPhone
    rsc,wiley 这些我测试过了,都是有的,只是 just accepted 和 asap 这些不行。
    pyder
        18
    pyder  
       2019-10-04 23:32:03 +08:00 via iPhone
    @12345tiger 我是做计算的,😄
    chensheng1
        19
    chensheng1  
       2019-10-04 23:36:24 +08:00 via iPad
    为什么不写个脚本迁移 endnote 重命名后的 pdf ?
    12345tiger
        20
    12345tiger  
    OP
       2019-10-05 12:47:11 +08:00 via Android
    @pyder 是我表述不严谨,rsc wiley 等大出版商的文献信息比较全,但还有些其他小出版商的杂志,或者上古时代的文献缺少内嵌的信息。想着一次全给解决了😄
    12345tiger
        21
    12345tiger  
    OP
       2019-10-05 12:47:44 +08:00 via Android
    @chensheng1 这样的话操作应该会更复杂不适合实际使用
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2791 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:27 · PVG 22:27 · LAX 06:27 · JFK 09:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.