存档

文章标签 ‘网摘’

php压缩/解压zip的利器-PclZip

2011年3月31日 没有评论

PclZip简介与使用

PclZip介绍
PclZip library能够压缩与解压缩Zip格式的压缩档(WinZip、PKZIP);且能对此类类档案进行处理,包括产生压缩档、列出压缩档的内容以及解压缩档案等等。由于能够在伺服器端进行压缩与解压缩的动作,所以相当方便使用。
PclZip定义一个PclZip类别,其类别物件可视为一个ZIP档案,亦提供method来进行处理。

如何使用PclZip
1.基础
所有的功能都由pclzip.lib.php这个档案提供,PclZip library可于其首页(www.phpconcept.net/pclzip/index.en.php)下载。所有的PKZIP档案其实就是一个PclZip的类别物件。当产生一个PclZip档案(ie, PclZip类别物件),就会先产生一个压缩档,且档名已经指定,但此压缩档的内容尚未存在:

< ?PHP
require_once('pclzip.lib.php');
$archive = new PclZip("archive.zip");
?>

此物件提供了一些public method可用来处理此档案。

2.参数
每一个method有其各自可使用的参数,包括有必须与非必须的参数:

< ?PHP
require_once('pclzip.lib.php');
$archive = new PclZip('archive.zip');

$v_list = $archive->add('dev/file.txt',
PCLZIP_OPT_REMOVE_PATH, 'dev');
?>

上例中的’dev/file.txt’就是必须参数;’PCLZIP_OPT_REMOVE_PATH’则为非必须参数。当然有些method也可以只包含非必须的参数:

< ?PHP
$list = $archive->extract(PCLZIP_OPT_PATH, "folder",
PCLZIP_OPT_REMOVE_PATH, "data",
PCLZIP_CB_PRE_EXTRACT, "callback_pre_extract",);
?>

上例中原本压缩档内档案存放的路径为/data,不过你可以指定解压缩至/folder中。此外,在解压缩之前,会呼叫callback function(’callback_pre_extract()’),此function可让使用者在解压缩的过程中变更档案存放路径与档名,或是选择某些档案不解压缩。
所有可用的非必要参数可参考网址(www.phpconcept.net/pclzip/man/en/index.php)。

3.回传值
每个method所回传的值可能会不同,将会在每个method中说明。不过大部分的method回传0、error或是阵列。

4.错误处理
从版本1.3之后,错误处理已经整合至PclZip类别中,当一个method回传错误码,可以得知一些额外的讯息以方便错误处理:
* errorName():回传错误名称
* errorCode():回传错误码
* errorInfo():回传错误的描述

接下来会举几个例子来说明如何使用PclZip。

PclZip实例1、产生ZIP压缩档
PclZip($zipname):为PclZip constructor,$zipname为PKZIP压缩档的档名。
主要是产生一个PclZip物件,即一个PKZIP压缩档;但此时,只有压缩档产生出来,并做一些检查(例如是否有开启zlib extension…等),除此之外,并没有做其他动作。
create($filelist, [optional arguments list]):将参数$filelist指定的档案或目录(包含当中所有档案与子目录)加入上述所产生的压缩档中。
而非必要的参数则能够修改压缩档内的档案存放路径。
此method可用的参数可以参考网志(www.phpconcept.net/pclzip/man/en/index.php)。

下面的示例说明如何产生PKZIP压缩档(档名为archive.zip),并将file.txt、data/text.txt以及目录folder(包含当中的档案与子目录)加入刚刚产生的archive.zip中:

< ?PHP
include_once('pclzip.lib.php');
$archive = new PclZip('archive.zip');
$v_list = $archive->create('file.txt,data/text.txt,folder');
if ($v_list == 0) {
die("Error : ".$archive->errorInfo(true));
}
?>

下面的示例说明基本上与上例一样产生archive.zip,但在将file.txt与text.txt压缩于其中时,将路径由data/改为install/ ;因此,在archive.zip中这两个档案的路径会是install/file.txt与install/text.txt

< ?PHP
include_once('pclzip.lib.php');
$archive = new PclZip('archive.zip');
$v_list = $archive->create('data/file.txt,data/text.txt',
PCLZIP_OPT_REMOVE_PATH, 'data',
PCLZIP_OPT_ADD_PATH, 'install');
if ($v_list == 0) {
die("Error : ".$archive->errorInfo(true));
}
?>

PclZip实例2、列出压缩档内容
listContent( ) :列出压缩档中的内容,包括档案的属性与目录:

< ?PHP
include_once('pclzip.lib.php');
$zip = new PclZip("test.zip");

if (($list = $zip->listContent()) == 0) {
die("Error : ".$zip->errorInfo(true));
}

for ($i=0; $i<sizeof ($list); $i++) {
for(reset($list[$i]); $key = key($list[$i]); next($list[$i])) {
echo "File $i / [$key] = ".$list[$i][$key]."<br>";
}
echo "<br />";
}
?></sizeof>

上例将会回传结果:
File 0 / [filename] = data/file1.txt
File 0 / [stored_filename] = data/file1.txt
File 0 / [size] = 53
File 0 / [compressed_size] = 36
File 0 / [mtime] = 1010440428
File 0 / [comment] =
File 0 / [folder] = 0
File 0 / [index] = 0
File 0 / [status] = ok

File 1 / [filename] = data/file2.txt
File 1 / [stored_filename] = data/file2.txt
File 1 / [size] = 54
File 1 / [compressed_size] = 53
File 1 / [mtime] = 1011197724
File 1 / [comment] =
File 1 / [folder] = 0
File 1 / [index] = 1
File 1 / [status] = ok

PclZip实例3、解压缩档案
extract([options list]) :解压缩PKZIP中的档案或目录。
[options list]可用的参数可参考网址(www.phpconcept.net/pclzip/man/en/index.php)。这些参数能让使用者在解压缩的时候有更多的选项,譬如指定变更解压缩档案的路径、指定只解压缩某些档案或不解压缩某些档案或者是将档案解压缩成字串输出(可用于readme档)。

下例是一个简单的解压缩档案示例,将压缩档archive.zip内的档案解压缩至目前的目录:

< ?PHP
require_once('pclzip.lib.php');
$archive = new PclZip('archive.zip');

if ($archive->extract() == 0) {
die("Error : ".$archive->errorInfo(true));
}
?>

下例是进阶的解压缩档案使用,archive.zip中所有档案都解压缩于data/中,而特别指明在install/release中的所有档案也直接丢于data/中,而非data/install/ release:

< ?PHP
include('pclzip.lib.php');
$archive = new PclZip('archive.zip');
if ($archive->extract(PCLZIP_OPT_PATH, 'data',
PCLZIP_OPT_REMOVE_PATH, 'install/release') == 0) {
die("Error : ".$archive->errorInfo(true));
}
?>

本文转自 http://www.ccvita.com/59.html

在php中使用 TCPDF 动态创建 PDF [转载]

2010年9月13日 没有评论

简介

