月度归档:2012 年八月

基于Android的Word文档阅读器[转]

随着android系统的发展,android已经得到广泛的认可,作为一名普通的大学生,真的希望自己能在android系统上做一个可以让大家使用、方便大家工作的一个软件,最后决定做一个基于andriod的Word格式阅读器。

经过一些查找工作,终于找到了可以在android系统上使用的用于读取Word格式文档的开源包–POI(The Java API For Microsoft Documents)。下载地址:http://poi.apache.org/

POI是Apache的一个子项目,其目的是提供对基于OOXML(Microsoft Office Open XML)和OLE2(Object Linking and Embedding)的各种文档操作的Java APIs包。该项目分为几个组件,其中包括一个叫做HWPF的组件,它只能操作Word文件。这就是我将要使用的组件。HWPF的全称是Horrible Word Processor Format。翻译成中文是“可怕的文档处理格式”,利用HWPF,开发者可以用纯Java代码实现在Android系统是读取Word文档。HWPF组件是POI项目中用来实现Word文档读取的一个重要组件,以下是该组件中几个重要的类:

(1)Range:是所有HWPF对象模型的核心类,Word文档中字符的所有属性都是继承这个类得到的。

(2)HWPFDocument:文件类。任何形式的Word文档的最终表现形式都是对该对象进行一些属性的定制。

(3)Paragraph:是Word文档中基本的组成部分,每个文档都被划分成一个一个的段落,所有的段落最终组成一个Word文档。

(4)Picture:Word文档中嵌入的每张图片都是由Picture对象来表示的,它包括了图片的大小、内容等一系列属性。

(5)Table:Word文档中嵌入的每张表格都是有Table对象来表示的,它包括了表格中每行的TableRow对象和行数等属性。

其他的类文件对以上核心的类进行功能补充,最终完成了Word 文档的读取。

由于Word格式文档中有图片、表格和字符串,为了能在android系统上全部进行显示,选择使用WebView进行显示。首先将Word格式文档中的内容读取出来,加上对应的HTML标签,然后写入HTML文件中,最后直接使用WebView进行读取HTML文件的内容。

判断当前段落是表格、图片还是一段文字的代码:

 

[java][/java] view plaincopy

  1. public void writeParagraphContent(Paragraph paragraph){
  2.     Paragraph p = paragraph;
  3.     int pnumCharacterRuns = p.numCharacterRuns();
  4.     for( int j = 0; j < pnumCharacterRuns; j++){
  5.         CharacterRun run = p.getCharacterRun(j);
  6.         if(run.getPicOffset() == 0 || run.getPicOffset() >= 1000){
  7.             if(presentPicture < pictures.size()){
  8.                 writePicture();
  9.             }
  10.         }
  11.         else{
  12.             try{
  13.                 String text = run.text();
  14.                 if(text.length() >= 2 && pnumCharacterRuns < 2){
  15.                     output.write(text.getBytes());
  16.                 }
  17.                 else{
  18.                             int size = run.getFontSize();
  19.                         int color = run.getColor();
  20.                         String fontSizeBegin = ”<font size=\”" + decideSize(size) + ”\”>”;
  21.                         String fontColorBegin = ”<font color=\”" + decideColor(color) + ”\”>”;
  22.                         String fontEnd = ”</font>”;
  23.                         String boldBegin = ”<b>”;
  24.                         String boldEnd = ”</b>”;
  25.                         String islaBegin = ”<i>”;
  26.                         String islaEnd = ”</i>”;
  27.                         output.write(fontSizeBegin.getBytes());
  28.                         output.write(fontColorBegin.getBytes());
  29.                         if(run.isBold()){
  30.                             output.write(boldBegin.getBytes());
  31.                         }
  32.                         if(run.isItalic()){
  33.                             output.write(islaBegin.getBytes());
  34.                         }
  35.                         output.write(text.getBytes());
  36.                         if(run.isBold()){
  37.                             output.write(boldEnd.getBytes());
  38.                         }
  39.                         if(run.isItalic()){
  40.                             output.write(islaEnd.getBytes());
  41.                         }
  42.                         output.write(fontEnd.getBytes());
  43.                         output.write(fontEnd.getBytes());
  44.                     }
  45.             }
  46.             catch(Exception e){
  47.                 System.out.println(“Write File Exception”);
  48.             }
  49.         }
  50.     }
  51. }

 

