使用imageMagic实现PDF转图片
最近一个项目需要实现将PDF文件转成图片的功能,由于转换时间较长,所以选择在系统后台执行转换工作,使用的是一个叫imageMagic的程序(貌似很多图片处理软件用的就是这个库)。查看imageMagic的官方文档,参数实在太多,做了一番research之后,记录如下:
PDF转图片
convert -density 300 -quality 100 -resize 1024x768 -antialias test.pdf[0-50] test.jpg
使用convert命令进行转换:
density参数是设置图片DPI值
quality参数是设置图片质量(0-100,对png格式图片无效)
resize参数是对图片进行缩放(按比例)
antialias参数是设置开启文字抗锯齿效果
test.pdf是要转换的pdf文件(必要时需要指定绝对路径,不一定是pdf格式,图片格式即可,0-50是指要转换的页码,不指定就全部转换)
test.jpg是转成图片后的名字(如果pdf有多页,图片名称按照 test-0.jpg, test-1.jpg, test-2如此类推)
PHP中调用convert命令
PHP中有几个调用系统shell命令的函数,这次项目中我使用exec这个函数,使用方法如下:
$cmd = "convert -density 300 -quality 100 -resize 1024x768 -antialias test.pdf[0-50] test.jpg"; // $output变量记录命令执行时的所有输出,以数组格式返回 // 执行后可以对$output变量进行检查,因为convert命令正常的话是没有输出的,如果有输出可能就是转换失败 exec($cmd, $output);
解析PDF等图片的信息
可以使用identify命令对PDF进行解析,可以得到文件的分辨率等信息,简单命令如下(详细参数参考官方文档):
identify test.pdf
解决在IE下jpg图片无法显示的问题
因为imageMagic转换成jpg格式图片的时候,默认使用了CMYK格式,所以导致在IE下有时候会显示不了。
可以使用colorspace参数将图片使用RGB的格式进行转换。
命令如下:
convert -colorspace RGB test.pdf test.jpg
【翻译】多文件上传

