首页
社区
课程
招聘
[原创]放个Pdf重命名小工具大家用
发表于: 2009-9-24 11:31 19156

[原创]放个Pdf重命名小工具大家用

2009-9-24 11:31
19156

To R大 and all:

昨天下了好多R大分享的论文, 打算帮忙改名上传一下的, 因为太多, 感觉手工一个一个去重命名太麻烦.
于是写了个小工具 RnPdf, 用于自动从pdf文档中提取出标题, 然后重命名.

写之前在网上下载了一个工具, 试了一下, 那个工具能重命名的pdf文档很少.
还有一些其他格式的pdf文档它不能重命名 .
这是因为pdf格式本身就有不同的地方 .

我这个工具也不能保证对所有格式pdf文档重命名, 不过效果稍微好于之前网上的那个.

用法:
把待重命名的pdf文档的目录放到一个不包含空格的路径下.
将rnpdf.exe和1.bat放到同目录下. 运行1.bat即可.


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 7
支持
分享
最新回复 (21)
雪    币: 232
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
LZ速度真快

试了下感觉不错,确实如 rockinuk 版主说的有些文件会 [e] rename() error ,比如遇到标题换行、特殊字符(比如最后的星号)、冒号,直接送 MoveFileA 肯定会失败。
附件中有三个不能修改的例子
上传的附件:
2009-9-24 11:39
0
雪    币: 2096
活跃值: (100)
能力值: (RANK:420 )
在线值:
发帖
回帖
粉丝
3
謝謝 jackozoo 版主的熱情奉獻。
我先 download 試試看。
2009-9-24 11:46
0
雪    币: 2096
活跃值: (100)
能力值: (RANK:420 )
在线值:
发帖
回帖
粉丝
4
About this tool:
1) 這個 tools 的確有效,不過,有些 filename 的前頭會突然加上 "(" 右括號.
2) 有些論文的 title,或有其它特殊符號,那些 特殊字元,大部份無法當做 filename 的命名規則,譬如 "%, /, 等" ,遇到這些特殊字元,建議可以用 "-" 符號來取代。
等 Jackozoo 版主有空,再改良看看。
2009-9-24 12:01
0
雪    币: 433
活跃值: (1870)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
5
Support!有时太多文件需重命名,用工具确实方便多了
2009-9-24 12:54
0
雪    币: 1450
活跃值: (35)
能力值: (RANK:680 )
在线值:
发帖
回帖
粉丝
6
[QUOTE=deryope;691203]LZ速度真快

试了下感觉不错,确实如 rockinuk 版主说的有些文件会 [e] rename() error ,比如遇到标题换行、特殊字符(比如最后的星号)、冒号,直接送 MoveFileA 肯定会失败。
附件中有三个不能修改的例子[/QUOTE]

某些格式的pdf是会提取失败的, 目前还没做到对所有pdf的Title进行提取 .
2009-9-24 13:31
0
雪    币: 2096
活跃值: (100)
能力值: (RANK:420 )
在线值:
发帖
回帖
粉丝
7
有空改寫看看囉,這是個造福人群的開始。
2009-9-24 14:05
0
雪    币: 21
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
建议开源。更优化。
2009-9-24 15:32
0
雪    币: 1450
活跃值: (35)
能力值: (RANK:680 )
在线值:
发帖
回帖
粉丝
9
这么小的程序还要开源
拖IDA里, 都一目了然了.

好吧, 代码见下一楼:
2009-9-24 17:06
0
雪    币: 1450
活跃值: (35)
能力值: (RANK:680 )
在线值:
发帖
回帖
粉丝
10
代码很烂. 没考虑搜索算法效率.
既然要求开源, 被误导了可不要怪我.

pdf标题提取思路: (我自己统计出来的规律)
搜索第一个"/Count", 再从该位置搜索第一个"/Title", 后面()中的内容即为Title.

垃圾代码:
// RnPdf.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdlib.h>
#include <windows.h>


#define	KEY1	"/Count"
#define KEY2	"/Title"

void show_usage(char *strPath)
{
	printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
	printf("------------Pdf Renamer V1.0 By[jackozoo]------------\n");
	printf("[+] Usage: %s <filename> \n",strPath);
	printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
	_exit(1);
}

void fuck_exception()
{
	printf("[e] Exception occor ... quit!");
	_exit(1);
}

int search_bytes(BYTE *lpData,DWORD length, int offset,char * key)
{
	int i;
	for (i=0;i<length-offset;i++)
	{
		if (0 == strncmp((const char*)(lpData+offset+i),key,6)) //6: strlen  /Count
		{
			return i;
		}
	}
	return -1;
}

char *get_title(BYTE * lpData, DWORD length)
{
	char *szTitle = new char[255];
	memset(szTitle,0,255);

	int nPosCount = search_bytes(lpData,length,0,KEY1);
	int nPosTitle = search_bytes(lpData,length-nPosCount,nPosCount,KEY2);

	char *pC = (char*)(lpData + nPosCount + nPosTitle + 7); //7: /Title(
	WORD flagUnicode = *(WORD*)pC;
	int i,j;

	if (0xfffe == flagUnicode) //UNICODE
	{
		pC += 2;
		for (i=0,j=0;0x29 != *(pC+i);i++,j++)
		{
			if (0 == *(pC+i))
			{
				j--;
				continue;
			}
			szTitle[j] = *(pC+i);
		}
	
	}
	else //ANSI
	{
		for (i=0;0x29 != *(pC+i);i++)
		{
			szTitle[i] = *(pC+i);
		}
	}
	return szTitle;
	
}

