代码高亮输出到文本:highlight

因为要申请计算机软件著作权,需要生成源代码文档。通常,生成源代码文档有两个要求:

  1. 代码可以根据语言规则进行高亮
  2. 可以有前置的行号
  3. 可以批量处理

其中,1和2应该是必须有的,3最好也应该有,不过要是程序自身没有应该也可以通过脚本来进行支持处理。

试验了几个方案:

1. code::blocks方案

codeblocks中有一个code export插件,可以支持代码高亮输出到多种格式,包括html、rtf、odt、pdf格式,输出时自带行号,但缺少选项支持。codeblocks自身作为一个ide,也支持code reformat,因此也可以在输出前先进行format。对中文支持也不错。但测试发现,输出php代码为odt格式时,文档中高亮部分有问题,通常只有前面一部分是正常的,之后高亮就不工作了。备注:使用此插件需要安装contrib包:

sudo apt-get install codeblocks-contrib

2. gnu source highlight

无意中发现ubuntu下还有一个软件:source-highlight-ide,于是安装尝试了一下,发现其只能转换为docbook、latex、xhtml、html,没有我想要的格式。

3. libreoffice的macroformmatter插件

openoffice/libreoffice之前有一个插件可以支持各种代码的高亮,即macroformmatter插件,但安装后发现其不支持我这次要的php代码输出。

4. highlight

搜索的时候,发现这儿的一个需求和我是一致的:

How do I embed source code or HTML in Open Office Org Presentations without using screenshots?

发现其中提到的一个highlight软件可以解决此问题,到其官方网站上查询发现,其提供了两个下载方式,分别是windows下的安装包以及源代码包,开始还以为此软件不支持linux呢,结果在其文档中发现此软件在各发行版中都已经内置,直接安装就可以了。

sudo apt-get install highlight

仓库中的软件版本为3.8,官方网站上最新版本为3.11 beta。

其输出格式支持html、xhtml、rtf、TeX, LaTeX, SVG, BBCode等格式。在ubuntu下默认安装后需要使用命令行操作,试验了一下rtf格式,发现效果很好,上面的123要求都能满足,但是打开转换后的文件发现中文乱码!但html格式是不乱码的。

尝试下载了最新版本,在编译过程也遇到了问题,就先把windows版本先下载下来尝试一下。在试验过程中,发现其输出格式中支持odt格式,试验了一下,用此格式中文是不乱码的,要求都满足了,若最终目的是打印输出的话,选择其中的print样式效果很好的。

在其changelog里发现,odt格式支持是在3.10beta版本中开始支持的。

highlight 3.10 beta

21.07.2012

-fixed HTML ordered lists to improve copy&paste in browsers (suggested by Nash)
-changed default output from HTML 4.01 to HTML5
-changed default HTML font family to include the generic monospace font
-<strong>added ODT Flat XML output format</strong> (--out-format=odt)
-added fontenc package in LaTeX output (patch by Yimin Li)
-fixed RTF hyperlink output in several plug-ins
-removed ctags option (functionality was replaced by plug-in)
-CLI: added --wrap-no-numbers option (patch by Michael Enßlin)
-GUI: replaced Qt file dialogs by native dialogs

ubuntu server 12.04中文显示不完整

发现有台服务器ubuntu server 12.04在远程过去时文件名的中文现实没有问题,但ls的时候时间居然乱码。 搜索了一下,应该是locale的问题,可以这样处理:

1. 编辑/var/lib/locales/supported.d/local文件,内容改成如下:

en_US.UTF-8 UTF-8
zh_CN.UTF-8 UTF-8
zh_CN.GBK GBK
zh_CN GB2312

2. locale重新生成:

sudo locale-gen

3. 修改缺省的编码为zh_CN.UTF-8

nano /etc/default/locale

内容为:

LANG=”zh_CN.UTF-8″
LANGUAGE=”zh_CN:zh”
LC_NUMERIC=”zh_CN.UTF-8″
LC_TIME=”zh_CN.UTF-8″
LC_MONETARY=”zh_CN.UTF-8″
LC_PAPER=”zh_CN.UTF-8″
LC_NAME=”zh_CN.UTF-8″
LC_ADDRESS=”zh_CN.UTF-8″
LC_TELEPHONE=”zh_CN.UTF-8″
LC_MEASUREMENT=”zh_CN.UTF-8″
LC_IDENTIFICATION=”zh_CN.UTF-8″

4. 退出,然后重新登陆进来应该就ok了。

ubuntu evince中字体显示问题

现在ubuntu中默认显示中文是没有问题的,但是遇到有些使用中文字体的英文,显示效果差异就很大,开始还以为是PDF问题,后来用ADOBE READER打开显示就没有问题。
最终发现只要把/etc/fonts/conf.d/49-sansserif.conf中的中文字体替换为simsun就没有问题了。