TCPDF 是托管在 Sourceforge.net 上最活跃的项目之一,其完全在 PHP 上实现了强大的 PDF 生成引擎。这使得其更容易安装,即使在您无法访问系统目录或编译自己的代码的站点上。同时,通过让您直接查看 PHP 代码生成的结果,而不使用任何中间步骤,这使迭代开发更加容易。

TCPDF 支持一系列有用的图像格式,包括 SVG 矢量格式和位图格式,如 JPEG 和 PNG。一个简单独立的实用工具让您可以处理 TrueType、OpenType、PostScript Type 1 和 CID-0 字体,使它们可以添加到 TCPDF 创建的文档。您可以使用 TCPDF 来生成无数 1-D 和 2-D 条形码格式,且它支持所有常见的 PDF 功能,如书签、文档链接、压缩、注释、文档加密和数字签名。

用 PHP 编写 TCPDF 并使用其页面,这使其易于创建并部署 PDF 生成的 Web 页面。在您使用任何支持 Web 服务器和您最喜欢的 PHP 开发环境开发并部署 TCPDF 时,我将使用如下工具:

  • Eclipse V3.5.2 — 我最新欢的开源开发环境之一,其支持广泛的编程语言和环境。
  • PHP Development Tools V2.2.0 — 适用于 Eclipse 的 PHP 插件。
  • MAMP Pro V1.9 — 适用于 Mac OS X 的方便的程序包,其通过有用的 GUI 前端在一个隔离的环境中提供 Apache、MySQL 和 PHP。虽然 Mac OS X 附带安装 Apache 和 PHP,但我还是选择使用此工具,因为其提供了一系列稳定且容易分离的 Web 服务器/数据库/PHP。
  • TCPDF V5.0.006 — TCPDF 当前的稳定版本。

您可以在 参考资料 部分找到以上所有工具的下载链接。

如果您已经安装了 PHP,我们就来看看如何在您自己的网站上使用 TCPDF。我们将检查安装过程,然后我们将使用 PHP 生成一个显示可能来自任何电子商务站点的发票式样(invoice-style)文档的网页。此后,我们将使用 TCPDF 来创建一个使用类似格式的可打印的 PDF 版发票。


回页首

安装 TCPDF

当您从 Sourceforge.net 下载 TCPDF 时,它提供一个自包含的 ZIP 存档,也就是说,您可以使用您最喜欢的 ZIP 提取工具来解压存档,您最终将获得一个包含您所需要的所有信息的 TCPDF 目录。

如果您将 TCPDF 目录添加到您的 web 文档目录,则您可以通过加载 doc/index.html 访问 TCPDF 文档并通过加载 examples/index.php 文件查看任何示例,这也可在 TCPDF 网站上找到(请参考 参考资料)。

然而在您可以查看示例以前,您需要配置您的 TCPDF 安装。


回页首

配置 — 类 UNIX 系统

如果您正在类 UNIX® 系统上安装 TCPDF,则您需要更改文件模式,因为它们并没有全部被标记为可执行。在 Microsoft® Windows® 系统上存在一个创建 TCPDF 存档的副作用。幸运的是,很容易在来自 shell 的一个失衡中调整这些(请参考 清单 1)。您还需要确保缓存和图像目录是可写入的,因为 TCPDF 将在那里存储临时文件。

下一步,您需要将文件分配给用户和组 web 服务器;虽然这通常是用户 www 和组 www,但是这将取决于您的系统。如果您正在您的个人网站领域以外运行 TCPDF,(在您的主目录下通常是 public_html),则您可以跳过此步骤。
清单 1. 调整文件模式和所有权

$ cd tcpdf
$ find . -type f | xargs chmod -x
$ chmod +w cache images
$ chown -R www:www .

请注意命令可能使用 . 代替 : 来在一些系统上分离用户和组;如果出现问题,则检查其文档详细资料。


回页首

适用于每个人的配置

使用您最喜欢的文本编辑器,加载 config/tcpdf_config.php 文件。这就是 TCPDF 的配置设置并让您控制库的默认设置,并告诉它如何找到自己的支持文件。

在 tcpdf_config.php 中您想要变更的设置包括:

  • PDF_PAGE_FORMAT — 如果您不使用公制页面格式,则设置其为 letter。除非您手头有一些非常奇特方法,否则 TCPDF 可能比您的打印机支持更大的页面尺寸。
  • PDF_UNIT — 如果您想用点而不是毫米来布置您的 PDF 文档,则设置其为 pt
  • PDF_CREATORPDF_AUTHOR — 一旦您的 PDF 生成代码忘了设置它们,则默认文档创建者和作者。

您可以在您的 PHP 代码中调整这些设置中的任意一个,如果无法确定也无需担心(例如,如果您在此处设置的是像模式文档布局,您仍然可以创建景观文档)。

假设您没有移动文件和目录远离其初始位置,则通过默认配置设置,TCPDF 应该没有呈现任何其附带示例的问题。

在这一点上,您可以加载示例文件以确保您拥有一个正在运行的 TCPDF 安装。让我们使用它来创建一个可打印版的发票。


回页首

创建发票

在您创建了电子商务网站以后,您的客户将订购一些物品,而您将收取他们的货款。虽然这很不错,但是他们将想得到某种发票,以防订单错误或他们的信用卡公司搞混了付款,。

让我们制作一个合理美观的发票网页,这样他们可以看到他们已经订购了什么和您将要向他们收取什么。


回页首

第一个版本 — Web 页面

使用我最喜欢的 PHP 开发环境,我已经创建了一个新的发票文件夹,其包含如下文件:

  • Invoice.php — PHP 生成发票
  • Invoice.css — CSS 式样的发票
  • Azuresol_OnyxTree-S.png — Azuresol 的 “OnyxTree S”,您将其用作您公司的标志(来自 iconfinder.com Web 站点的免费图标(请参考 参考资料))
  • gentleface_print.png — gentleface 的 “Print”,您将使用其触发 PDF 生成(来自 iconfinder.com 的另一个免费图标)

在 Invoice.php 内部,检查看看是否使用 PDF 参数调用页面(请参考 清单 2)。如果不是,用户想要一个正常 web 页面,这样您就可以使用 generateHTML 函数(请参考 清单 3)显示页面。稍后您将看到 generatePDF 函数,但是可以肯定使用它来生成发票数据的 PDF 没任何问题。
Listing 2. 页面生成控制代码

if( array_key_exists( 'PDF', $_REQUEST ) ) {
    generatePDF( $invoiceData );
} else {
    generateHTML( $invoiceData );
}

$invoiceData 阵列拥有所有发票数据;虽然您将直接在 Invoice.php 上创建它,但是您可以设想数据来自于数据库、web 服务或某种网上购物车系统。
清单 3. 生成 HTML

function generateHTML( $data ) {
?>
... HTML code was here ...
<?php
    foreach( $data['items'] as $item ) {
        echo '<tr>' . "\n";
        echo '    <td>' . $item[0] . "</td>\n";
        echo '    <td>' . $item[1] . "</td>\n";
        echo '    <td>' . $item[2] . "</td>\n";
        echo '    <td>' . $item[3]. "</td>\n";
        echo "</tr>\n";
    }
?>
... HTML code was here ...
<?php
    echo '<td>' . $data['total'] . "</td>\n";
?>
... HTML code was here ...
<?php
    echo 'Invoice prepared for ' . $data['user'] . ' on ' . $data['date'] . "\n";
?>
... HTML code was here ...
<?php

}

