Adobe InDesign 字体工具 项目半成品

hongwenjun 2012-01-16 12:32:43
Adobe InDesign 字体工具 项目半成品
http://srgb.googlecode.com/files/IDFontTool.7z


#include "idtxt.h"

int main(int argc, char* argv[])
{
const char* idFileName = "test.indd";
if (argc > 1)
idFileName = argv[1];

fstream idfile(idFileName, fstream::in);
size_t idf_size = get_file_Size(idfile); // 获得文件大小
char* buffile = new char[idf_size + 1]; // 文件读到缓冲
idfile.read(buffile, idf_size);

const char* flag_beg = "<stFnt:fontFileName>";
const char* flag_end = "</stFnt:fontFileName>";
map<string, size_t> map_fontFileName;
map<string, size_t>::iterator iter_Fnt;
// 搜索文件缓存,把fontFileName装载到容器 map_fontFileName
menSearch_FlagToMap(buffile, idf_size, flag_beg, flag_end, map_fontFileName);

flag_beg = "<stFnt:fontName>";
flag_end = "</stFnt:fontName>";
map<string, size_t> map_fontName;
// 搜索文件缓存,把fontName装载到容器 map_fontName
menSearch_FlagToMap(buffile, idf_size, flag_beg, flag_end, map_fontName);

map<string, string> map_SystemFonts;
map<string, string>::iterator iter_SFt;
if (LoadSystemFonts(map_SystemFonts))
;

/***************************** 测试调试代码块****************************/
if (1) {

iter_SFt = map_SystemFonts.begin();
while (iter_SFt != map_SystemFonts.end()) {
cout << iter_SFt->first << "\t" << iter_SFt->second << endl;
++iter_SFt;
}

iter_Fnt = map_fontName.begin();
while (iter_Fnt != map_fontName.end()) {
cout << iter_Fnt->first << "\t字体名\t" << iter_Fnt->second << endl;
++iter_Fnt;
}

iter_Fnt = map_fontFileName.begin();
while (iter_Fnt != map_fontFileName.end()) {
cout << iter_Fnt->first << "\t字体文件\t" << iter_Fnt->second << endl;
++iter_Fnt;
}

}

return 0;
}






#include "idtxt.h"

// 获得文件长度
size_t get_file_Size(fstream& file)
{
file.seekg(0, ios::end);
size_t length = file.tellg();
file.seekg(0, ios::beg);
return length;
}

// 内存匹配函数memfind
char* memfind(const char* buf, const char* tofind, size_t len)
{
size_t findlen = strlen(tofind);
if (findlen > len) {
return((char*)NULL);
}
if (len < 1) {
return((char*)buf);
}

{
const char* bufend = &buf[len - findlen + 1];
const char* c = buf;
for (; c < bufend; c++) {
if (*c == *tofind) { // first letter matches
if (!memcmp(c + 1, tofind + 1, findlen - 1)) { // found
return((char*)c);
}
}
}
}

return((char*)NULL);
}

// 内存搜索,提取标记之间字符,装载到字符串容器
bool menSearch_FlagToMap(const char* buffer, size_t count,
const char* flag_beg, const char* flag_end,
map<string, size_t> &flag_map)
{
const char* ps = buffer;
char* pch = NULL;
char* pch2 = NULL;
pch = memfind(ps, flag_beg , count);
if (pch == NULL) {
printf("警告: 内存缓冲区找不到 flag_beg\n");
return false;
}
while (pch != NULL) {
pch2 = memfind(pch, flag_end , 1024);
if (pch2 != NULL) {
string str(pch + strlen(flag_beg) , pch2);
{
// Utf-8 转 GBK string版本,按需求是否屏蔽改语句
ConvertUtf8ToGBK(str);
}
++flag_map[str]; // 装载到字符串容器
}
ps = pch + strlen(flag_beg);
pch = memfind(ps, flag_beg , count - (ps - buffer));
}
return true;
}