在ubuntu 10.10下升级bluefish

ubuntu 10.10下的bluefish版本是2.0.1,存在不能输入中文问题(源于和输入法的快捷键冲突),之前的解决办法是修改源码,把此快捷键修改掉。而目前最新的版本2.0.3中可以在选项中指定一个快捷键,因此计划升级到最新版本,先是到ubuntu ppa中搜索了一下,没有发现,于是直接从packages.debian.org下载最新的代码。
下载之后:
dpkg-source -x bluefish_2.0.3-1.dsc
cd bluefish-2.0.3
dpkg-buildpackage -rfakeroot -uc -b

若提示要安装libgucharmap2-dev,安装就可以:
sudo aptitude install libgucharmap2-dev
然后可以安装生成的deb文件了。
运行bluefish后要在编辑-首选项-Editor Setting重新设置Auto-Completion的快捷键。

evolution的中文附件问题

在ubuntu intrepid上,evolution发出的中文附件(指文件名是中文打头),如果另外一端是采用OUTLOOK活Outlook Express,则不能收到中文附件,或附件的文件名是奇怪的名称(att***.dat)。
在下个版本里这一问题已经得到修正,需要等ubuntu jaunty发布才可以。若现在就想修正这个问题,可以把这个PPA加入到源中:

deb http://ppa.launchpad.net/hggdh2/ppa/ubuntu intrepid main

然后升级系统应该就可以了。

参考:
1 ubuntu bug
2 gnome bug

用PHP处理中文PDF

因项目需要,现在想在服务器端动态生成PDF文件,已一个PDF为模板,然后把所需的数据动态填入。
本来在使用zend framework,因此很直接的就使用zend_pdf类来进行测试,代码实现如下:


$pdf = Zend_Pdf::load($this->view->config->offline->template);
$pdf->pages = array_reverse($pdf->pages);
$style = new Zend_Pdf_Style();
$font = Zend_Pdf_Font::fontWithPath($this->view->config->offline->font, ( Zend_Pdf_Font::EMBED_DONT_SUBSET));
$pdf->pages[0]->setFont($font, 10);
$pdf->pages[0]->saveGS();
//datalist
$pdf->pages[0]->drawText(str_replace(";","\n",$datalist), 100, 570,"UTF-8");
//project
$pdf->pages[0]->drawText($formData['project'], 100, 430,"UTF-8");
$pdf->pages[0]->drawText($formData['realname'], 100, 78,"UTF-8");
$pdf->pages[0]->drawText($formData['realname'], 130, 590,"UTF-8");
$pdf->pages[0]->drawText($formData['unit'], 95, 58,"UTF-8");
$pdf->pages[0]->drawText($formData['address'], 285, 58,"UTF-8");
$pdf->pages[0]->drawText($formData['postcode'], 470, 58,"UTF-8");
$pdf->pages[0]->drawText($formData['email'], 95, 40,"UTF-8");
$pdf->pages[0]->drawText($formData['phone'], 295, 40,"UTF-8");
$t=getdate();
$pdf->pages[0]->drawText($t['year'], 465, 40,"UTF-8");
$pdf->pages[0]->drawText($t['mon'], 500, 40,"UTF-8");
$pdf->pages[0]->drawText($t['mday'], 525, 40,"UTF-8");
$pdf->pages[0]->restoreGS();
$fn=$formData['realname'].date('YmdHis').".pdf";
$pdf->save($this->view->config->offline->savepath."/".$fn);

这样,的确能完成要求,但是令人恼火的是,其把中文字体内嵌到PDF文件中去,因此导致PDF文件过大,而且导致PHP所需内存也增大(64M)。
因此,就开始尝试别的办法,开始锁定fpdf,PHP能完美支持,而且也能支持中文(所要单独下载chinese.php和chinese-unicode.php)。
但是,FPDF不支持打开已有的PDF文件作为模板,因此还需要使用fpdi进行模板的支持,还要修改fpdi,使其父类为PDF-UNICODE。

然后就可以这样使用:

$pagecount = $this->setSourceFile($this->template);
$tplidx = $this->importPage(1, '/MediaBox');
$this->addPage();
$this->useTemplate($tplidx);
$this->AddUniGBhwFont('ugb','AdobeSongStd-Light-Acro');

$this->SetFont('ugb','',$this->fontsize);
$this->setXY(45,65);
$this->Write($this->fontsize,$this->data['realname']);

其中,字形由默认的AdobeSongStd-Light改成AdobeSongStd-Light-Acro,是为了防止英文字体变宽和变窄,格式才会整齐,英文字不会挤在一起。(参考: http://bbs.erp100.com/thread-18424-1-1.html)