« 2007年10月7日 - 2007年10月13日 | トップページ | 2008年2月17日 - 2008年2月23日 »

2007.10.26

pdftkで日本語ファイルを使ってみる

pdftkつかうとWindows上でコマンドラインからpdfファイルを連結できる。
まるごとPDFあたりでもできるけど,ファイル名の並び替えが面倒なんで,コマンドラインからできるのがほしかった。
でも,日本語ファイル名が通らない。
バッチ内に,ナンバリングしてコピーして,使ってたけど,う~んやっぱり面倒。
ってことで,パッチを当てることを考える。

どうやら,JvNewStringLatin1の文字コード変換でだめらしい。
ならばってことで,SJIS(CP932)からUTF-8にiconvしてやって,JvNewStringUTF8する関数(JvNewStringSJIS)にかえてやる。

というわけで,

pdftk.hにて,JvNewStringLatin1をJvNewStringSJIS(SJIS→UTF-8)に変換する。

#define JvNewStringLatin1       JvNewStringSJIS
jstring JvNewStringSJIS(const char* bytes);

pdftk.ccの最後のほうに,以下を追加する。

#include "iconv.h"
jstring JvNewStringSJIS(const char* bytes)
{
const char* fromcode = "CP932";
const char* tocode = "UTF-8";
static iconv_t cd = iconv_open(tocode,fromcode);
if(cd==0){
return NULL;
}
const char* src_ptr = bytes;
size_t src_size = strlen(bytes);
string utf8;
while(true){
const int BUF_SIZE = 64;
char dst[BUF_SIZE];
size_t dst_size = BUF_SIZE;
char* dst_ptr = dst;
int rc = iconv(cd,&src_ptr,&src_size,&dst_ptr,&dst_size);
if(rc==0){
utf8.append(dst,dst_ptr);
break;
}
else if(rc==-1 && errno==E2BIG){
utf8.append(dst,dst_ptr);
}
else if(rc==0){
return NULL;
}
}
return JvNewStringUTF(utf8.c_str());
}

| | コメント (1) | トラックバック (0)

« 2007年10月7日 - 2007年10月13日 | トップページ | 2008年2月17日 - 2008年2月23日 »