为了简单明了我已经删掉了此处所有的 HTML 标记代码;您可以在位于 CreatingPDFs-Invoice.zip 存档文件中的 Invoice.php 上看到它, CreatingPDFs-Invoice.zip 存档文件可以在 下载 部分找到。

使用传递给函数的发票信息作为 $data,创建一个包含每个项目一行的表、及其数量、单价和总价的表。在表的末尾,添加一个包含订单的总成本的行。页脚包含用户 ID 和发票生成的日期/时间。

当然,简单明了的事情,以及您在自己站点上实现它的时候所面临的主要挑战,将与您的数据源互动,并获得恰到好处的 CSS 式样。
图 1. 光彩夺目的网页发票
截图显示了一个有吸引力的可打印发票示例;Sumatra Special 的最大数量为 24,而其他的则处于 1 到 5 之间

我完全虚构了一家提供优良咖啡和茶的 South Seas Pacifica 公司,显然我对 Sumatran 品种深深的吸引了。至少他们的价格很吸引人!

右下角的打印机图标是诱人的,您希望能够有单击那里并获得打印发票。这里就是 TCPDF 的用武之地。并不只是打印网页,您将为我们尊贵的客户提供一个时髦的 PDF 版本,这会使他们在轻松的状态下完成打印。


回页首

第二个版本 — PDF

现在,您的网页发票看起来很好,您需要创建可以打印的 PDF 版本。

