[求思路]求助 PDF 重命名功能实现的思路与优化 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
12345tiger
V2EX    Java

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

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

    背景:非计算机专业的

    • 我想做一款对 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 可以直接重命名文件
    td width="10" valign="top">
    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     Solana     2461 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 10:50 PVG 18:50 LAX 02:50 JFK 05:50
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86