// Utf-8 转 GBK C风格字符串版本
char* ConvertUtf8ToGBK(char* strUtf8)
{
int len = MultiByteToWideChar(CP_UTF8, 0, strUtf8, -1, NULL, 0);
WCHAR* wszGBK = new WCHAR[len + 1];
memset(wszGBK, 0, len * 2 + 2);
MultiByteToWideChar(CP_UTF8, 0, strUtf8, -1, wszGBK, len);

len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);
char* szGBK = new char[len + 1];
memset(szGBK, 0, len + 1);
WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, szGBK, len, NULL, NULL);

strcpy(strUtf8 , szGBK);
delete[] szGBK;
delete[] wszGBK;
return strUtf8;
}
// Utf-8 转 GBK string版本包装C风格字符串版本
string& ConvertUtf8ToGBK(string& strUtf8)
{
char* psUTF8ToGBK = new char[strUtf8.size() + 1];
strcpy(psUTF8ToGBK, strUtf8.c_str());
strUtf8 = ConvertUtf8ToGBK(psUTF8ToGBK);
delete[] psUTF8ToGBK;
return strUtf8;
}


#define MAX_KEY_LENGTH 255
#define MAX_VALUE_NAME 1024
// 枚举搜索子键 名称和数值
void QuerySubKeyValues(HKEY hKey , map<string, string> &map_SystemFonts)
{

DWORD cValues; // number of values for key
// Get the class name and the value count. 获取类的名称和值数
DWORD retCode;
retCode = RegQueryInfoKey(hKey, NULL, NULL, NULL, // 只想获取 名称的计数,所以把其他的都NULL
NULL, NULL, NULL, &cValues, // 不知道会不会有大问题
NULL, NULL, NULL, NULL);

// Enumerate the key values. 枚举关键值
char tcKeyName[MAX_VALUE_NAME] = {}; // 注册表名称值
DWORD dwKeyNameLen = MAX_VALUE_NAME;
BYTE* pbbinKeyData = new BYTE[MAX_VALUE_NAME]; // 注册表数据值
DWORD dwKeyDataLength = MAX_VALUE_NAME;
if (cValues) {
// printf("Number of values: %ld\n", cValues);

for (size_t i = 0, retCode = ERROR_SUCCESS; i != cValues; i++) {
dwKeyNameLen = MAX_VALUE_NAME;
dwKeyDataLength = MAX_VALUE_NAME;

// 使用 RegEnumValue(hKey, dwIndex, tcKeyName, &dwKeyNameLen,
// 示例 NULL, &dwKeyType, pbbinKeyData, &dwKeyDataLength);
retCode = RegEnumValue(hKey, i, // 子键 和 索引
tcKeyName, &dwKeyNameLen, // 名称值 和 长度
NULL, NULL,
pbbinKeyData, &dwKeyDataLength); // 数值 和 长度

if (retCode == ERROR_SUCCESS) {
// printf("(%d)\t%s\t=\t%s\n", i + 1, tcKeyName , pbbinKeyData); // 调试显示
// 字库表装入容器
map_SystemFonts.insert(make_pair(string(tcKeyName),
string((char*)pbbinKeyData)));
}
}
}
delete[] pbbinKeyData;
}