回忆 清单 2,将 PDF 参数 (http://…/Invoice.php?PDF) 与 Invoice.php 页面一起加载将调用具有相同数据的 generatePDF 函数(请参考清单 4)。
清单 4. 生成 PDF 发票

function generatePDF( $data ) {
    # Create a new PDF document.
    $pdf = new InvoicePdf( $data, 'P', 'pt', 'LETTER' );

    # Generate the invoice.
    $pdf->CreateInvoice();

    # Output the PDF document.
    $pdf->Output( 'Your_Invoice.pdf', 'D' );
}

generatePDF 函数创建了一个 InvoicePdf 对象,调用其 CreateInvoice 方法,然后发送一个名为 Your_Invoice.pdf 的下载 PDF 文档给用户的浏览器。虽然这看起来非常简单,但是隐藏了必须自己创建 InvoicePdf 类的事实,且需要复制原始发票式样。让我们来看看这是如何进行的。

InvoicePdf 类扩展了 TCPDF 的 TCPDF 类,这是主 PDF 生成引擎。在构造函数(请参考 清单 5)中,使用传入的 $orientation(页面方向)、$unit(计量单位)和 $format(页 面大小)初始化父类。TCPDF 构造函数的最后三个参数表明输入的是 Unicode(默认为 Ture),已生成 PDF 的字符编码格式是 UTF-8,且您不应使用磁盘缓存 (False)。虽然在创建 PDF 时,磁盘缓存减少了内存占用,但是速度变得更慢了。因为我们的文件不大也不复杂,所以无需权衡这一点。

在初始化父类以后,将参考存储到发票数据以便今后使用。下一步,使用 SetMargins 方法将页边距设置为宽度 72 点、高度 36 点。SetMargins 最终参数表明您正在用自己的值来重写默认页边距。使用 SetAutoPageBreaks 方法,可在从底部算起有 36 点高时告知 TCPDF 自动创建新页面。
清单 5. InvoicePdf 类构造函数

function __construct( $data, $orientation, $unit, $format ) {
    parent::__construct( $orientation, $unit, $format, true, 'UTF-8', false );

    $this->invoiceData = $data;

    # Set the page margins: 72pt on each side, 36pt on top/bottom.
    $this->SetMargins( 72, 36, 72, true );
    $this->SetAutoPageBreak( true, 36 );

    # Set document meta-information
    $this->SetCreator( PDF_CREATOR );
    $this->SetAuthor( 'Chris Herborth (chrish@pobox.com)' );
    $this->SetTitle( 'Invoice for ' . $this->invoiceData['user'] );
    $this->SetSubject( "A simple invoice example for 'Creating PDFs on
the fly with TCPDF' on IBM's developerWorks" );
    $this->SetKeywords( 'PHP, sample, invoice, PDF, TCPDF' );

    //set image scale factor
    $this->setImageScale(PDF_IMAGE_SCALE_RATIO); 

    //set some language-dependent strings
    global $l;
    $this->setLanguageArray($l);
}

在建立边距以后,设置 PDF 文档元信息。这将显示在您最喜欢的 PDF 查看器中的文档属性窗口。这些仅仅是字符串,因此您可以将它们设置为任何对您的应用程序有意义的信息。

使用 setImageScale 方法,在 TCPDF 的配置文件中使用默认图像缩放比例设置。这是用于将位图图像的大小从像素大小调整为适合的页面。

最后,使用 setLanguageArray 来为 PDF 文件设置一些语言相关的字符串;通过 TCPDF 主配置,这些会在特定语言配置文件中定义。

清单 6 中,您重写了 Header 方法,其被调用以便生成每一个页面的标题内容。首先,定义一些变量。以 14 点的 bigFont 大小开始,您会计算出商标图像的相对大小和相对于 bigFont 大小的正常文本大小。然后您将深入 TCPDF 调用。

ImagePngAlpha 方法插入放置在其左上角宽 72 点、高 32 点的商标图像,其与您以前的边距设置相匹配。因为它是一个正方形的图像,所以您可以指定相同的宽度和高度(已计算的 $imageScale)。您将要说明它是一个 PNG 图像,因为此调用实际可以插入 PNG 和 JPEG 图像(如果在您的 PHP 安装中已安装了 GD 库,则其也可以加载任何由 GD 支持的图像)。下一步,指定一个空值,因为您没有为此图像添加 PDF 链接(通过 AddLink 方法创建)目标。再下一步,使用 T 来说明您想在图像区域的右上角制定下一个 PDF 对象。最后,告知 TCPDF 不要调整图像大小,既保持初始的 72 dpi(一个通用的屏幕分辨率),且图像在页面上应该左对齐。

显然,ImagePngAlpha 方法对如何在 PDF 文档中将图像添加到页面的问题上给予您大量的控制(请参考清单 6)。
清单 6. 页面标题的生成

public function Header() {
    global $webcolor;

    # The image is this much larger than the company name text.
    $bigFont = 14;
    $imageScale = ( 128.0 / 26.0 ) * $bigFont;
    $smallFont = ( 16.0 / 26.0 ) * $bigFont;

    $this->ImagePngAlpha('Azuresol_OnyxTree-S.png', 72, 36, $imageScale,
$imageScale, 'PNG', null, 'T', false, 72, 'L' );
    $this->SetFont('times', 'b', $bigFont );
    $this->Cell( 0, 0, 'South Seas Pacifica', 0, 1 );
    $this->SetFont('times', 'i', $smallFont );
    $this->Cell( $imageScale );
    $this->Cell( 0, 0, '', 0, 1 );
    $this->Cell( $imageScale );
    $this->Cell( 0, 0, '31337 Docks Avenue,', 0, 1 );
    $this->Cell( $imageScale );
    $this->Cell( 0, 0, 'Toronto, Ontario', 0, 1 );

    $this->SetY( 1.5 * 72, true );
    $this->SetLineStyle( array( 'width' => 2, 'color' =>
array( $webcolor['black'] ) ) );
    $this->Line( 72, 36 + $imageScale, $this->getPageWidth() - 72, 36
+ $imageScale );
}

在标题上放置商标图像以后,设置字体(粗体 Times,使用您的 bigFont 大小),然后创建一些单元格来存放公司的名称和地址信息。这些单元格在 HTML 上包含文本,而且有点像表格单元格。Cell 方法采用这些参数(实际上更多;参考 TCPDF 文档获取完整列表):

  • Width — 单元格宽度;如果设置为 0,则单元格一直扩展到右侧边距(或者如果您使用的是从右到左的语言,则扩展到左侧边距)。
  • Height — 单元格高度;如果设置为 0,则单元格高度将扩展,以便能放得下内容。
  • Text — 该文本在单元格内绘制,使用当前的字体和颜色设置。
  • Border — 说明是否边界应该根据单元格制定。在这种情况下,由于您正在使用 0,所以您无需任何边界。您也可以传递 1 来根据单元格制定完整的边界,或字符串以便说明特定的边界。
  • Position — 说明何处创建下一个单元格;1 表明您需要其在下一行的开始出显示,但是您可以使用 0 在此单元格旁边添加下一个单元格,或者 2 以停留在当前的 X 坐标并移到下一行。

最后,我们的 Header 方法在标题的底部绘制了一条两点黑线,一直穿过页面的内容区域。图 2 显示了将如何在页面上查看,如 Mac OS X 的 预览应用程序所呈现的那样。
图 2. 打印标题,就像网页标题
截图对左边的地址显示了带有图形商标的标题,名称使用大的、粗体的字体,且地址使用斜体

现在您已经创建了一个原始标题的合理副本,您也需要重写 Footer 方法,以便于您生成页脚。这非常简单,只包含用户 ID 和发票信息,其通过另外一个两点黑线从剩余的页面中分离出来。

您尚未看到此方法的唯一部分正在使用使用一个负值调用 SetY 方法。在您这样做的时候,相对于页面的底部设置当前的 Y。在这里,您将要为页面页脚留下大量的空间,以确保您的绘制不太接近底部边距(请参考清单 7)。
清单 7. 页面页脚的生成

public function Footer() {
    global $webcolor;

    $this->SetLineStyle( array( 'width' => 2, 'color' =>
array( $webcolor['black'] ) ) );
    $this->Line( 72, $this->getPageHeight() - 1.5 * 72 - 2,
$this->getPageWidth() - 72, $this->getPageHeight() - 1.5 * 72 - 2 );
    $this->SetFont( 'times', '', 8 );
    $this->SetY( -1.5 * 72, true );
    $this->Cell( 72, 0, 'Invoice prepared for ' .
$this->invoiceData['user'] . ' on ' . $this->invoiceData['date'] );
}

在您创建页面时,显示出来的就像发票的网络版,只是减去了打印机的图标。您已经中断了此操作,因为这是打印版本(它是多余的)。图 3 得出了结果。
图 3. 已打印的页脚
截图显示了页脚,其对带有收件人、时间和日期的详细信息用粗体水平线标出

在这一点上,您拥有附带美观的页眉和页脚的空白页。您需要为此添加实际的发票内容,这样做很有用。

在使用 AddPage 方法启动新的页面以后(在这种情况下,这是唯一的页面),将字体设置为 11 点 Helvetica 并将插入点从页面的顶部移动到 144 点处。在表开始以前,这会在页眉以下给我们留出一个小空间。

下一步,要计算您将需要使表居中的缩进量,这基于页面宽度、两个 72 点边距、一个宽列和三个正常列。

在此之后,您将使用以前计算出的值并描绘出每个单元格的完全边界,来创建一系列单元格以呈现列标题。您还要右对齐数字列的标题因为它们通过值进行排列。在标题单元格的最后,您要调用 Ln 方法以便向下移动到下一行的开始。

通过在发票上迭代项目的 foreach 循环,您为每一个内容行进行同类型的布局(请参考清单 8)。
清单 8. 页面内容的生成

public function CreateInvoice() {
    $this->AddPage();
    $this->SetFont( 'helvetica', '', 11 );
    $this->SetY( 144, true );

    # Table parameters
    #
    # Column size, wide (description) column, table indent, row height.
    $col = 72;
    $wideCol = 3 * $col;
    $indent = ( $this->getPageWidth() - 2 * 72 - $wideCol - 3 * $col ) / 2;
    $line = 18;

    # Table header
    $this->SetFont( '', 'b' );
    $this->Cell( $indent );
    $this->Cell( $wideCol, $line, 'Item', 1, 0, 'L' );
    $this->Cell( $col, $line, 'Quantity', 1, 0, 'R' );
    $this->Cell( $col, $line, 'Price', 1, 0, 'R' );
    $this->Cell( $col, $line, 'Cost', 1, 0, 'R' );
    $this->Ln();

    # Table content rows
    $this->SetFont( '', '' );
    foreach( $this->invoiceData['items'] as $item ) {
        $this->Cell( $indent );
        $this->Cell( $wideCol, $line, $item[0], 1, 0, 'L' );
        $this->Cell( $col, $line, $item[1], 1, 0, 'R' );
        $this->Cell( $col, $line, $item[2], 1, 0, 'R' );
        $this->Cell( $col, $line, $item[3], 1, 0, 'R' );
        $this->Ln();
    }

    # Table Total row
    $this->SetFont( '', 'b' );
    $this->Cell( $indent );
    $this->Cell( $wideCol + $col * 2, $line, 'Total:', 1, 0, 'R' );
    $this->SetFont( '', '' );
    $this->Cell( $col, $line, $this->invoiceData['total'], 1, 0, 'R' );
}

代码的最后一位呈现总行数。这演示了您如何可以更容易地在单元格之间变更字体式样(通过调用 SetFont 方法来打开或关闭粗体)。第一个文本单元格的宽度被设置横跨表的前三列,因为您需要发票总数出现在最后一列的底部。

一旦您完成后,发票项目表看起来将非常的棒(请参考图 4)。
图 4. 发票上的项目
附带数量、价格和总数的项目格式化清单的截图

通过逻辑地布局文本单元格,您已经用适合打印的格式重新创建了初始的网页。在无需变更网页本身或任何基础数据的情况下,TCPDF 让您将创建 PDF 的支持添加到您现存的 PHP 网页上。


回页首

结束语

本文向您介绍了 TCPDF,它是一种用于生成 PDF 文档的流行 PHP 库。TCPDF 无需额外的库就能执行此操作,并使其作为您现有 PHP 网站的一部分易于安装。本文向您显示了在类 UNIX 系统中安装并配置 TCPDF 的概述。然后您创建了一个简单的基于 Web 的发票,类似于您可能在一家从事异国热饮的电子商务站点上所看到的诸如此类的事情。

一旦您拥有一个看上去像专业发票的网页,您就可以扩展 TCPDF 类来生产一个 PDF 版本的发票,即客户可以轻松地下载或打印。重写 HeaderFooter 方法让我们用相似的方式建立页面,然后您可以编写一个附加方法来布置发票项目作为一个表。


回页首

下载

描述 名字 大小 下载方法
文章源代码 os-tcpdf-CreatingPDFs-Invoice.zip 21KB HTTP

关于下载方法的信息

本文转载自IBM.COM

http://www.ibm.com/developerworks/cn/opensource/os-tcpdf/index.html?ca=drs-

mysql group by排序问题【转】

2009年10月18日 1 条评论

类如 有一个 帖子的回复表,posts( id , tid , subject , message ,  dateline ) ,

id为 自动增长字段, tid为该回复的主题帖子的id(外键关联),  subject 为回复标题, message 为回复内容, dateline 为回复时间,用UNIX 时间戳表示,

现在要求 选出 前十个来自不同主题的最新回复

SELECT * FROM posts GROUP BY  tid  LIMIT 10

这样一个sql语句选出来的并非你想要的 最新的回复,而是最早的回复,实际上是某篇主题的第一条回复记录!

也就是说 GROUP BY 语句没有排序,那么怎么才能让 GROUP 按照 dateline 倒序排列呢?加上 order by 子句?

看下面:

SELECT * FROM posts GROUP BY  tid  ORDER BY dateline DESC LIMIT 10

这条语句选出来的结果和上面的完全一样,不过把结果倒序排列了,而选择出来的每一条记录仍然是上面的记录,原因是 group by 会比 order by 先执行,这样也就没有办法将 group by 之前,也就是在分组之前进行排序了, 有网友会写出下面的sql 语句:

SELECT * FROM posts GROUP BY  tid DESC ORDER BY dateline DESC LIMIT 10

也就是说 在 GROUP BY 的字段 tid 后面加上递减顺序,这样不就可以取得分组时的最后回复了吗?这个语句执行结果会和上面的一模一样,这里加上 DESC 和ASC对执行结果没有任何影响!其实这是一个错误的语句,原因是GROUP BY 之前并没有排序功能,mysql 手册上面说,GROUP BY 时是按照某种顺序排序的,某种顺序到底是什么顺序?其实根本没有顺序,因为按照tid分组,其实也就是说,把tid相等的归纳到一个组,这样想的话,GROUP BY tid DESC 可以认为是在按照 tid 分组的时候,按照tid进行倒序排列,这不扯吗,既然是按照tid分组,当然是tid相等的归到一组,而这时候按照tid倒叙还是升序有个P用!

于是有网友发明下面的语句:

SELECT * FROM posts GROUP BY  tid , dateline DESC ORDER BY dateline DESC LIMIT 10

心想这样我就可以在分组前按照  dateline 倒序排列了,其实这个语句并没有起到按照tid分组的作用,原因还是上面的,在group by 字段后加 desc 还是 asc 是错误的写法,而这种写法 网友本意是想 按照 tid 分组,并且在分组的时候按照 dateline排倒序!而实际这句相当于下面的写法:(去掉 GROUP BY 字段后面的 DESC)

SELECT * FROM posts GROUP BY  tid , dateline ORDER BY dateline DESC LIMIT 10

也就是说,按照 tid 和 dateline 联合分组,只有在记录tid和dateline 同时相等的时候才归纳到一组,这显然不可能, 因为 dateline 时间线基本上是唯一的!

有人写出下面的语句:

SELECT *,max(dateline) as max_line FROM posts GROUP BY  tid ORDER BY dateline DESC LIMIT 10

这条语句的没错是选出了最大发布时间,但是你可以对比一下 dateline 和 max_dateline 并不相等!(可能有相当的情况,就是分组的目标记录只有一条的时候!)

为什么呢?原因很简单,这条语句相当于是 在group by 以后选出 本组的最大的 发布时间!对分组没有起到任何影响!因为SELECT子句是最后执行的!

后来更有网友发明了下面的写法!

SELECT *,max(dateline) as max_line FROM posts GROUP BY  tid HAVING dateline=max(dateline)

ORDER BY dateline DESC LIMIT 10

这条语句的预期结果和想象中的并不相同!因为你会发现,分组的结果中大量的记录没有了!为什么?因为 HAVING 是在分组的时候执行的,也就说:在分组的时候加上一个这样的条件:选择出来的 dateline 要和 本组最大的dateline 相等,执行的结果和下面的语句相同:

SELECT *,max(dateline) as max_line FROM posts GROUP BY  tid HAVING count(*)=1

ORDER BY dateline DESC LIMIT 10

看了这条sql语句是不是明白了呢?

dateline=max(dateline) 只有在分组中的记录只有一条的时候才成立,原因很明白吧!只有一条他才会和本组的最大发布时间相等阿,(默认dateline为不重复的值)

原因还是因为 group by 并没有排序功能,所有的这些排序功能只是错觉,所以你最终选出的 dateline 和max(dateline) 永远不可能相等,除非本组的记录只有一条!GROUP BY 在分组的时候,可能是一个一个来找的,发现有相等的tid,去掉,保留第一个发现的那一条记录,所以找出来的 记录永远只是按照默认索引顺序排列的!

那么说了这么多,到底有没有办法让 group by 执行前分组阿?有的 ,子查询阿!

最简单的 :

SELECT * FROM (SELECT * FROM posts ORDER BY dateline DESC) AS p GROUP BY  tid ORDER BY dateline DESC LIMIT 10

也有网友利用自连接实现的 ,这样的效率应该比上面的子查询效率高,不过,为了简单明了,就只用这样一种了,GROUP BY没有排序功能,可能是mysql弱智的地方,也许是我还没有发现.

[网络]你觉得你最大的缺点是什么?

2006年11月19日 没有评论

      优点和缺点的问题,于世维先生曾作过非常精辟的分析,以下是我的理解,和你分享。      首先,不要总是想什么是你的缺点什么是你的优点。因为,缺点和优点在不同情况下会有不同的定义。比如,说一个人他直率,这是是优点。可是在另一种情况里,我们会说这个人太轻浮。因为他总是先发制人,不肯先了解情况,有失稳重。再比如,说一个人吝啬,这是缺点。但在另一种情况里,我们会说他非常的节约。因为他总是能替公司想出节约的办法,并且切实可行。      第二,缺点和优点是一种看法和观点,是主观的东西,不是唯一性的。这种主观的基础是客观的。就是说,优点和缺点是由人的个性引发的,人的个性是客观的。没有哪种个性是可以用优缺点来判断的。      第三,所以说,优缺点是一个事物的两个方面,是客观对主观的影响,也是主观对客观的反馈。要了解一个人,不要只去看他的优缺点,而是去了解他的个性,在个性里看到共性,就真正的完成对一个人的认识。      第四,所以我们看待自己也是一样,要了解自己的个性,发挥自己个性能产生的积极影响,避免消极结局。      第五,回答这种问题的方法就是,告诉招聘的人,你的个性是什么,所以你会有哪些消极的一面,哪些积极的一面。并且你要告诉招聘的人,你为了发扬积极的一面和避免消极的一面都做了哪些努力。这样,你对这个问题的认识有提高了吗?你回答起来就会得心应手了吧。

    如: 我曾经是一个做事非常没有系统的人。我的办公桌总是杂乱无章,后来我因为搞丢了一个重要文件而惹上了大麻烦,才促成了我日后的改变。当时我请求一位做事极细心的同事帮我一起整理办公桌,在不到一个小时的时间我们很有系统地整理好我的办公桌,至今它仍旧维持得井然有序,从此以后,我不但未曾在工作上出错,效率也提高了很多。     恭喜你,这是一个很好的回答方式!     事实上,表明自己曾经拥有的缺点并不完全是件坏事。只要你能够提出改进缺点的方法并实际付诸行动,反倒证明了你是一个有能力战胜弱点的人!

分类: 全部文章, 经典网摘 标签:

[网络]有关团队合作

2006年11月18日 没有评论

    讨论团队合作,最重要的是为了融入团队中去。个体应该对团队合作有以下这些意识,以便更好地指导自己的行为,更好地融入团队之中。

    我并不是救世主

    无论做什么事情,如果认为这个事情没有了自己就一定不会成功,那么你就会有一种骄矜之气。在团队角色问题中,我们提到过,团队中一定有一件事情是你最擅长的。也许在这件事情的操作过程中,你是主要力量,但并不代表没有了你就不行。

    赵本山的小品中有一句话:“地球就得围着你转,你是太阳呀?”你必须清楚,这个世界上少了谁都一样。伟人都会成为历史,更何况我们呢?

    空杯子的心态

    如果一个杯子已经满了,那就再也无法装更多的水了。虽然你具有别人不具有的优势,但是,其他人所具有的也正是你所没有的。

    保持空杯状态,不仅能让你不那么自大,而且能让你给别人以谦恭的印象,这样他们才会愿意与你交流沟通。如果你处处都是惟我独尊的模样,那么没有人愿意和你做朋友的。

    做好自己该做的事

    从团队的角度出发,每个成员都具有自己特定的角色。如果你不能把自己的事情做好,无法完成自己的角色使命,就会拖累了团队,成为其他人的累赘,你不能不认识到这一点。如果没有了对其他人的服务,你在团队中就没有存在的价值。

    团队是为目标服务而不是为你服务

    团队构成的根本原因是为了一个特定的目标,大家所做的一切工作都是为了目标的实现。很可能在这些工作没有按照你的意愿去进行和发展,但这是正常的,因为别人不是为你而工作。如果任何事情都以利群也就是以团队目标实现为最终标准,那么你就不会强调自我,才能与团队合拍,否则你将是一个不为团队所接受的、不合群的人。

    承认自己的脆弱

    信任是团队合作的基本条件。要获得别人的信任,就要承认自己的脆弱。前文已经提到过,角色的定义已经表明你在某些方面确实是脆弱的。如果你对自己的错误能够坦然承认,要比你的争辩更能获取其他人的信任。当然,这种脆弱是指品格方面而非能力方面的。在某方面能力有欠缺,自己不断学习和累积可以弥补,或者最多以后这方面的事情自己不插手。但是如果品格有问题,其他人怎么会放心同你合作呢?承认自己的脆弱,是减少团队中的直接冲突的最好方法。

    冲突是不可避免的

    在团队中会有很多的冲突。害怕冲突,是团队合作的一个最大的障碍。害怕冲突,你将失去自己的优势,变得盲目随从、没有主见。这是完全没有必要的,因为如果对什么事情都没有意见的话,就体现不了你的角色价值,那你在团队中也就是可有可无的了。当然,也不是让大家什么事情都去争。笔者的意思是,冲突是正常的。只要大家都是为了工作,那么有争论、有异议都不会影响到团队的合作。如果你不发表自己的意见,只会让别人觉得你不信任他们。

    坚定不移的行动

    你可以有自己的意见,只要它不是必须为团队其他人所接受的。你可以保留它,但不能在团队已经做出决策以后,还坚持己见,不按照计划工作,甚至故意破坏计划的进行。那么,即使你是正确的,别人按照决策进行却没有得到预期的结果,也不会对你佩服,反而认为你是一个只会搞破坏的人,那你又怎能获得别人的信任呢?

    团队利益高于一切

    中国提倡了这么久的主人翁精神,不仅仅是一句口号,对你获得其他人的支持和认同也是非常有帮助的。

    团队的利益关乎每个成员的个人利益,如果你因为自己的利益而损害了团队的利益,那你也就损害了其他成员的利益,还能获得别人的信任吗?相反,如果你做任何事情都以团队利益为主的话,就维护了其他人的利益,大家自然愿意同你合作,也会在你有困难的时候对你施以援手了。

    荣誉有别人的一份

    很多人认为所获得的一切,都是通过自己的努力而得到的,因此荣誉是自己一个人的。可是,如果没有团队里其他人的支持,你怎么可能获得所有你需要的资源?你怎么能完全发挥资源的价值?你又怎么能单独地把所有的事情做完?因此,无论你在成功的过程中自己付出了多少,这里面一定包含了其他人的支持。

    你是团队中的一员

    很多时候,团队中会存在内部竞争的问题,但不会你死我活。大家是彼此合作的关系,是彼此合作、一起战斗,绝不是消灭对方。如果你是船,团队就是承载你的水,只有水涨,船才会高。否则,即使你再有能力,也无法获得更多的支持和成就。

分类: 全部文章, 经典网摘 标签:

[网络]生命中不可丢失的十种东西

2006年11月9日 没有评论

在时间的长河里,总是让我们得到什么,又同时失去什么。也许,这是命中注定的~

童心 ——无论你有多老,你的心不能变老

音乐 ——如果没有音乐,你的人生将会乏味无比

浪漫——偶尔浪漫一下,那种感觉就像一只小鸟在空中飞翔吧

优雅 ——何必要装的粗鲁呢,优雅一点总是好的

沉思 ——在你有一肚子火要发之前,先给自己10分钟沉思一会儿

驰骋——如果真的累了,就变成一只蝴蝶逃开一会吧,不要让自己太累

纯洁 ——现在的社会已经够混浊了,纯洁真是不容易做到呢

勇敢 ——做个勇敢的精灵,不惧狂风会撕碎你的翅膀

可爱 ——我相信,你会因为可爱而美丽

分类: 全部文章, 经典网摘 标签:

[网络]华仔-音乐家是有国界的

2006年10月22日 没有评论

刘德华在日本举办的一个小型歌友会。歌友会一开始,歌迷欢呼。但是刘德华拒绝用日语向大家问好。接着又拒绝了主办方安排的日语歌曲,并把所有曲目都改为普通话,原定的粤语歌曲也全部取消。刘德华用普通话一字一句说道:“本来我是不想来日本的,但是因为合约在身,不得不来日本。但是你(指记者)不要以为是一纸合约把我牵住的,如果我不来,没人可以把我怎么样。我只是觉得这样对我歌迷不公平,因为歌迷是无辜的。我不想做的事,谁也无法逼我做,而且,你逼我,我也不会做”。   刘德华接着说:“引用一句话,艺术是没有国界的,但是艺术家是有国界的。我想说,音乐是没有国界的,但是音乐家是有国界的。”他对着主办方说:“以后介绍我时,不要说我是香港歌手,因为我首先是一个中国人”。然后,他当着几百名日本歌迷的面演唱了一首《中国人》。

分类: 全部文章, 经典网摘 标签:

[网络]爱的感觉

2006年10月20日 没有评论

你发觉到了吗?爱的感觉,总是在一开始觉得很甜蜜,总觉得多一个人陪,多一 个人帮你分担,你终于不再孤单了,至少有一个人想着你、恋着你,不论做什么事情,只要能在一起,就是好的,但是慢慢的,随着彼此的认识愈深,你开始发现了对方的缺点,于是问题一个接着一个发生,你开始烦、累甚至想要逃避,有人说爱情就像在捡石头,总想捡到一个适合自己的,但是你又如何知道什么时候能够捡到呢?她适合你、那你又适合她吗? 其实,爱情就像磨石子一样,或许刚捡到的时候,你不是那么的满意,但是记住人是有弹性的,很多事情是可以改变的,只要你有心、有勇气,与其到处去捡未知的石头,还不如好好的将自己已经拥有的石头磨亮磨光,你开始磨了吗?很多人以为是因为感情淡了,所以人才会变得懒惰。错!其实是人先被惰性征服,所以感情才会变淡的。 在某个聚餐的场合,有人提议多吃点虾子对身体好,这时候有个中年男人忽然说 :“十年前,当我的老婆还是我的女朋友的时候,她说要吃十只虾,我就剥二十只给她!现在,如果她要我帮她剥虾壳,开玩笑,我连帮她脱衣服都没兴趣了,还剥虾壳咧!“ 听到了吗?难怪越来越多人只想要谈一辈子的恋爱,却迟迟不肯走入婚姻。因为,婚姻容易让人变得懒惰。如果每个人都懒得讲话、懒得倾听、懒得制造惊喜、懒得温柔体贴,那么夫妻或是情人之间,又怎么会不渐行渐远渐无声呢? 所以请记住:有活力的爱情,是需要适度殷勤灌溉的,谈恋爱,更是不可以偷懒的喔! 有一对情侣,相约下班后去用餐、逛街,可是女孩因为公司会议而延误了,当她冒着雨赶到的时候已经迟到了30多分钟,他的男朋友很不高兴的说:「妳每次都这样,现在我甚么心情也没了,我以后再也不会等妳了!」 剎那间,女孩终于决堤崩溃,她心里想:或许,他们再也没有未来了!同样的在同一个地点,另一对情侣也面临同样的处境;女孩赶到的时候也迟到了半个钟头,他的男朋友说:「我想妳一定忙坏了吧!」接着他为女孩拭去脸上的雨水,并且脱去外套盖在女孩身上,此刻,女孩流泪了!但是流过她脸颊的泪却是温馨的,你体会到了吗?其实爱、恨往往只是在我们的一念之间!爱不仅要懂得宽容更要及时,很多事可能只是在于你心境的转变罢了!你懂了吗? 当有个人爱上你,而你也觉得他不错。那并不代表你会选择他。你说:你要找一个你很爱很爱的人,你才会谈恋爱。但是当对方问你:怎样才算是很爱很爱的时候,你却无法回答他,因为你自己也不知道。 没错,我们总是以为,我们会找到一个自己很爱很爱的人。可是后来,当我们猛然回首,我们才会发觉自己曾经多么天真。假如从来没有开始,你怎么知道自己会不会很爱很爱那个人呢?其实,很爱很爱的感觉,是要在一起经历了许多事情之后才会发现的。 或许每个人都希望能够找到自己心目中百分之百的伴侣,但是你有没有想过:在你身边会不会早已经有人默默对你付出很久了,只是你没发觉而已呢?所以,还是仔细看看身边的人吧!他或许已经等你很久喽! 有人说:喝酒的时候,六分醉的微醺感是最舒服的。肌肉可以得到松弛,眼中看到的一切都是可爱的,如果你还继续喝,很可能隔天你会头疼欲裂,全身不舒服,完全丧失了喝酒的乐趣。吃饭的时候,七分饱的满足感是最舒服的。口中还留着食物的香味,再加上饭后甜点、水果,保持身材和身体健康绝对足够。如果你还继续吃,很可能会肠胃不适、吃太饱想睡觉,完全丧失了吃饭的乐趣。 当你爱一个人的时候,爱到八分绝对刚刚好。所有的期待和希望都只有七八分;剩下两三分用来爱自己。如果你还继续爱得更多,很可能会给对方沉重的压力,让彼此喘不过气来,完全丧失了爱情的乐趣。所以请记住,喝酒不要超过六分醉,吃饭不要超过七分饱,爱一个人不要超过八分喔。 那天朋友问我:到底该怎么做才算是爱一个人呢?我笑着跟他说:其实每个人的爱情观都不一样,说对了叫开导,但就怕说错反倒变成误导那就糟糕了!如果你也正在为爱迷惘,或许下面这段话可以给你一些启示: 爱一个人!要了解,也要开解;要道歉,也要道谢;要认错,也要改错;要体贴,也要体谅; 是接受,而不是忍受;是宽容,而不是纵容;是支持,而不是支配;是慰问,而不是质问; 是倾诉,而不是控诉;是难忘,而不是遗忘;是彼此交流,而不是凡事交代; 是为对方默默祈求,而不是向对方诸多要求;可以浪漫,但不要浪费;可以随时牵手,但不要随便分手 如果你都做到了,即使你不再爱一个人,也只有怀念,而不会怀恨。 你懂得如何去爱了吗?试试看吧!

分类: 全部文章, 经典网摘 标签:

[网络]女人

2006年10月9日 没有评论

男人爱女人,爱女人的可爱,爱女人的美丽。女人什么最吸引男人,女人第一次收到情书时的亢奋,第一次和男生约会时左顾又看怕被人发现的紧张,女人第一次拉男人手时的害羞,女人第一次靠在男人肩膀上时的那种含蓄,女人第一次接吻时的忐忑,女人第一次和男人爱抚时的半推半就,女人第一次做新娘时的渴望与不安,女人第一次和男人相拥而卧时的含情脉脉和欲说还休, 女人第一次第一次和心爱的人长相厮守时的浪漫情怀。女人和男友在一起脸红的害羞,女人为了心上人而吃醋高翘的小嘴,男人为女人制造惊喜时女人的微笑,这一切的一切,都是女人吸引男人的地方,爱情,为什么伟大,爱情就因为这些而伟大,要是没有这些,男人凭什么去爱女人啊。       男人爱女人的含蓄。爱女人的如水的温柔,爱女人的娇羞。这些无数无数女人值得男人爱的第一次,只有处女才能给予,有的女人总是说男人爱处女不知爱处女什么,不就是是爱那张膜吗,男人是爱这张膜吗,如果一个女人总是和别的男人发生边缘性行为,除了性交什么都做过了,那这张膜对男人来讲又有什么意义呢?      都说做新娘时的女人最美丽,为什么,因为做新娘时女人把自己无数的含蓄,无数的娇羞,无数的忐忑,无数的渴望,无数的激动都给了男人,让自己在这无数的第一次中变的无限美丽,在新婚之夜让一个男人去把自己征服,和自己的爱人一起去探索人生一片未开拓的疆域,这些都会让男人终生难忘。 如果女人少了这些,无疑是在一点一点减少的美丽,在拉了N个男生的手之后,把紧张丢掉了,初吻没了以后,又卸去了娇羞,靠了很多肩膀后,把幸福洋溢的感觉又丢掉了,女人一个一个的把自己的美丽都渐渐丢掉,男人还是能够接受,娇羞没了,还有含蓄,可爱没了,还有美丽,男人还可以爱女人的忐忑,爱女人把第一次献给自己的伟大。      不过,一项一项的丢,价值也就慢慢的减少了,爱情也会慢慢的变淡了,甚至变的爱情也从无穷的价值变到可以到具体衡量的时候,爱情,于是就有了期限。      有的女人总是在抱怨,自己年轻的时候如花似玉,嫁给了一个穷小子,可是到了四十岁,却栓不住他了。这很简单,女人如果只用20岁的美丽,30岁的风韵去吸引男人,那么也只能到40岁,美丽是可以用金钱去衡量的,如果有了钱,做做美容,丑女也会变成天鹅。那么既然你用有价的美丽去维系男人,那你的爱情必然是有期限的。        男人心里也有一杆称,女人为自己付出了多少自己完全知道,当女人不再美丽的时候,男人会想'当我一无所有的时候,我的女人把自己最美丽的东西毫无保留的献给了我,我不能做对不起她的事'。当女人不再容光焕发的时候,男人会回忆起以前和女人的光辉岁月,当女人已不再含蓄的时候,男人会想到曾经的这个女人也是娇羞万分,当女人不再有美丽的时候,男人会回想起和女人曾经一起走过的艰难岁月,曾经一起闯荡的奋斗历程。男人会回想起曾经两个人吃一碗面时的相濡以沫,曾经在无家可归时,共住天桥时那种浪迹天涯的浪漫,曾经为了结合而以世俗对抗到底的义无返顾,男人这时会欣然的想到,自己心爱的女人啊,把她最宝贵的东西献给了自己,现在她已经不再美丽了,但是男人会一样的爱女人,一样的怜惜她,这就是爱情的无限价值了。       一分付出,总有一分收获,所以当20岁的美女还在算着如何安排和不同的男生约会的日期的时候,当30岁的风韵少妇手里拿着大款给的无数钞票的时候,她们得到了风流,金钱,让人羡慕的目光,让人体面的身份,但是同时上天也很公平,你既然得到了这么多,美丽,金钱,地位,那么当然不能得到你所期待的那种真真切切的爱情,那种刻骨铭心的沧海桑田。 男人得到了天下还不是为了女人,这就是为什么有人不爱江山爱美人,如果一个男人连女人这些宝贵的东西都没得到,那么这个男人是不是一个失败的男人呢,如果一个男人这一辈子连什么是处女,什么是处女膜都永远不知道,他会不会永远死不瞑目呢。

分类: 全部文章, 经典网摘 标签:

[网络]50件事

2006年10月9日 没有评论

1.布置一间书房,要一整面墙的大书柜,和你一起慢慢把它装满

2.和你背靠背,一边听我们都喜欢的CD,一边看各自的书,坐在木地板上 

3.洗澡的时候,帮你刮胡子    

4.你吃饭吃的香的时候,放下筷子看你一会儿    

5.和你一起去西藏    

6.和你一起去一趟北欧,    

7.偷偷用你的牙刷刷牙    

8.当你下班回来说累极了,说饿得站不稳了的时候,抱抱你,然后做一桌子好吃的给你?  

9.和你一起照看我们的父母    

10.至少有一次在大自然的怀抱里和你作爱    

11、不为什么地亲亲你    

12、让你做我所有作品的第一读者    

13、每年春天一起去放风筝    

14、经常抱抱你,也要你抱抱    

15、每天早上唤醒你,或者被你唤醒    

16、常常看见你的笑,还有你点头时候边摇头的样子    

17、和你一起逛街,买菜,回家一起做饭    

18、在街上走时和你保持身体的接触,不管是牵着手还是挽着你的胳膊,还是被你揽着肩膀,搂着腰。总之不要和你分开    

19、和你一起看着我们的孩子长大   

20、保持敏感细腻而知道感激的心,在很老的时候仍然会为你特意做给我的红塘荷包蛋掉眼泪,然后抱着你把眼泪蹭在你衬衫的胸前    

21、和你心平气和地讨论问题,尽量不赌气,不吵架    

22、听我叫笨笨,叫一切我给你起的怪名字,开心的答应我    

23、夜里醒来的时候,亲亲你,不吵醒你    

24、在你需要的任何时候,把我的手伸向你    

25、帮你洗头发的时候,不让洗发水刺到你的眼睛    

26、你看专业书的时候不打扰你    

27、跟你抢电脑,然后把配置更好的那一台让给你用    

28、接听你从海边打来的电话,和你一起听海风,听浪花冲到你脚上时你开心的大叫    29、买菜的时候随便买束花回家    

30、你生病的时候轻声和你说话,喂你吃药前先试试水温,在你床前握着你的手念苏东           坡、辛弃疾的词给你听    

31、始终随身带着一张你的照片,有孩子以后就带全家的    

32、每次过马路时都牵着你的手    

33、只要你在家,我就不用钥匙开门,我只按门铃,我要你给我开

34、常常想着给你惊喜    

35、半夜故意踢开被子,等你醒了给我盖好

36、学做更多好吃的菜,做好和你一起吃    

37、打雷的时候和你抱在一起睡

38、每天都给我买牛奶喝    

39、当我们吵架以后,我也许不想跟你说话,但是我要你给我倒杯茶,因为你可能会口渴    

40、头发要一直保留到可以盘起来那么长,插一把簪子,每天晚上你来拔    

41、和你在同一天里看了日出,再看日落

42、躺在你的腿上看伤感的爱情片,让眼泪打湿你的裤裤    

43、靠在阳台栏杆上的时候,享受你从背后抱着我的感觉    

44、跟你说谢谢和对不起的时候,都用真心说      

45、突然下雨的时候给你送把伞或者去接你下班    

46、忘记了存折、IP卡密码的时候大声的叫你      

47、你和小孩在公园里疯的时候,我在长椅上看着你们微笑

48、认真听你说话    

49、万一我有意外,我从高中开始记的所有日记都留给你    

50、每天早晨在你身边醒来,都要感谢上帝让我活着,并且让我们在一起

分类: 全部文章, 经典网摘 标签: