当前位置:  编程技术>软件工程/软件设计
本页文章导读:
    ▪Itext PDF生成 加水印图片文字      由于项目中用到,所以网上找了很多,但或多或少有些问题,我整理更新了一下。 Itext架包下载地址: http://download.csdn.net/detail/qm4050/5531349 PDF生成代码如下: import java.io.*; import com.itextpdf.........
    ▪第十四学 linux内核——进程管理——进程控制块的内容(3)              这节讲进程控制块中的标识进程之间亲属关系的那些域。        系统创建的进程具有父子关系。所有的进程都是PID为1的init进程的后代(p.........
    ▪State设计模式在服务器软件开发中的应用和思考      1. C语言实现服务器软件时的常用编程模型     熟悉服务器软件开发的开发人员都知道使用Producer-Consumer模型加上线程池隔离消息的接收和消息的处理,但到消息的具体处理时一般是构建.........

[1]Itext PDF生成 加水印图片文字
    来源: 互联网  发布时间: 2013-11-19

由于项目中用到,所以网上找了很多,但或多或少有些问题,我整理更新了一下。

Itext架包下载地址:

http://download.csdn.net/detail/qm4050/5531349



PDF生成代码如下:


import java.io.*;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;

/**
 * PDF生成
 */
public class PDFBuild {

	public static void buidPDF(String pdfFile, String imageFile,
			String waterMarkName, int permission) {
		try {
			File file = File.createTempFile("tempFile", ".pdf"); // 创建临时文件

			// 生成PDF
			if (createPDFFile(file)) {
				waterMark(file.getPath(), imageFile, pdfFile, waterMarkName,
						permission); // 添加水印
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 创建PDF文件
	 * 
	 * @param file
	 *            临时文件
	 * @return 成功/失败
	 */
	public static boolean createPDFFile(File file) {
		Rectangle rect = new Rectangle(PageSize.A4);
		Document doc = new Document(rect, 50.0F, 50.0F, 50.0F, 50.0F);
		try {
			PdfWriter.getInstance(doc, new FileOutputStream(file));
			doc.open();

			BaseFont bf = BaseFont.createFont("C:/WINDOWS/Fonts/SIMSUN.TTC,1",
					"Identity-H", true);// 使用系统字体

			Font font = new Font(bf, 14.0F, 0);
			font.setStyle(37); // 设置样式
			font.setFamily("宋体"); // 设置字体

			Paragraph p = new Paragraph("付 款 通 知 书\r\n", font);
			p.setAlignment(1);
			doc.add(p);
			doc.close();
			return true;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;
	}

	public static void waterMark(String inputFile, String imageFile,
			String outputFile, String waterMarkName, int permission) {
		try {
			PdfReader reader = new PdfReader(inputFile);
			PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(
					outputFile));

			BaseFont base = BaseFont.createFont(
					"C:/WINDOWS/Fonts/SIMSUN.TTC,1", "Identity-H", true);// 使用系统字体

			int total = reader.getNumberOfPages() + 1;
			Image image = Image.getInstance(imageFile);

			// 图片位置
			image.setAbsolutePosition(400, 480);
			PdfContentByte under;
			int j = waterMarkName.length();
			char c = 0;
			int rise = 0;
			for (int i = 1; i < total; i++) {
				rise = 400;
				under = stamper.getUnderContent(i);
				under.beginText();
				under.setFontAndSize(base, 30);

				if (j >= 15) {
					under.setTextMatrix(200, 120);
					for (int k = 0; k < j; k++) {
						under.setTextRise(rise);
						c = waterMarkName.charAt(k);
						under.showText(c + "");
					}
				} else {
					under.setTextMatrix(240, 100);
					for (int k = 0; k < j; k++) {
						under.setTextRise(rise);
						c = waterMarkName.charAt(k);
						under.showText(c + "");
						rise -= 18;

					}
				}

				// 添加水印文字
				under.endText();

				// 添加水印图片
				under.addImage(image);

				// 画个圈
				under.ellipse(250, 450, 350, 550);
				under.setLineWidth(1f);
				under.stroke();
			}
			stamper.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		String imageFilePath = "D:/itext2.png"; // 水印图片路径
		String pdfFilePath = "D:/itext.pdf"; // 文件生成路径
		buidPDF(pdfFilePath, imageFilePath, "正版授权", 16);
	}
}


作者:qm4050 发表于2013-6-6 15:02:08 原文链接
阅读:54 评论:0 查看评论

    
[2]第十四学 linux内核——进程管理——进程控制块的内容(3)
    来源: 互联网  发布时间: 2013-11-19

        这节讲进程控制块中的标识进程之间亲属关系的那些域。

       系统创建的进程具有父子关系。所有的进程都是PID为1的init进程的后代(ps -e命令可以看到系统中进程相关的一些信息)。内核在系统启动的最后阶段启动init进程,该进程读取系统的初始化脚本并执行其他的相关程序,最终完成系统启动的整个过程。随后所有创建的进程都是从该进程中创建的子进程。系统中每个进程必有一个子进程,相应的,每个进程也可以拥有一个或多个子进程。拥有统一个父进程的所有进程被称为兄弟。我们在进程PCB中定义了描述这种继承关系的几个域,linux内核(3.9版)这样定义这几个域:

struct task_struct {
     // 1> 状态信息——描述进程的动态变化,如就绪态、等待态、僵死态等。
	 volatile long state;  /* -1 unrunnable, 0 runnable, >0 stopped */
	 
	 // 2> 亲属关系——描述进程的亲属关系,如祖父进程、父进程、养父进程、子进程、兄进程、孙进程等。
	 
	 /*
          * pointers to (original) parent process, youngest child, younger sibling,
          * older sibling, respectively.  (p->father can be replaced with
          * p->real_parent->pid)
          */
         struct task_struct __rcu *real_parent; /* real parent process */
         struct task_struct __rcu *parent; /* recipient of SIGCHLD, wait4() reports */
         /*
          * children/sibling forms the list of my natural children
          */
         struct list_head children;      /* list of my children */
         struct list_head sibling;       /* linkage in my parent's children list */
         struct task_struct *group_leader;       /* threadgroup leader */

	 // 3> 各种标识符——如进程标识符、用户标识符等等用来标识一个进程的数字。
	 // 4> 进程间通信信息——描述多个进程在同一任务上协作工作,如管道、消息队列、共享内存、套接字等。
	 // 5> 时间和定时器信息——描述进程在生存周期内使用CPU时间的统计、计费等信息。
	 // 6> 调度信息——描述进程的优先级、调度策略等信息,如静态优先级、动态优先级、时间片轮转、高优先级以及多级反馈队列等的调度策略。
	 // 7> 文件系统信息——对进程使用文件情况进行记录,如文件描述符、系统打开文件表、用户打开文件表等。
	 // 8> 虚拟内存信息——描述每个进程拥有的地址空间,也就是进程编译连接后形成的空间,这里肯定用到前边提到的分页机制。
	 // 9> 处理器环境信息——描述进程的执行环境(处理器的各种寄存器及堆栈等),这是体现进程动态变化的最主要的场景。
	 	
};

        这里说明一点,一个进程可能有两个父亲,一个为亲生父亲(real_parent),一个为养父(parent),因为父进程有可能在子进程之前销毁,就得给子进程重新找个养父,但大多数情况下,生父和养父是相同的,即real_parent和parent指向同一个位置。

        我们可以通过下面的代码获得指向其父进程的进程控制块:

	struct task_struct *my_parent = current->parent;

        可以按以下方式依次访问子进程:

	struct task_struct *task;
	struct list_head *list;
	
	list_for_each(list, &currnet->children) {
		task = list_entry(list, struct tast_struct, sibling);
		/*task现在指向当前的某个子进程*/
	}

        init进程的进程控制块是作为init_task静态分配的。下面的代码可以很好地演示所有进程之间的关系:

	struct task_struct *task;
	
	for (task = current; task != init_task; task = task->parent)
		;
	/*task 现在指向init*/

        实际上,可以通过这种继承体系从系统的任何一个进程出发找到任意指定的其他进程。但大都数时候,只需呀简单的重复方式就可以遍历系统中所有的子进程,因为我们是通过双向链表组织所有进程的,<linux/sched.h>中给出了获取一个进程的先一个进程的宏(3.9版内核):

	#define next_task(p) \
        list_entry_rcu((p)->tasks.next, struct task_struct, tasks)

        内核也定义了一个遍历整个任务(一个进程也叫一个任务)队列的宏:

	#define for_each_process(p) \
		for (p = &init_task ; (p = next_task(p)) != &init_task ; )

        我们要注意的是,在一个拥有大量进程的系统中通过重复来遍历所有进程的代价是很大的。


 
        
 

作者:bcs_01 发表于2013-6-6 17:33:13 原文链接
阅读:37 评论:0 查看评论

    
[3]State设计模式在服务器软件开发中的应用和思考
    来源: 互联网  发布时间: 2013-11-19

1. C语言实现服务器软件时的常用编程模型

    熟悉服务器软件开发的开发人员都知道使用Producer-Consumer模型加上线程池隔离消息的接收和消息的处理,但到消息的具体处理时一般是构建一个实例状态和消息类型的二维矩阵,矩阵的内容是函数指针。本文默认认为你熟悉State Design Pattern,主要介绍用State Design Pattern来替换这个方法。


2. State模式的应用

使用State设计模式可以将所有的消息的处理放到具体的State对象中,这样将实例状态这个维度分解为不同的消息对象,而将消息类型这个维度封装到具体的State对象中,就可以使用面向对象的思想来实现服务器软件。


3. State模式的增强

a.  一般在设计状态对象的时候,状态对象里面不放任何属性,完全把状态对象做成一个方法的集合。

b. 如果a成立的话,可以进一步把每个状态对象作为Singleton和Immutable来实现。

采用以上方法的好处是,整个系统中所有的session就可以共享这些状态对象,避免了需要不停的创建和销毁状态对象,极大的提升性能。


4. 关于Servlet Container实现的思考

a. 其实我们考虑HttpServlet的实现,其实我们自己在写HttpServlet的时候最好不要增加字段,否则就会出现同步的问题。

b. 虽然HttpServlet没有使用Singleton模式,但是一般的Servlet Container只会创建一个HttpServlet。

c. HttpServlet就是就是一个方法的集合,有doGet, doPost, doMethod...

d. XML其实就是就应和了State这个维度

综合以上思考,其实Servlet Container实现就是应用了State设计模式

作者:greencacti 发表于2013-6-6 22:35:03 原文链接
阅读:52 评论:0 查看评论

    
最新技术文章:
▪主-主数据库系统架构    ▪java.lang.UnsupportedClassVersionError: Bad version number i...    ▪eclipse项目出现红色叉叉解决方案
▪Play!framework 项目部署到Tomcat    ▪dedecms如何做中英文网站?    ▪Spring Batch Framework– introduction chapter(上)
▪第三章 AOP 基于@AspectJ的AOP    ▪基于插件的服务集成方式    ▪Online Coding开发模式 (通过在线配置实现一个表...
▪观察者模式(Observer)    ▪工厂模式 - 程序实现(java)    ▪几种web并行化编程实现
▪机器学习理论与实战(二)决策树    ▪Hibernate(四)——全面解析一对多关联映射    ▪我所理解的设计模式(C++实现)——解释器模...
▪利用规则引擎打造轻量级的面向服务编程模式...    ▪google blink的设计计划: Out-of-Progress iframes    ▪FS SIP呼叫的消息线程和状态机线程
▪XML FREESWITCH APPLICATION 实现    ▪Drupal 实战    ▪Blink: Chromium的新渲染引擎
▪(十四)桥接模式详解(都市异能版)    ▪你不知道的Eclipse用法:使用Allocation tracker跟...    ▪Linux内核-进程
▪你不知道的Eclipse用法:使用Metrics 测量复杂度    ▪IT行业为什么没有进度    ▪Exchange Server 2010/2013三种不同的故障转移
▪第二章 IoC Spring自动扫描和管理Bean    ▪CMMI简介    ▪目标检测(Object Detection)原理与实现(六)
▪值班总结(1)——探讨sql语句的执行机制    ▪第二章 IoC Annotation注入    ▪CentOS 6.4下安装Vagrant
▪Java NIO框架Netty1简单发送接受    ▪漫画研发之八:会吃的孩子有奶吃    ▪比较ASP和ASP.NET
▪SPRING中的CONTEXTLOADERLISTENER    ▪在Nginx下对网站进行密码保护    ▪Hibernate从入门到精通(五)一对一单向关联映...
▪.NET领域驱动设计—初尝(三:穿过迷雾走向光...    ▪linux下的块设备驱动(一)    ▪Modem项目工作总结
▪工作流--JBPM简介及开发环境搭建    ▪工作流--JBPM核心服务及表结构    ▪Eclipse:使用JDepend 进行依赖项检查
▪windows下用putty上传文件到远程Linux方法    ▪iBatis和Hibernate的5点区别    ▪基于学习的Indexing算法
▪设计模式11---设计模式之中介者模式(Mediator...    ▪带你走进EJB--JMS编程模型    ▪从抽象谈起(二):观察者模式与回调
▪设计模式09---设计模式之生成器模式(Builder)也...    ▪svn_resin_持续优化中    ▪Bitmap recycle方法与制作Bitmap的内存缓存
▪Hibernate从入门到精通(四)基本映射    ▪设计模式10---设计模式之原型模式(Prototype)    ▪Dreamer 3.0 支持json、xml、文件上传
▪Eclipse:使用PMD预先检测错误    ▪Jspx.net Framework 5.1 发布    ▪从抽象谈起(一):工厂模式与策略模式
▪Eclipse:使用CheckStyle实施编码标准    ▪【论文阅读】《Chain Replication for Supporting High T...    ▪Struts2 Path_路径问题
▪spring 配置文件详解    ▪Struts2第一个工程helloStruts极其基本配置    ▪Python学习入门基础教程(learning Python)--2 Python简...
▪maven springmvc环境配置    ▪基于SCRUM的金融软件开发项目    ▪software quality assurance 常见问题收录
▪Redis集群明细文档    ▪Dreamer 框架 比Struts2 更加灵活    ▪Maven POM入门
▪git 分支篇-----不断更新中    ▪Oracle非主键自增长    ▪php设计模式——UML类图
▪Matlab,Visio等生成的图片的字体嵌入问题解决...    ▪用Darwin和live555实现的直播框架    ▪学习ORM框架—hibernate(二):由hibernate接口谈...
▪(十)装饰器模式详解(与IO不解的情缘)    ▪无锁编程:最简单例子    ▪【虚拟化实战】网络设计之四Teaming
▪OSGi:生命周期层    ▪Javascript/Jquery——简单定时器    ▪java代码 发送GET、POST请求
▪Entity Framework底层操作封装(3)    ▪HttpClient 发送GET、POST请求    ▪使用spring框架,应用启动时,加载数据
▪Linux下Apache网站目录读写权限的设置    ▪单键模式的C++描述    ▪学习ORM框架—hibernate(一):初识hibernate
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3