char* get_dir(char *path)
{
	int nResult;
	char *szDir = new char[MAX_PATH];
	memset(szDir,0,MAX_PATH);
	for(int i=0;i<strlen(path);i++)
	{
		if ('\\' == path[i])
		{
			nResult = i+1;
		}
	}
	strncpy(szDir,path,nResult);
	return szDir;
}

void _tmain(int argc, _TCHAR* argv[])
{
	__asm
	{
		push offset fuck_exception
		push dword ptr fs:[0]
		mov dword ptr fs:[0], esp 
	}
	if (2 != argc)
	{
		show_usage(argv[0]);
	}

	//set current dir
	char *szDir = get_dir(argv[0]);
	SetCurrentDirectory(szDir);

	
	FILE * fp = NULL;
	if (NULL == (fp = fopen(argv[1],"rb")))
	{
		printf("[e] Open file error.\n");
		return;
	}
	fseek(fp,0,SEEK_END);
	DWORD filesize = ftell(fp);
	BYTE * pMemo = new BYTE[filesize+9];
	memset(pMemo,0,filesize+9);

	fseek(fp,0,SEEK_SET);
	fread(pMemo,filesize,1,fp);
	fclose(fp);

	char * pdfTitle = get_title(pMemo,filesize);
	strcat(pdfTitle,".pdf");

	printf("[+] Original title: %s \n",argv[1]);

	int rResult = rename(argv[1],pdfTitle);
	if (0 != rResult)
	{
		printf("[e] Parse pdf format title failed.\n\n");
	}
	else
	{
		printf("[+] New title: %s \n\n",pdfTitle);
	}

	delete []pMemo;
	delete []szDir;
	delete []pdfTitle;
	__asm
	{
		pop dword ptr fs:[0]
		add esp, 4
	}
}


2009-9-24 17:10
0
雪    币: 21
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
我最近一直想采用pdf.ocx,通过读取pdf文件属性,然后再将其中的pdf中的一项值,替换其 title。
个人觉得这是一个不错的思路,针对rock上传的文件中,大部分都有这一属性。在不打开文件的情况下就可以更名了,速度很快。谁感兴趣的话可以探讨。
2009-9-24 22:56
0
雪    币: 21
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
感谢jackozoo的代码,不过还没来得及先看。
2009-9-24 22:56
0
雪    币: 2096
活跃值: (100)
能力值: (RANK:420 )
在线值:
发帖
回帖
粉丝
13
Jackozoo 版主滿足一鴻大大 8 樓的要求,那優化就期待您大展身手囉。
2009-9-25 00:33
0
雪    币: 84
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
代码中还有部分汇编代码……呵呵,强大
2009-9-26 18:44
0
雪    币: 21
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
void _tmain(int argc, _TCHAR* argv[])
{
  __asm
  {
    push offset fuck_exception
    push dword ptr fs:[0]
    mov dword ptr fs:[0], esp
  }
  if (2 != argc)
  {
    show_usage(argv[0]);
  }
函数作用是什么呢?汇编知识缺乏啊!lz有空解释一下吧。
2009-9-27 10:04
0
雪    币: 232
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
[QUOTE=一鸿;692665]void _tmain(int argc, _TCHAR* argv[])
{
  __asm
  {
    push offset fuck_exception
    push dword ptr fs:[0]
    mov dword ptr fs:[0], esp
  }...[/QUOTE]

try {
  ...
}catch {
}
2009-9-27 10:12
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
很实用的小东西呢..
下来研究研究
2009-9-27 13:24
0
雪    币: 55
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
强大的,膜拜。。。。。
2009-12-19 11:16
0
雪    币: 67
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
fuck_exception
感觉代码中出现这样的字眼有点不雅。
2010-1-30 00:11
0
雪    币: 67
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
参考:http://bbs.pediy.com/showthread.php?p=743379
其实如果只是提取/Title里的信息的话,可以参考上面的介绍的pdf格式提取。我看了一下,发现很多pdf的/Title属性都是不正确的,或者为空,或者与文章主题无关。
反正还是挺麻烦的。如果提取第一个object的话,对于有些pdf来说可能有页头信息,第一个对象未必是标题,总之挺麻烦的。
2010-1-30 01:36
0
雪    币: 1450
活跃值: (35)
能力值: (RANK:680 )
在线值:
发帖
回帖
粉丝
21
的确很麻烦, 有的pdf文档根本都没标题.
2010-1-30 12:53
0
雪    币: 2096
活跃值: (100)
能力值: (RANK:420 )
在线值:
发帖
回帖
粉丝
22
2010-1-30 13:35
0
游客
登录 | 注册 方可回帖
返回
//