Jump to content

prestashop之pdf支持中文方法


ele

Recommended Posts

1、将压缩包内的文件,解压覆盖至原始文件。
2、后台操作:
Back Office >> Preferences >> PDF
确保当前语言为中文,Font选择simhei,保存。

在中文状态下,新建一个订单,完成订单后,即可下载一份中文订单。

下载说明:
为了安装方便,我把字体文件放到了压缩包内,如果需要马上使用,请下载prestashop.part1.rar ~ prestashop.part3.rar
如果想使用自己的字体,或者想做一些修改,可下载prestashop-nofont.rar 并到http://acko.net/node/56 下载ufpdf
----------------------------------------------------------------------------------------------------------
以下信息需要程序知识,不熟悉的可略过。

原理,prestashop的pdf制作工具使用的fpdf项目,但该项目不支持unicode编码,但是有一个ufpdf项目是在fpdf基础上做了修改,并且支持unicode编码的。但是其工作需要借助另一个开源项目(ttf2ufm),将ttf文件转换为ufm文件。
所以,我们要做的就是将ufpdf整合至prestashop,然后使用ttf2ufm转换一个已知的ttf(true type font)文件,这一步在ufpdf的README中有详细介绍。
以下为详细介绍:
这里下载ufpdf http://acko.net/node/56
解压、安装
进入目录ufpdf
cd ttf2ufm-src
make install

转化ttf文件,这里我们以simhei.ttf为例
ttf2pt1 -a -F simhei.ttf

进入ufpdf/tools下,可以看到makefontuni.php
php -q makefontuni.php simhei.ttf simhei.ufm

将生成出来的
simhei.php
simhei.z
simhei.ctg.z
拷贝至prestashop的/tools/fpdf/font下

复制一个b字体[或者再生成一个同样的粗体文件]
cp -p simhei.php simheib.php

将ufpdf.php中的代码注释掉

//if(!class_exists('UFPDF'))
//{
//define('UFPDF_VERSION','0.1');

//include_once 'fpdf.php';

...

...最后
//}

拷贝该文件至prestashop的/tools/fpdf下
修改/class/PDF.php
-----
include_once(_PS_FPDF_PATH_.'fpdf.php');
-----
改为:
-----
define('FPDF_FONTPATH',_PS_FPDF_PATH_.'font/');
include_once(_PS_FPDF_PATH_.'fpdf.php');
include_once(_PS_FPDF_PATH_.'ufpdf.php');
-----

登录prestashop后台,选择你的中文,
Back Office >> Preferences >> PDF
选择font为simhei


ok
现在去前台选择中文之后打印订单吧!什么?还是乱码?哦,忘记说了,prestashop的订单也有语言,也就是说,你很有可能使用了一个其他语言的订单。不信可以连上数据库,select * from ps_orders;看看你的订单中的id_lang
是不是中文id_lang。

问题,eshop中的pdf功能在中国可能没有太多的实际作用,不过在其他应用中,可能会有帮助。

Link to comment
Share on other sites

我分卷压缩文件后得到的后缀名为.001--.004
这个后缀名无法上传这个论坛。所以我手动又在后面加了个.zip。
请下载之后,将最后的.zip去掉,最后得到的文件应该是:
prestashop.zip.001
prestashop.zip.002
prestashop.zip.003
prestashop.zip.004

然后就可以解压了。

抱歉..

Link to comment
Share on other sites

你好,我还想再请教个问题,为什么PDF导出与字符集无关呢,因为我在后台选择任何字符集都不影响,好象只与字体有关(黑体),只要设置了字体就可以的。我的数据库是UTF-8的,而且我看到程序中也有TOOLS::icov这样的方法来转换字符集的。能否解释下,谢谢!

Link to comment
Share on other sites

在PDF.php中字符串在被写到pdf之前会经历这个函数:

Tools::iconv('utf-8', self::encoding(), $str);



而,self::encoding 的会做一些这样的事。

static private function encoding()
{
return (isset(self::$_pdfparams[self::$_iso]) AND is_array(self::$_pdfparams[self::$_iso]) AND self::$_pdfparams[self::$_iso]['encoding']) ? self::$_pdfparams[self::$_iso]['encoding'] : 'iso-8859-1';
}



Tools.php 中的iconv方法 会做一些这样的事。

static public function iconv($from, $to, $string)
{
$converted = htmlentities($string, ENT_NOQUOTES, $from);
$converted = html_entity_decode($converted, ENT_NOQUOTES, $to);
return $converted;
}



在具体运行中,一般的形式是:Tools::iconv('utf-8', 'iso-8859-1', $str);

另一方面,我们来看常规的字符转换函数iconv。如果将一个utf-8的字符串转成iso-8859-1,这个函数会返回''

iconv('utf-8','iso-8859-1',$str);



我的猜想是,因为在Tools::iconv 中的
html_entity_decode 把字符串转成iso-8859-1时返回了空,从而放弃了这个返回规则,而返回了utf-8格式的字符串。

粗略研究,有错误还望指出。

Link to comment
Share on other sites

哦,他对iconv这个方法进行了重写,不在使用php原有的方法,而重写的方法对中文不进行转码的,是失效的,只对英文的起作用。原来如此,谢谢了!我原来一直没有完全弄清楚原理,所以一直是乱码,而且我原先也按照网上的方法汉化过,但是生成的字体文件总是错误的,导致一直未能解决,而且也未相通上面的问题,所以一直非常困惑,感谢!

Link to comment
Share on other sites

搜索都是提交给:search.php
提交字段叫:search_query

这里是search类
classes/Search.php
它提供方法:find

代码写的很清楚咯,看一看就知道了哈。

Link to comment
Share on other sites

  • 2 weeks later...
  • 2 weeks later...
  • 2 weeks later...
  • 2 months later...
  • 10 months later...
  • 3 months later...
  • 5 months later...
  • 3 months later...
  • 1 year later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...