2008年2月9日 星期六
wxWidgets和MFC混合编程
很多文章都讲到了将MFC程序迁移到wxWidgets上(首先要读的也许是IBM developerWorks上这篇 将MFC应用程序移植到Linux),但对于一个比较大的程序,要一下子完成移植也显得有些艰巨。所以我在琢磨有没有可能在一个程序中同时使用这两种技术(同时我看中了wxWidgets上使用wxPython时给应用程序带来的可扩展性,有兴趣的可以查看wxPython中的这个embed示例)。
wxWidgets的代码库中倒是有一个wx和MFC混合的例子(发布出来的2.6的代码包里面好像没有,2.8才有),它演示了如何在一个程序中分别有wx和MFC的窗口(分属于wxFrame和CFrameWnd类)。
但它没有解答的问题是:怎样将一个wx的控件放到MFC上面去,或者反过来。
在这个例子中,如果你想将wx的窗口作为应用程序开始时显示的窗口,就需要这个:
wxTreeCtrl * wxtree = new wxTreeCtrl(.....)
CDummyWindow *dummy = new CDummyWindow((HWND)wxtree->GetHWND());
dummy->SetParent(this);
我们需要其实不要CDummyWindow也没有问题,只要这样:
wxTreeCtrl * wxtree = new wxTreeCtrl(....)
::SetParent(HWND)wxtree->GetHWND(), m_hWnd);
wxWidgets的代码库中倒是有一个wx和MFC混合的例子(发布出来的2.6的代码包里面好像没有,2.8才有),它演示了如何在一个程序中分别有wx和MFC的窗口(分属于wxFrame和CFrameWnd类)。
但它没有解答的问题是:怎样将一个wx的控件放到MFC上面去,或者反过来。
在这个例子中,如果你想将wx的窗口作为应用程序开始时显示的窗口,就需要这个:
m_pMainWnd = new CDummyWindow((HWND) wxTheApp->GetTopWindow()->GetHWND()); 如果你了解MFC对窗口的封装,就知道它基本没有自己的东西,CWnd这些类基本上没有自己的数据成员,基本上都是调用Windows API(只是把那些API中的HWND参数给省略了。所以任何一个Windows桌面上的窗口,要体现为一个CWnd类对象是很容易的,只需要调用CWnd::FromHwnd()或者CWnd::Attach()就可以了,示例中的CDummyWindow就是这样做的。基于这样的思路,我们很容易把其它的wx控件通过CDummyWindow放到MFC控件中去。wxTreeCtrl * wxtree = new wxTreeCtrl(.....)
CDummyWindow *dummy = new CDummyWindow((HWND)wxtree->GetHWND());
dummy->SetParent(this);
我们需要其实不要CDummyWindow也没有问题,只要这样:
wxTreeCtrl * wxtree = new wxTreeCtrl(....)
::SetParent(HWND)wxtree->GetHWND(), m_hWnd);
但这里有另外一个问题: 创建一个wxWindow对象时是必须给出一个parent的,而这个parent又必
必须是wxWindow类型(除非为NULL)。
反过来要将MFC的东西放到wx上面就可以那么好运了,虽然也可以用上面这一招将MFC的控件显示出来,
但这些控件低于wx来说是透明的,你没法利用到wxSplitterWindow的分割功能,没法利用上各种layout manager/sizer。
在wxWidgets For MFC Programmers(from wxWidgets Wiki)中讲述了如何将一个CWnd转换为wxWindow对象:
wxWindow * win = new wxWindow();
win->SetHWND((WXHWND)hWnd);
win->AdoptAttributesFromHWND();
win->Reparent(wxGetApp().GetTopWindow());
2008年2月8日 星期五
终于将blog迁移完成了
从去年初开始将blog迁移到Blogger上,直到今天,才算终于完成了。
我原来的blog在Linux伊甸园上(巴蛮子的新破茅屋),开始有迁移的想法是在去年初,主要的原因是Linux伊甸园提供的Blog服务经常当机,并且每次出了故障之后,总会有一些文章丢失(这几个月陆续按以前的一些本地“备份”来重新发帖,才发现差不多丢了1/3)。
但一直也不直到迁移到哪里去好,试过blogbus, CSDN, chinaunix,最后基本上觉得Blogger功能上比较适合我这Blog的风格,而且Blogger提供的版面编辑功能还是挺好使的。
但中间又犹豫、反复,一方面因为国内常常无法访问blogspot.com,另一方面otto老大又热情地邀请我回去,我也在试用linuxeden
但最终Blogger的"自定义发布位置"这一功能让我觉得还是采用Blogger了:我可以在其它地方申请一个网站,然后采用ftp/sftp发布方式,将所有文章发布到这里(目前的镜像是 http://bamanzi.inlsd.org/blog ),这样一方面可以解决blogspot.com无法访问的问题,另一方面我可以通过ftp将所有文章备份下来。
不过搬迁过来,文章不会在其它地方出现,访问的人也少了。反正这一年我写得也少了,凑合着过吧。
我原来的blog在Linux伊甸园上(巴蛮子的新破茅屋),开始有迁移的想法是在去年初,主要的原因是Linux伊甸园提供的Blog服务经常当机,并且每次出了故障之后,总会有一些文章丢失(这几个月陆续按以前的一些本地“备份”来重新发帖,才发现差不多丢了1/3)。
但一直也不直到迁移到哪里去好,试过blogbus, CSDN, chinaunix,最后基本上觉得Blogger功能上比较适合我这Blog的风格,而且Blogger提供的版面编辑功能还是挺好使的。
但中间又犹豫、反复,一方面因为国内常常无法访问blogspot.com,另一方面otto老大又热情地邀请我回去,我也在试用linuxeden
但最终Blogger的"自定义发布位置"这一功能让我觉得还是采用Blogger了:我可以在其它地方申请一个网站,然后采用ftp/sftp发布方式,将所有文章发布到这里(目前的镜像是 http://bamanzi.inlsd.org/blog ),这样一方面可以解决blogspot.com无法访问的问题,另一方面我可以通过ftp将所有文章备份下来。
不过搬迁过来,文章不会在其它地方出现,访问的人也少了。反正这一年我写得也少了,凑合着过吧。
标签: blogger
2008年1月29日 星期二
《X档案》和《老友记》剧本CHM
在box.net上申请了一个账号,将《X档案》和《老友记》剧本CHM传了上去。
http://public.box.net/bamanzi
这个账号本来是为了上传ScrapBook中保存的文摘才申请的——我在ScrapBook的网站上看见了ScrapBox.net这个扩展的扩展。
网页速度有点慢,但上传、下载还不是太差。
以后一些非技术的东西或者体积比较大点的东西就传到这里吧。技术方面的东西还是在 http://bamanzi.inlsd.org 上
http://public.box.net/bamanzi
这个账号本来是为了上传ScrapBook中保存的文摘才申请的——我在ScrapBook的网站上看见了ScrapBox.net这个扩展的扩展。
网页速度有点慢,但上传、下载还不是太差。
以后一些非技术的东西或者体积比较大点的东西就传到这里吧。技术方面的东西还是在 http://bamanzi.inlsd.org 上
2008年1月24日 星期四
pidgin: 让MSN支持发送自定义表情的补丁(附win32版本)
在Planet Debian TW上看见的Jesse提供了一个pidgin补丁版本(Debian sid), 其中MSN协议可以发送自定义表情图标了(原来只能接收),补丁来自http://developer.pidgin.im/ticket/1187。
向他询问了一下之后,我编译了一个win32版本:
http://bamanzi.inlsd.org/gnuwin32/pi...-win32.tar.bz2
需要先安装官方的2.3.1
先在主窗口"工具- Smiley"里面配置自定义表情,然后(目前好像得先重启pidgin)就可以在MSN的聊天窗口里使用这些表情了。
向他询问了一下之后,我编译了一个win32版本:
http://bamanzi.inlsd.org/gnuwin32/pi...-win32.tar.bz2
需要先安装官方的2.3.1
先在主窗口"工具- Smiley"里面配置自定义表情,然后(目前好像得先重启pidgin)就可以在MSN的聊天窗口里使用这些表情了。
2008年1月17日 星期四
pidgin飞信插件的win32版本
感谢gradetwo昨天放出了pidgin上飞信插件的源代码,俺今晚有空,编译了一个win32版本。
pidgin-fetion-0.96-win32.tar.bz2
(可用于pidgin-2.3.1,解压后将libfetion.dll放到x:\Program Files\Pidgin\plugins\下,重启pidgin即可)
代码只需要做一点小修改: fetion-0.96-win32.patch
pidgin-fetion-0.96-win32.tar.bz2
(可用于pidgin-2.3.1,解压后将libfetion.dll放到x:\Program Files\Pidgin\plugins\下,重启pidgin即可)
代码只需要做一点小修改: fetion-0.96-win32.patch

编译方法:
- 先按pidgin网站的win32版本编译 说明编译pidgin. 注意以下几点:
- 并不一定需要安装cygwin,cygwin安装起来比较麻烦。其实可以从tcl网站下载一个msys + mingw就可以了;
- 主要w32api版本要在3.9以上。老版本在编译pidgin\win32\gtkdocklet-win32.c时会报告BITMAPV5HEADER没有定义;
- 如果没有安装perl和tcl,不一定要按网站上说的那样去下载安装,直接修改libpurple\\plugins\Makefile.mingw和pidgin\plugins\Makefile.mingw,注释掉相关行就行了
- 在libpurple下解压fetion-0.96的源代码(即存在pidgin-2.3.1/libpurple/fetion目录)
- 打上补丁fetion-0.96-win32.patch
- 执行make -f Makefile.mingw,编译得到libfetion.dll
2008年1月12日 星期六
多媒体和即时通讯方面的几个新玩意
- 这几天发现了多媒体和即时通讯(这两类也算网民们用电脑最普遍的用途吧)方面的几个新玩意:
- 网络电视GMLive (图,开发团队blog,使用说明)
- 目前支持MMS, sopcast, nslive等几种流媒体,UI还比较简单
- 网络视频nslive (LinuxToy上的介绍,图, 作者的Blog, 安装方法说明)
- 上面提到过的一种流媒体。支持可用性上做的不太好,那个安装说明也够难找的。
- Flash Player 9.0 (Debian包)
- 新版本支持Linux下的全屏了(并且支持硬件缩放hardware scaling)
- Audacious
- 喜欢Winamp/XMMS的可以用这个了( XMMS -> BMP -> Audacious,功能界面都差不多,都可以用winamp的skin;BMPx和XMMS2却是另外一条路了)。至于功能方面,id3 tag的乱码还是避免不了的,除非自己改代码;另外我现在看重网络音频的支持了(比如电台或者last.fm),很多时候懒得自己去下载mp3文件。
- 飞信的pigdin插件 (可以放到$HOME/.purple/plugins/或者/usr/lib/purple-2)
- 当然是第三方开发的。目前有基本功能:对聊或者发短信。最近几天作者gradetwo改 进很频繁,代码还没有放出来。我已经迫不及待要编译win32版本了:在Windows上时如果MSN、QQ、Google Talk、飞信、V网伴侣这些都打开,机器都没法玩了。也不知道现在这些软件怎么搞的,为了界面漂亮一点点,都要拼图片来做,搞得这些软件好用内存相当严 重。还是用pidgin一统天下好。
- MusicTracker
- A Pidgin 'now playing' plugin to advertise the songs you are listening to in your status message.
2008年1月9日 星期三
做了一次系统升级
节前在Debian Package of the Day上看到debfoster的介绍,说是比deborphan可以更进一步清理系统不必要的包,就拉下来玩玩,没想到用它删了一些包之后,使用GNOME时系统老是僵死,除了鼠标箭头,其它啥反应没有(包括Ctl-Alt-Backspace),只能按电源键。
折腾了几日不见起色,干脆就apt-get dist-upgrade再apt-get upgrade了,反正有近半年没做大面积更新了。这次下载了1000多个包,530多M,可折腾了些时间。
结果如下:
折腾了几日不见起色,干脆就apt-get dist-upgrade再apt-get upgrade了,反正有近半年没做大面积更新了。这次下载了1000多个包,530多M,可折腾了些时间。
结果如下:
- 当然,系统不死机了;
- GNOME升级到了2.20,没留意到什么大的变化,倒是首选项精简了许多。另外lunar-applet不能用了,回头重新编译一下试试;
- totem-gstreamer和totem-xine现在可以同时安装了,依靠Debian alternatives连接到/usr/bin/totem (不过我还是不知道gstreamer版本有什么优点,它好像很多格式都不支持)
- 一直在用的小企鹅(fcitx)不好使了,输入条开始可看到,但一开始敲字符就死了。只得切换到scim去;
- 装了个以前在cygwin下试玩过的tilda,感觉用热键呼出比切换到Gnome Terminal方便
- 顺便从Debian multimedia (镜像: http://update.inlsd.org/debian-multimedia/ ) 升级了flash-player(可从这里手工下载安装)。现在可以全屏了,爽。但设置界面还是乱码
- pidgin升级到了2.3.1,没见到明显的改进,反而QQ群功能出现问题:名字都显示成"(NULL)",而且几个"(NULL)"群也区分不开
2007年12月28日 星期五
对字符集和编码的一些错误认识
字符集和编码一直很头疼的一块,最近为了搞培训,研究了一下,发现以前确实有很多不明白甚至是错误的认识:
- ISO-8859-1 .. ISO-8859-16 这些都是西欧各国用的字符集,主要的差别在与128-255之间各自代表的字符不同;
- 仍然不明白为啥GB2312, Big5这些就算MBCS,而同样采用多字节编码的Unicode却不算
- GBK应该是GB2312的超集,向下兼容GB2312的,记得以前谁跟我说不是,我迷惑了好一阵;
- 很 多编辑器说可以支持"Unicode编码",并且一些软件说"Unicode"就是两字节编码,这都是基于Unicode 4.0之前的认识。在那之前,Unicode跟GB2312这样的名称一样,即是字符集(charset)名称又是编码(encoding)名称, Unicode字符均是两个字节。但从Unicode 4.0开始,它已经不只65536个字符了,Unicode只是一个字符集名称,而UCS-2, UCS-4,UTF-8, UTF-16, UTF-32这些才是编码名称(当然,历史包袱总是存在的);
- UCS-2与UTF-16是不一样的,UCS-2固定采用两个字节,它不能表达Unicode 4.0之后增补的字符(当然,那些字符很生僻),而UTF-16里面每个字符可能是2或4个字符组成;
- UTF-8
- 从新的理论上而言,UTF-8应该是1-6个字符不等,但目前应该是1-3个字符就可以表达已有的字符了;
- UTF-8的优点
- 如果原有数据大都采用ASCII表达,那么这些数据不用转换
- 如果系统采用ASCII可以表达大多数数据,那么相对UCS-2,UTF-16这些节省空间;
- 编码中字符边界很容易找到:以0开头的字节肯定是ASCII字符,最高位以11开头的字节肯定是字符的开头字节,以10开头的字节肯定是字符的后续字节;
- 容错性强一些,偶尔一两个错误不会影响后面,原因同上(想咱们都碰到过GB2312/Big5的半个汉字问题带来的乱码问题吧)
- 按字节流读取,不用考虑大端(big endian)/小端(little endian)问题
- 字符串中不会出现0x00这样的字节(而UCS-2这些会),这样char *这样的方式表达缓冲区时不太容易导致错误
- UTF-8的缺点
- 对于非ASCII字符,相对以前存储空间增加了,比如非英语的西欧字符集现在都需要两个字节了,而中文等很多都需要三个字节了;
- 计算字符串长度比较麻烦,只能逐个统计;
- 综上,现在很多系统内部处理采用UCS-2,只在存储和数据交换中采用UTF-8
- Java以前内部全部采用Unicode(其实是UCS-2)来处理字符串,但Unicode 4.0以上的那些字符它不能处理。在Java 5.0中加入了一些奇怪的机制来解决这个问题;
- Python也不能同时支持UCS-2和UCS-4,只是可以在编译时挑选(--enable-unicode=ucs2和--enable-unicode=ucs4),看sys.maxunicode是否大于65535就知道是否是UCS-4了。我看Windows上的预编译版本是UCS-2(python2.5)的,而Linux上是UCS-4(Debian testing, python 2.4)。注意这两种版本在二进制上是不兼容的。
- Joel Spolsky: The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
- 每一个软件开发人员绝对必须掌握的关于 Unicode 和字符集的最基础的知识(上文的简体翻译,居然木野狐翻译的,好久不见他了)
- 对字符编码与Unicode,ISO 10646,UCS,UTF8,UTF16,GBK,GB2312的理解
2007年12月27日 星期四
Firefox 3上使用旧扩展
目前还有很多插件不支持Firefox 3,如果你实在想用,可以修改下面两个设置:
user_pref("extensions.checkCompatibility", false);
user_pref("extensions.checkUpdateSecurity", false);
这样Firefox升级或者安装新扩展时就不会检查兼容性和签名了(检查扩展的签名是Fx3新增的功能)。不过扩展不一定能正常工作,比如Google工具栏就不成。
可以将这两行加在profile下prefs.js(请先关闭Firefox),也可以在about:config中手工增加这两项。
user_pref("extensions.checkCompatibility", false);
user_pref("extensions.checkUpdateSecurity", false);
这样Firefox升级或者安装新扩展时就不会检查兼容性和签名了(检查扩展的签名是Fx3新增的功能)。不过扩展不一定能正常工作,比如Google工具栏就不成。
可以将这两行加在profile下prefs.js(请先关闭Firefox),也可以在about:config中手工增加这两项。
标签: firefox
2007年12月25日 星期二
Firefox 3上如何添加 del.icio.us 书签
以前我为了几台机器、几个操作系统上书签的同步烦心不已,即使安装了Foxmarks同步器还得留神用哪个覆盖哪个,而Google工具栏提供的书签功能也不太好用。后来开始使用del.icio.us的书签服务,加上del.icio.us Bookmarks扩展,终于很满意了。
但Firefox 3出来了beta 1之后,我就基本上开始用新版本了,毕竟很多功能很不错,内存占用比原来少了(也许是目前安装的扩展还比较少),再说反正以后要切的。不过目前还是两个版本都用。
但目前很多扩展都还不支持Firefox 3(而且Firefox 3开始要求对扩展进行签名了,不能象以前那样简单地下载xpi包后自己来改改版本匹配申明就说不定可以使用),有些扩展倒也罢了,但现在del.icio.us 似乎变成必须了 :-)
查看/搜索书签的功能倒简单,只要访问 http://del.icio.us/home 就可以了,网页上也有输入tag进行搜索的功能。
主要的问题是没法方便地添加书签了,以前只要在网上逛,看到不错的地方,按一下Ctrl+D或者点击工具栏的TAG按钮,就有一个对话框出来,当前网页的标题、其他人的tag都显示出来了,并且当前网页选中的文字还可以自动放入书签的说明栏。

在del.icio.us的帮助中找了一下,发现可以用如下办法: 在书签栏上添加一个书签,其URL是:
javascript:location.href='http://del.icio.us/post?v=4;url='+encodeURIComponent(location.href)+';title='+encodeURIComponent(document.title)
(可以拖这个链接到书签栏,然后自己改名字)
详细的说明在这里: bookmarklet buttons for any browser
但“当前网页选中的文字还可以自动放入书签的说明栏”这一点还不能做到,不太爽。我试验了一下,发现多传一个notes参数就可以了: 在上述URL后面再添加一节:
+';notes='+encodeURIComponent(window.getSelection().toString())
结论: 拖下面这个链接到书签栏就可以了:
post to del.icio.us
但Firefox 3出来了beta 1之后,我就基本上开始用新版本了,毕竟很多功能很不错,内存占用比原来少了(也许是目前安装的扩展还比较少),再说反正以后要切的。不过目前还是两个版本都用。
但目前很多扩展都还不支持Firefox 3(而且Firefox 3开始要求对扩展进行签名了,不能象以前那样简单地下载xpi包后自己来改改版本匹配申明就说不定可以使用),有些扩展倒也罢了,但现在del.icio.us 似乎变成必须了 :-)
查看/搜索书签的功能倒简单,只要访问 http://del.icio.us/home 就可以了,网页上也有输入tag进行搜索的功能。
主要的问题是没法方便地添加书签了,以前只要在网上逛,看到不错的地方,按一下Ctrl+D或者点击工具栏的TAG按钮,就有一个对话框出来,当前网页的标题、其他人的tag都显示出来了,并且当前网页选中的文字还可以自动放入书签的说明栏。

在del.icio.us的帮助中找了一下,发现可以用如下办法: 在书签栏上添加一个书签,其URL是:
javascript:location.href='http://del.icio.us/post?v=4;url='+encodeURIComponent(location.href)+';title='+encodeURIComponent(document.title)
(可以拖这个链接到书签栏,然后自己改名字)
详细的说明在这里: bookmarklet buttons for any browser
但“当前网页选中的文字还可以自动放入书签的说明栏”这一点还不能做到,不太爽。我试验了一下,发现多传一个notes参数就可以了: 在上述URL后面再添加一节:
+';notes='+encodeURIComponent(window.getSelection().toString())
结论: 拖下面这个链接到书签栏就可以了:
post to del.icio.us
标签: firefox, javascript
2007年12月20日 星期四
找不到python24_d.lib怎么办(VC上编译wxPython)
编译一个wxWidgets内嵌wxPython的示例工程时,编译器说需要python24_d.lib,因为懒得自己重新编译一遍python,在网上找到一个办法: 修改Python\include里面的python.h,把静态库都改成同一个(即将python24_d.lib改成python24.lib),其它.h文件也搜索Py_DEBUG,将两种模式下的处理搞成一致(比如不采用不同的引用计数函数),然后就OK了。
---------------------------------------
(下面是详细说明——我现在是越来越罗嗦了)
这几日在琢磨能不能直接采用wxPython搭建我们的下一版本的界面,各方面看都是我们要找的东西,除了一条: 如何将旧系统兼容进去(旧系统采用MFC+COM+Active Scripting技术搭建)。
于是我想先看看用MFC写的程序能不能集成wxPython,但google了半天没有任何信息,只好退而求其次查找wxWidgets上嵌入wxPython,倒是找到一个例子:
http://svn.wxwidgets.org/viewvc/wx/wxPython/trunk/samples/embedded/
它本来的Makefile是编译debug版的,这就需要python, wxWidgets和wxPython的debug版本动态库,好像网上对于Windows上都没有提供(不象Linux上还有python2.4-dbg, libwxgtk2.6-dbg可供安装),这就意味着必须完全自己来编译,编译时还有unicode,universal一大堆的选项,编译完了还有安装/配置的问题。
我烦了,就编译release版本吧,自己修改Makefile.vc,去掉了调试选项,编译出来了。但将embeded.exe放到wxPython的目录运行,它跟我报怨说版本不匹配,wxPython的是"debug,unicode,Visual C++....",而embeded.exe是"no debug,unicode,Visual C++..."。奇怪,怎么预编译的wxPython居然还是debug版本?
没办法,又回头来编译debug版本,但折腾了半天,最后碰到一个python24_d.lib过不去。看来非得自己编译python不可了。我不死心,又在网上搜了一阵,找到一个办法: 修改Python\include里面的python.h,把静态库都改成同一个,其它.h文件也搜索Py_DEBUG,将两种模式下的处理搞成一致(比如不采用不同的引用计数函数),然后就OK了。
---------------------------------------
(下面是详细说明——我现在是越来越罗嗦了)
这几日在琢磨能不能直接采用wxPython搭建我们的下一版本的界面,各方面看都是我们要找的东西,除了一条: 如何将旧系统兼容进去(旧系统采用MFC+COM+Active Scripting技术搭建)。
于是我想先看看用MFC写的程序能不能集成wxPython,但google了半天没有任何信息,只好退而求其次查找wxWidgets上嵌入wxPython,倒是找到一个例子:
http://svn.wxwidgets.org/viewvc/wx/wxPython/trunk/samples/embedded/
它本来的Makefile是编译debug版的,这就需要python, wxWidgets和wxPython的debug版本动态库,好像网上对于Windows上都没有提供(不象Linux上还有python2.4-dbg, libwxgtk2.6-dbg可供安装),这就意味着必须完全自己来编译,编译时还有unicode,universal一大堆的选项,编译完了还有安装/配置的问题。
我烦了,就编译release版本吧,自己修改Makefile.vc,去掉了调试选项,编译出来了。但将embeded.exe放到wxPython的目录运行,它跟我报怨说版本不匹配,wxPython的是"debug,unicode,Visual C++....",而embeded.exe是"no debug,unicode,Visual C++..."。奇怪,怎么预编译的wxPython居然还是debug版本?
没办法,又回头来编译debug版本,但折腾了半天,最后碰到一个python24_d.lib过不去。看来非得自己编译python不可了。我不死心,又在网上搜了一阵,找到一个办法: 修改Python\include里面的python.h,把静态库都改成同一个,其它.h文件也搜索Py_DEBUG,将两种模式下的处理搞成一致(比如不采用不同的引用计数函数),然后就OK了。
2007年12月11日 星期二
PDF文件的分割与合并
装个pdftk就行了。
分割可以采用分段抽取来搞定:
pdftk wxPIA.pdf cat 114-146 output chapter04.pdf
合并:
pdftk chapter0*.pdf cat output part1.pdf
还可以将A文档的某些页和B文档的某些页拼起来:
pdftk A=one.pdf B=two.pdf cat A1-7 B1-5 A8 output combined.pdf
添加附件:
pdftk chapter01.pdf attach_files ../chapter-01/* output chapter01a.pdf
拆离附件:
pdftk chapter01a.pdf unpack_files output ./chapter-01/
更复杂的应用还是看项目主页上的文章吧。
另外, 这东西用到libgcj,估计部分是用java写的,反正运行起来有点慢。
分割可以采用分段抽取来搞定:
pdftk wxPIA.pdf cat 114-146 output chapter04.pdf
合并:
pdftk chapter0*.pdf cat output part1.pdf
还可以将A文档的某些页和B文档的某些页拼起来:
pdftk A=one.pdf B=two.pdf cat A1-7 B1-5 A8 output combined.pdf
添加附件:
pdftk chapter01.pdf attach_files ../chapter-01/* output chapter01a.pdf
拆离附件:
pdftk chapter01a.pdf unpack_files output ./chapter-01/
更复杂的应用还是看项目主页上的文章吧。
另外, 这东西用到libgcj,估计部分是用java写的,反正运行起来有点慢。
订阅 帖子 [Atom]