多文件上传
以往我打算是实现同时上传多个文件,会使用多个"file"表单元素,这是令人讨厌的,效率低下(译者注:用户需要一个文件一个文件地选择),但我无法想象我如果不使用它的话,我的用户会怎么样。很幸运,Safari, Chrome和firefox 现在已经实现了使用一个file表单元素就能完成完成多文件上传的方法。
查看DEMO
HTML
<form method="post" action="upload-page.php" enctype="multipart/form-data"> <!-- 译者注:注意這個multiple属性和name属性 --> <input name="filesToUpload[]" id="filesToUpload" type="file" multiple="" /> </form> <br/>
简单的给file 表单元素添加一个muliple属性就允许多文件上传了。(译者注:multiple的值的作用不清楚,原文的意思大概是可以添加验证功能)
Listing Multiple Files with JavaScript
//get the input and UL list var input = document.getElementById('filesToUpload'); var list = document.getElementById('fileList'); //清空列表 while (list.hasChildNodes()) { list.removeChild(ul.firstChild); } //遍历每一个选择上传的文件 for (var x = 0; x < input.files.length; x++) { //add to list var li = document.createElement('li'); li.innerHTML = 'File ' + (x + 1) + ': ' + input.files[x].name; list.append(li); }
file表单元素的files属性是一个数组,所以可以通过length属性可以知道用户选择的文件。可以遍历得到每一个文件的路径(path)和名称(name)。
Receiving and Handling Files with PHP
使用PHP接收并处理文件
if(count($_FILES['uploads']['filesToUpload'])) { foreach ($_FILES['uploads']['filesToUpload'] as $file) { // 你可以在处理图片 echo $file; } }
PHP根据表单的那么属性创建了一个文件数组。
当然,你也可以在IE和opera中通过flash实现多文件上传,可是想这样要另外的组件支持始终不是什么好主意。希望这些浏览器快点支持多文件上传吧!
by 译者
评论中以外发现一个flash上传的jquery插件http://www.uploadify.com/,这段时间在弄大文件上传的处理方式,是使用swfupload这个组件实现的。
记录一下这个uploadify, 以后也许用得着:)
Android开发中的单元测试
java开发好像大多都是以xml作为配置文件(php大多使用ini格式的文件),一开始真是有点不习惯,而且很多配置项给人糊里糊涂的感觉,目前只是处于复制粘贴,不知其所以然的水平。以下是在android开发中使用单元测试的配置项要点:
1.在AndroidManifest.xml中的application节点下添加如下节点:
<uses-library android:name="android.test.runner" />
2.在AndroidManifest.xml中的根节点(mainfest)下添加如下节点:
<instrucmentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="cn.sharp.action" //这个属性必须与单元测试用例class所在的package一致
android:label="Test for My App"/>
杂碎记录
1.限制输出格式为数字(整数或浮点数)的属性
android:numeric="integer|decimal"
2.字符串转浮点型
String s = "1.2";
float f = float.parseFloat(s);
3.java中浮点型转字符串
String str = ""+f;
结束语
终于开始认真学android开发了,入门还是不难的,加油!
SQLite 的Script导出方法
如何导出sqlite的sql语句
作者:axgle
这是我实际经验的总结,是有效的。不知道有没有更简单的办法呢?
知道的朋友回复一下,谢谢.
1.选择源db_src
sqlite3 src.db
2.选择输出模式
.mode insert
3.选择输出文件名
.output sql.txt
4.开始dump
.dump table1,table2
java中的匿名类学习笔记
定义匿名类
在声明某个类的成员属性时,可以将匿名类的实例赋值给改成员变量,也可以在某个方法中,将匿名类实例作为方法返回值
case1: 赋值给类中成员变量
class Outer { public B bb = new B() { // B是匿名类的父类或者是一个接口 private int a = 1; private int b = 2; public function func(){ // do sth. } }; // 此处的分号一定要记得,因为这里是一条语句(表达式) }
case2:方法中返回匿名类的实例
class Outer { public B getAnoy(){ return new B() { // B是匿名类的父类或者是一个接口 private int a = 1; private int b = 2; public function func(){ // do sth. } }; // 此处的分号一定要记得,因为这里是一条语句(表达式) } }
向匿名函数父类的构造函数传递参数
//很简单,只要在声明匿名函数的时候传递 new B(1){ //声明匿名函数 }
方法中的匿名函数使用方法的参数
当方法的参数为final时,匿名函数才能使用该参数变量
class Outer { public B getAnony(final String param) { return new B() { private String paramHolder = param; // param必须为final } } }
匿名函数的构造函数
因为是匿名函数,那么就不可能有命名的构造函数,但是可以通过Instance initialization(实例初始化)来实现类似构造函数的效果
class Outer { public B getAnony() { return new B() { { System.out.println("初始化对象时调用") } //这样就可以实现构造函数的效果了 private int a = 1; } } }
匿名类与正常的类继承的不同
尽管匿名类可以实现某个接口,也可以扩展(extends)某个类,但是不能同时实现一个接口并扩展某个类。鱼与熊掌不能兼得。
Thinking In Java内部类中讲到匿名类时,通过匿名类巧妙地实现了工厂方法。
HTML5中的classList
HTML5的API加入了一个很有用的功能,那就是classList。
classList对象被添加在所有的DOM元素中,提供了DOM元素的class相关操作,如添加、删除等。
classList对象结构如下:
node.classList = { length: {number}, /* # of class on this element */ add: function() { [native code] }, contains: function() { [native code] }, item: function() { [native code] }, /* by index */ remove: function() { [native code] }, toggle: function() { [native code] } }
正如你所看到的,classList对象内容不多,但都是一些很有用的属性和方法。
添加一个class
myDiv.classList.add('myCssClass');
删除一个class
myDiv.classList.remove('myCssClass');
切换class
myDiv.classList.toggle('myCssClass');
检测元素是否拥有某个class
myDiv.classList.contains('myCssClass');
现在只有firefox支持classList这个对象。相信其他浏览器也会陆续支持。
PHP中设置文件上传大小限制
PHP中有三个配置项是控制上传相关的:
memory_limit
post_max_size
upload_max_filesize
其中只有memory_limit可以在脚本中动设置
ini_set(‘memory_limit’, ‘60M’); // 可成功设置 ini_set(‘post_max_size’, ‘40M’); // 失败 ini_set(‘upload_max_filesize’, ‘40M’); // 失败
还可以通过.htaccess文件设置:
php_value memory_limit 60M
php_value post_max_size 40M
php_value upload_max_filesize 40M
当然,还可以直接php.ini中配置
mysql复制表和修改表名
mysql中复制表结构和数据的方法(只复制表结构,不复制约束):
假设要建一个表tableNew,数据结构与已存在的表tableOld一致
CREATE TABLE tableNew SELECT * FROM tableOld WHERE 1<>1
如果要全部复制(包括数据),可以这样写
CREATE TABLE tableNew SELECT * FROM tableOld
这两天给人写一个电话本,需要修改数据库中的一个表的名称,修改表名的语句如下:
ALTER TABLE mytable RENAME TO newTable
试用期满感想
我在公司的所属部门是外包,我虽然也不喜欢做外包,但觉得在这方面目前还是有很多东西学习的。另外公司主要方向不是做外包,等公司主要产品上了轨道之后,就不需要做外包,到时就可以做真正自己的产品。所以自己其实是在以一种“等待和学习”的心态在工作。
前几天我试用期满了,Michael找我谈话,和我谈了公司的发展情况等等,并且分析了我的工作职责等问题,使我的心态有所改变。这是我才明白到,我们在做外包项目的同时(特别是对于我来说)不要仅限于为了提高编程水平。对于公司来说,公司是在积累案例,我们的客户是国外的,有很多服务在国内目前是没有的,在将来,我们可以把这些曾经做过的项目,移植到国内市场来。比如之前我们做过的一个“位置服务”,现在随随便便就可以改个包装就可以在国内翻一个版本。
不要仅仅限于解决技术上的问题,而是要理解需求,要理解客户为什么要求这样做,这样的好处是什么。要不然就算你做过很多项目,但都不知道这些项目为什么有这样那样的需求,不知道具体某个功能的好处在哪里,缺点在哪里的话。做过再多的项目,你也只不过是个coder。
思考技术以外的事情(在这里指理解产品,理解需求),并不会浪费太多时间,可以说这两件事是可以同时进行的,既然在技术能够提高的同时,能够让自己思考得更多,何乐而不为呢。
要变得更有智慧,而不只是更有知识。