// 加载系统字体表到字体容器
bool LoadSystemFonts(map<string, string> &map_SystemFonts)
{
// 根键、子键名称、和到子键的句柄
HKEY hRoot = HKEY_LOCAL_MACHINE;
const char* szSubKey = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts";
HKEY hKey;

// 打开指定子键,枚举搜索子键 名称和数值
if (RegOpenKeyEx(hRoot, szSubKey, 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
QuerySubKeyValues(hKey , map_SystemFonts); // 字库表装入容器
} else {
printf("警告: 加载系统字体表失败\n");
return false;
}


RegCloseKey(hKey);

return true;
}




...全文
320 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ToperRay 2012-02-21
  • 打赏
  • 举报
回复
hongwenjun 2012-01-18
  • 打赏
  • 举报
回复

命令行部分总算完成了 ,GCC4.6 和 VC2010编译器通过编译

main.cpp 只供阅读
#include "idtxt.h"

int main(int argc, char* argv[])
{
const char* idFileName = "test.indd";
if (argc > 1)
idFileName = argv[1];
const char* OutPath = ".\\Fonts";
if (argc > 2)
OutPath = argv[2];
CreateDirectory(OutPath, NULL);

fstream idfile(idFileName, fstream::in | fstream::binary);
size_t idf_size = get_file_Size(idfile); // 获得文件大小
char* buffile = new char[idf_size + 1]; // 文件读到缓冲
idfile.read(buffile, idf_size);

const char* flag_beg = "<stFnt:fontFileName>";
const char* flag_end = "</stFnt:fontFileName>";
map<string, size_t> map_fontFileName;
map<string, size_t>::iterator iter_Fnt;
// 搜索文件缓存,把fontFileName装载到容器 map_fontFileName
if (menSearch_FlagToMap(buffile, idf_size, flag_beg, flag_end, map_fontFileName))
;
else
cout << "InDesign文档.indd 做为参数,请确认文档是否存在!\n";

map<string, string> map_SystemFonts;
map<string, string>::iterator iter_SFt;
// 加载系统字体表到字体容器
if (LoadSystemFonts(map_SystemFonts))
;

vector<string> vec_fontFullPath;
vector<string>::iterator iter_Ffp;

// 文件字体文件和系统字体文件交集
iter_Fnt = map_fontFileName.begin();
while (iter_Fnt != map_fontFileName.end()) {
iter_SFt = map_SystemFonts.begin();
while (iter_SFt != map_SystemFonts.end()) {
if (iter_SFt->second.find(iter_Fnt->first) != string::npos) {
vec_fontFullPath.push_back(iter_SFt->second);
cout << iter_SFt->first << "\t\t" << iter_SFt->second << endl;
}
++iter_SFt;
}
++iter_Fnt;
}

// 获得系统字体目录的路径 windows\fonts
char SysFontS_Path[MAX_PATH];
char DstFontS_Path[MAX_PATH];
GetWindowsDirectory(SysFontS_Path, MAX_PATH);
strcat(SysFontS_Path, "\\Fonts\\");
SetConsoleColor(0xE); //亮黄
// vec_fontFullPath 系统字体目录的字体修复全路径,复制字体到相应目录
iter_Ffp = vec_fontFullPath.begin();
while (iter_Ffp != vec_fontFullPath.end()) {
if (iter_Ffp->find("\\") == string::npos)
*iter_Ffp = string(SysFontS_Path) + *iter_Ffp;

strcpy(DstFontS_Path, OutPath);
strcat(DstFontS_Path, "\\");
strcat(DstFontS_Path, GetFileBaseName(iter_Ffp->c_str()));
cout << *iter_Ffp << "\n--------------------------------------------------------------------> " << "复制";
CopyFile(iter_Ffp->c_str() , DstFontS_Path , TRUE);
cout << "完成\n";
iter_Ffp++;
}

SetConsoleColor(0xA); //亮绿
printf("\n打包 Adobe InDesign 文档中的字体工具\n"
"(C) 版权所有 2012.01 Hongwenjun (蘭公子)\n\n"
"Usage: %s <InDesign_Doc.indd> [SaveFontPath]\n"
"用 法: %s <InDesign文档.indd> [存放字体目录]\n", argv[0] , argv[0]);

// 没有找到的字体报告
if (map_fontFileName.size() != vec_fontFullPath.size()) {
stringstream oss;
iter_Ffp = vec_fontFullPath.begin();
while (iter_Ffp != vec_fontFullPath.end()) {
oss << *iter_Ffp++ << endl;
}
string FoundFontsName(oss.str());
SetConsoleColor(0xC); //高亮红
printf("\n********************************************************************************");
iter_Fnt = map_fontFileName.begin();
while (iter_Fnt != map_fontFileName.end()) {
if (FoundFontsName.find(iter_Fnt->first) == string::npos)
cout << iter_Fnt->first << "\a\t";
++iter_Fnt;
}
printf("\n\n以上字体没有找到文件,确认否安装到WINDOWS系统中\n"
"如果在C:\\Program Files\\Common Files\\Adobe\\Fonts中,为Adobe软件共用字体,不用复制\n");
SetConsoleColor(0x7); //恢复
}




if (1) {
flag_beg = "<stFnt:fontName>";
flag_end = "</stFnt:fontName>";
map<string, size_t> map_fontName;
// 搜索文件缓存,把fontName装载到容器 map_fontName
menSearch_FlagToMap(buffile, idf_size, flag_beg, flag_end, map_fontName);

cout << endl << idFileName << " 文档使用字体(英文名)的报告:" << endl ;
iter_Fnt = map_fontName.begin();
while (iter_Fnt != map_fontName.end())
cout << (iter_Fnt++)->first << "\t";

}

delete[] buffile;
return 0;
}

/***************************** 代码储备,不参与编译 ****************************/
#define CODE_STORE_NOT_COMPILE
#ifndef CODE_STORE_NOT_COMPILE




#endif // CODE_STORE_NOT_COMPILE


ryfdizuo 2012-01-18
  • 打赏
  • 举报
回复
用过indesign,lz是开发插件?
healer_kx 2012-01-18
  • 打赏
  • 举报
回复
我怎么看啊?太长了
healer_kx 2012-01-18
  • 打赏
  • 举报
回复
我也从楼主的例子中得知了C++的流的实现,对于WIndows和Linux还是有差别的,但是那段函数我就说不会有问题嘛。
healer_kx 2012-01-18
  • 打赏
  • 举报
回复
被我说中了,果然就是IO的问题。
EmbeddedLong 2012-01-18
  • 打赏
  • 举报
回复
可恶的360 我刚下载 没提示就给我删除了 NND
hongwenjun 2012-01-16
  • 打赏
  • 举报
回复
// 获得文件长度
size_t get_file_Size(std::fstream & file);

// Utf-8 转 GBK
char* ConvertUtf8ToGBK(char* strUtf8);
// Utf-8 转 GBK string版本包装C风格字符串版本
string& ConvertUtf8ToGBK(string& strUtf8);

// 内存匹配函数memfind
char *memfind(const char *buf,const char *tofind,size_t len);

// 内存搜索,提取标记之间字符,装载到字符串容器
bool menSearch_FlagToMap(const char* buffer, size_t count,
const char* flag_beg, const char* flag_end,
map<string, size_t> &flag_map);

// 枚举搜索子键 名称和数值
void QuerySubKeyValues(HKEY hKey , map<string, string> &map_SystemFonts);

// 加载系统字体表到字体容器
bool LoadSystemFonts(map<string, string> &map_SystemFonts);

让专业人员批评了 似水無痕 。。。这函数的命名风格好乱

ConvertUtf8ToGBK 从别人的 MFC代码改
QuerySubKeyValues 从微软MSDN的代码改的
memfind GPL,通过google 搜索
menSearch_FlagToMap 等其他是自己写的
lee_鹿游原 2012-01-16
  • 打赏
  • 举报
回复
必须顶~
hongwenjun 2012-01-16
  • 打赏
  • 举报
回复

360安全卫士说是木马

#include <iostream>
#include <stdio.h>

using namespace std;

int main()
{
cout << "本程序的作者刚刚做出了一个艰难的决定:本程序和360软件不兼容。卸载360运行本程序输入y;不卸载360退出本程序输入n" << endl;
char yn;
cin >> yn;
if ('y' != yn) return -1;

char* p = "360安全卫士";
puts(p);
return 0;

}
  • 打赏
  • 举报
回复
i945800687 2012-01-16
  • 打赏
  • 举报
回复
顶!
楼主果断V587不谈!

小弟还在打C语言基础中~~~
赵4老师 2012-01-16
  • 打赏
  • 举报
回复
支持楼主!
拥有博采众家之长的本领还是很厉害的。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