在SDCARD上创建一个图片的代码:

[java][/java] view plaincopy

  1. public void writePicture(){
  2.     Picture picture = (Picture)pictures.get(presentPicture);
  3.     byte[] pictureBytes = picture.getContent();
  4.     Bitmap bitmap = BitmapFactory.decodeByteArray(pictureBytes, 0, pictureBytes.length);
  5.     makePictureFile();
  6.     presentPicture++;
  7.     File myPicture = new File(picturePath);
  8.     try{
  9.         FileOutputStream outputPicture = new FileOutputStream(myPicture);
  10.         outputPicture.write(pictureBytes);
  11.         outputPicture.close();
  12.     }
  13.     catch(Exception e){
  14.         System.out.println(“outputPicture Exception”);
  15.     }
  16.     String imageString = ”<img src=\”" + picturePath + ”\”";
  17.     if(bitmap.getWidth() > screenWidth){
  18.         imageString = imageString + ” ” + ”width=\”" + screenWidth + ”\”";
  19.     }
  20.     imageString = imageString + ”>”;
  21.     try{
  22.         output.write(imageString.getBytes());
  23.     }
  24.     catch(Exception e){
  25.         System.out.println(“output Exception”);
  26.     }
  27. }

运行效果截图:

读取图片和文字:

读取表格和文字:

 

源代码及测试Word文档打包:

http://download.csdn.net/source/3432624

本文系“暑期大学生博客大赛-2011 Android成长篇“参赛文章

转自:http://blog.csdn.net/xiaoxiaobian3310903/article/details/6598500

Android读取word文件

Android中读取word文件需要用第三方jar包tm-extractors-0.4.jar。

[java]
package com.word.read;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

import org.textmining.text.extraction.WordExtractor;

import Android.app.Activity;
import Android.os.Bundle;
import Android.os.Environment;
import Android.widget.TextView;

public class WordReader extends Activity {
/** Called when the activity is first created. */

private TextView text;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

text = (TextView) findViewById(R.id.text);

String str = readWord(Environment.getExternalStorageDirectory().getAbsolutePath() + "/baojinggong.doc");
text.setText(str.trim().replace("\r", ""));
}

public String readWord(String file){
//创建输入流用来<a title="读取doc文件" href="http://www.android-study.com/pingtaikaifa/38.html">读取doc文件</a>
FileInputStream in;
String text = null;
try {
in = new FileInputStream(new File(file));
WordExtractor extractor = null;
//创建WordExtractor
extractor = new WordExtractor();
//进行提取对doc文件
text = extractor.extractText(in);
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (Exception e) {
e.printStackTrace();
}
return text;
}
}
[/java]

DELL R410 网卡驱动升级[转]

最近新买了5台dell R410的服务器,安装系统是centos5.4,上线运行后,两台带宽流量比较大的server(40M),频繁出现公网网口 自己宕掉的情况,整的我够呛,通过和dell支持联系,让我互换公网和内网网线,我真想抽他,没有采纳他的建议,我分析觉得应该是网卡驱动的问题,可能centos5.4 系统比较新,r410和centos双方支持的不是很好,于是重新安装了系统,其中3台降版本到centos4.8没在出过问题,2台降到centos5.3(有个业务需要内核在2.6.13以上,所以才降到centos5.3),运行一段时间后,还是出现网口自己宕机情况,开始怀疑自己的分析,也许不是驱动的问题,然后到网上搜了下,发现有的帖子说了r410对centos5.3,5.4网卡支持不好,建议下载最新的网卡驱动安装,这下豁然开朗。也验证了我的想法。

在centos5.3系统上更新网卡驱动

1 R410网卡为Broadcom bnx2 Linux Driver
驱动下载:http://zh-cn.broadcom.com/support/ethernet_nic/netxtremeii.php 下载linux 版本

2 下载为linux-5.2.55.zip
解压:unzip linux-1.9.20b_1.50.13.zip
3 cd Server/Linux/Driver/netxtreme2-5.2.55/bnx2/src
编译驱动bnx2.o (或bnx2.ko),生成可加载的模块
make
make install
新的网卡驱动会产生在/lib/modules/2.6.18-128.el5/updates目录下,
需要重新加载才能使用,下面是不需重启服务器重新加载模块的脚本

#!/bin/sh
rmmod bnx2
depmod
modprobe bnx2

内核在加载的时候是靠modules.dep 文件,这个文件是执行depmod命令产生,简单的说这个命令是把
/lib/modules下的目录里的外部模块加载到modules.dep 文件,是按目录层次进行的,updates目录内的网卡模块比源系统kernel/drivers/net下的网卡模块先加载,所以源驱动不必删除也不用把新的模块cp到原来的目录下(不过这样做也是可以的)。

lsmod |grep bnx2 查看是否升级

网卡驱动升级完毕,dell的初级技术支持真是不知说他们什么好!

IIS 7管理API——Microsoft.Web.Administration介绍

本文翻译整理自Carlos Aguilar Mares的blog文章:Microsoft.Web.Administration in IIS 7。
请注意本文的内容均基于Windows Vista Beta 2版本,在正式的发布版本中可能会有所改变。

Microsoft中提供了管理IIS7的一些非常强大的API——Microsoft.Web.Administration,可以很方便的让我们以编程的方式管理,设定IIS 7的各项配置。Microsoft.Web.Administration.dll位于IIS的目录(%WinDir%\System32\InetSrv)下,在项目中添加对其的引用后您就可以使用这些API了。下图显示了Microsoft.Web.Administration.dll中的主要对象。

让我们通过几个例子来使用Microsoft.Web.Administration,下面的例子均非常易懂,我就不再过多解释了。

建立一个站点(Site)

ServerManager iisManager = new ServerManager();
iisManager.Sites.Add(“NewSite”, “http”, “*:8080:”, “d:\\MySite”);
iisManager.Update();
将一个应用程序(Application)添加到一个站点

ServerManager iisManager = new ServerManager();
iisManager.Sites["NewSite"].Applications.Add(“/Sales”, “d:\\MyApp”);
iisManager.Update();
建立一个虚拟目录(Virtual Directory)

ServerManager iisManager = new ServerManager();
Application app = iisManager.Sites["NewSite"].Applications["/Sales"];
app.VirtualDirectories.Add(“/VDir”, “d:\\MyVDir”);
iisManager.Update();
运行时控制:停止一个站点

ServerManager iisManager = new ServerManager();
iisManager.Sites["NewSite"].Stop();
运行时控制:回收应用程序池(Recyciling an Application Pool)

ServerManager iisManager = new ServerManager();
iisManager.ApplicationPools["DefaultAppPool"].Recycle();
运行时控制:得到当前正在处理的请求

ServerManager iisManager = new ServerManager();
foreach(WorkerProcess w3wp in iisManager.WorkerProcesses) {
Console.WriteLine(“W3WP ({0})”, w3wp.ProcessId);

foreach (Request request in w3wp.GetRequests(0)) {
Console.WriteLine(“{0} – {1},{2},{3}”,
request.Url,
request.ClientIPAddr,
request.TimeElapsed,
request.TimeInState);
}
}
还有一个有用之处是Microsoft.Web.Administration提供了对*.config(例如web.config)文件的编辑功能,让您再也不用像修改普通XML文件一样修改*.config了。但是原作者说他将在今后的Post中详细说明,我也只暂且写到这里了。

dell r410安装网卡BCM5716驱动

今天新到的r410,刚跑几天就陆续出现eth1没响应,eth0到没事….这个郁闷。
装网卡驱动试试。
lspci -vv 查网卡驱动
NetXtreme II BCM5716 Gigabit Ethernet
http://zh-cn.broadcom.com/support/ethernet_nic/netxtremeii.php 下载驱动
解压后有rpm和tar两种形式。
yum -y install kernel-devel.x86_64 kernel-debug-devel.x86_64
解压tar包后make
make KVER=2.6.18-164.el5 #当前的内核版本
make install

RHEL5.4和BCM5709网卡驱动问题 [转]

前段时间最折腾的事莫属:RHEL5.4(我的是5.5)和BCM5709(我的网卡是BCM5716)网卡驱动问题。
以上信息分别可以通过cat /etc/issue 和 kudzu –probe –class=network 查看
系统:rhel5.4 64bit

服务器:DELL R710(我的是R410)

默认RHEL5.4 64bit的驱动对BCM5709的网卡支持不好,网卡一遇到流量比较大就会hung up,后来不得已去dell官方去寻找驱动,同时将kernel降级为:2.6.18-128.el5(系统安装好后,我做了一个kernel的升级)这样就没有出现过hung up的情况。

既然64bit有问题,32bit的也是逃脱不了。

阿辉 Says:
一月 7th, 2010 at 17:42

我也碰到过这个问题,我是这么做的,用内核自带的驱动,关闭acpi:
vi /boot/grub/grub.conf
title CentOS (2.6.18-164.6.1.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-164.6.1.el5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet acpi=off noapic
initrd /initrd-2.6.18-164.6.1.el5.img

阿辉 Says:
一月 7th, 2010 at 17:43

最高跑到过300多M,没有出过问题了。

bixuan Says:
一月 7th, 2010 at 17:47

是的,关闭acpi也是可以的,多谢分享,呵呵

今天实然接到通知,说服务器上的服务down了,因为在外面无法查看,过了一会同事又说是因为网络不通重启了网卡又正常了。回到家上服务器进行检查,没有报错,也没有发现什么系统的异常。觉得比较奇怪就上网搜索了一下,发现也有人遇到了Broadcom BCM5709在centos系统出现网卡不工作的情况。重新安装网卡驱动,只能再观察是否还会再出现这种情况。

lspci
01:00.0 Ethernet controller: Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet (rev 20)
01:00.1 Ethernet controller: Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet (rev 20)
02:00.0 Ethernet controller: Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet (rev 20)
02:00.1 Ethernet controller: Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet (rev 20)

ethtool -i eth1
driver: bnx2
version: 1.9.3
firmware-version: 5.0.11 NCSI 2.0.5
bus-info: 0000:01:00.1

下载kernel-devel和网卡新驱动
rpm -ivh kernel-devel-2.6.18-164.11.1.el5.x86_64.rpm
cd /usr/local/src/Server/Linux/Driver/netxtreme2-5.2.50
make && make install
rmmod bnx2;modprobe bnx2
ethtool -i eth1
driver: bnx2
version: 2.0.8b
firmware-version: 5.0.12 bc 5.0.11 NCSI 2.0.5
bus-info: 0000:01:00.1

linux 系统下查看网卡型号及驱动

1、查看网卡型号
kudzu –probe –class=network
结果如下:
class: NETWORK
bus: PCI
detached: 0
device: eth3
driver: bnx2
desc: “Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet”
network.hwaddr: d8:d3:85:b3:cd:0c
vendorId: 14e4
deviceId: 1639
subVendorId: 103c
subDeviceId: 7055
pciType: 1
pcidom: 0
pcibus: 4
pcidev: 0
pcifn: 1
2、查看驱动版本
modinfo bnx2
结果如下:
filename: /lib/modules/2.6.18-194.el5PAE/kernel/drivers/net/bnx2.ko
version: 2.0.2
license: GPL
description: Broadcom NetXtreme II BCM5706/5708/5709/5716 Driver
author: Michael Chan
srcversion: 7025AAF3645EE432EAF1C00
alias: pci:v000014E4d0000163Csv*sd*bc*sc*i*
alias: pci:v000014E4d0000163Bsv*sd*bc*sc*i*
alias: pci:v000014E4d0000163Asv*sd*bc*sc*i*
alias: pci:v000014E4d00001639sv*sd*bc*sc*i*
alias: pci:v000014E4d000016ACsv*sd*bc*sc*i*
alias: pci:v000014E4d000016AAsv*sd*bc*sc*i*
alias: pci:v000014E4d000016AAsv0000103Csd00003102bc*sc*i*
alias: pci:v000014E4d0000164Csv*sd*bc*sc*i*
alias: pci:v000014E4d0000164Asv*sd*bc*sc*i*
alias: pci:v000014E4d0000164Asv0000103Csd00003106bc*sc*i*
alias: pci:v000014E4d0000164Asv0000103Csd00003101bc*sc*i*
depends:
vermagic: 2.6.18-194.el5PAE SMP mod_unload 686 REGPARM 4KSTACKS gcc-4.1
parm: disable_msi:Disable Message Signaled Interrupt (MSI) (int)
parm: enable_entropy:Allow bnx2 to populate the /dev/random entropy pool (int)
module_sig: 883f3504bb64ec7285b5c47ed7a1e8e1124ab709d1d789bf78777b43dfcfff9788e6b1c1da763fece09cfbd9bab31828ce6ca80ce374b2929a3abf6cd83

3.或者lspci | grep Ethernet
01:00.0 Ethernet controller: Broadcom Corporation NetXtreme II BCM5716 Gigabit Ethernet (rev 20)
01:00.1 Ethernet controller: Broadcom Corporation NetXtreme II BCM5716 Gigabit Ethernet (rev 20)

网站没被百度收录怎么办?

1.百度网站登录。提交百度网站登陆是让百度收录网站的的第一步骤。百度登陆的网址是http://www.baidu.com/search/url_submit.html 但自百度调整算法后,仅靠百度登陆就想让自己的网站被百度收录已经很困难了。

2.创建百度空间。一般来说,创建的百度空间一般几天就可以收录。新站可以创建一个与自己网站相关的百度空间,然后在空间里添加一些文章并附上自己网站的网址。同时,在百度空间里的友情链接也加上自己的网址。百度在收录空间的同时也会链接找到您的新站。通过这一步骤,大概一个星期左右即可被百度收录。当然,如果觉得建空间麻烦,也可以到百度空间首页(hi.baidu.com)找一些推荐空间,在他们的空间里留言并加上链接也可以加快收录。

3.百度知道发帖回帖。百度知道栏目在百度搜索里的权重很高,在百度知道的栏目里发帖回贴也可以加快收录。可以采用自问自答的模式将自己的回答设置为答案,在答案里的“资料来源”处加上自己的新站链接。如果您觉得百度知道自问自答很麻烦容易被封,那就在一些最新的百度知道“未解决问题”中回答别人的问题并加上自己的链接。对于这些未解决的新问题,百度也会经常光顾检索的。

4.百度百科创建新词条。百度百科栏目在百度搜索的权重跟百度知道栏目差不多。您可以创建一条与新站主题差不多的新词,然后在“资料来源”里写上网站和链接地址。此效果跟百度知道回答一样有异曲同工之效。

5.百度收藏新站。百度收藏栏目(cang.baidu.com)是百度的新栏目,虽然权重不高,也没有实例证明其对收录的有效性。但海式电子商务机构认为,百度收藏其实就是用户的网上收藏夹,对于用户收藏夹里的网站百度肯定会给以相应的权重,至少会去拜访了解一下。

6.发软文加链接。发篇软文然后贴到站长网等知名网站这是很多新站站长首选的方法。其实这方法并不如上面列的几条方法收录来得快。毕竟以上5条方法是在百度自己的产品里推荐新站。这就好比两个孩子,一个是自己亲手的,另外一个是别人家的,您说做父母的会照顾谁多一点呢?