線上書籍

Home

[1042] XOOPS模組開發進階

一、 關於phpWord(http://phpword.codeplex.com)
  1. PHPWord和PHPExcel是同一個單位所寫出的PHP物件,可用來產生docx檔。
  2. 需要的環境如下:PHP 5.2.x 以上、ZipArchive、xmllib等PHP衍生函式庫
  3. 若是您的Office是2007以下,那麼可能需要Microsoft Office Compatibility Pack(http://www.microsoft.com/zh-tw/download/details.aspx?id=3)才能開啟之(共37.2MB)。PHPWord無法產生2003的doc檔(因為非公開格式)。
  4. 建立一個word檔的基本結構如下: <?php include_once "header.php"; require_once TADTOOLS_PATH . "/PHPWord.php"; $PHPWord = new PHPWord(); //內容設定 header('Content-Type: application/vnd.ms-word'); header('Content-Disposition: attachment;filename=通訊錄.docx'); header('Cache-Control: max-age=0'); $objWriter = PHPWord_IOFactory::createWriter($PHPWord, 'Word2007'); $objWriter->save('php://output');

     

  5. 若有用到長度,其單位為twip,1twip=1/1440英吋,1 cm=0.4 in=576 twip
  6. 一些預設及建立頁面設定功能 $PHPWord->setDefaultFontName('微軟正黑體'); //設定預設字型 $PHPWord->setDefaultFontSize(10); //設定預設字型大小 $sectionStyle = array('orientation' => null, 'marginLeft' => 900); //頁面設定 $section = $PHPWord->createSection($sectionStyle); //建立一個頁面

     

    • (1) orientation 的值可以是橫向landscape或直向portrait。設定項目有:orientation、 marginTop、marginLeft、marginRight、marginBottom、borderTopSize、borderTopColor、borderLeftSize、borderLeftColor、borderRightSize、borderRightColor、borderBottomSize、borderBottomColor
  7. 新增標題($titleCount 是指標題N,$depth會對應$titleCount) $fontStyle = array('color'=>'006699', 'size'=>18, 'bold'=>true); //文字樣式設定 $PHPWord->addTitleStyle( $titleCount, $fontStyle, $styleParagraph); //設定標題樣式 $section->addTitle( '通訊錄', $depth ); //新增標題

     

    • (1)  可用的文字設定:size(文字大小)、name(字型)、bold(粗體)、italic(斜體)、superScript(上標)、subScript(下標)、 underline(底線)、strikethrough(刪除線)、Color(文字顏色)、fgColor(背景色)
  8. underline 底線可用的常數: PHPWord_Style_Font::UNDERLINE_NONE = 'none'; PHPWord_Style_Font::UNDERLINE_DASH = 'dash'; PHPWord_Style_Font::UNDERLINE_DASHHEAVY = 'dashHeavy'; PHPWord_Style_Font::UNDERLINE_DASHLONG = 'dashLong'; PHPWord_Style_Font::UNDERLINE_DASHLONGHEAVY = 'dashLongHeavy'; PHPWord_Style_Font::UNDERLINE_DOUBLE = 'dbl'; PHPWord_Style_Font::UNDERLINE_DOTHASH = 'dotDash'; PHPWord_Style_Font::UNDERLINE_DOTHASHHEAVY = 'dotDashHeavy'; PHPWord_Style_Font::UNDERLINE_DOTDOTDASH = 'dotDotDash'; PHPWord_Style_Font::UNDERLINE_DOTDOTDASHHEAVY = 'dotDotDashHeavy'; PHPWord_Style_Font::UNDERLINE_DOTTED = 'dotted'; PHPWord_Style_Font::UNDERLINE_DOTTEDHEAVY = 'dottedHeavy'; PHPWord_Style_Font::UNDERLINE_HEAVY = 'heavy'; PHPWord_Style_Font::UNDERLINE_SINGLE = 'single'; PHPWord_Style_Font::UNDERLINE_WAVY = 'wavy'; PHPWord_Style_Font::UNDERLINE_WAVYDOUBLE = 'wavyDbl'; PHPWord_Style_Font::UNDERLINE_WAVYHEAVY = 'wavyHeavy'; PHPWord_Style_Font::UNDERLINE_WORDS = 'words';

     

  9. fgColor 背景色可用的常數 PHPWord_Style_Font::FGCOLOR_YELLOW = 'yellow'; PHPWord_Style_Font::FGCOLOR_LIGHTGREEN = 'green'; PHPWord_Style_Font::FGCOLOR_CYAN = 'cyan'; PHPWord_Style_Font::FGCOLOR_MAGENTA = 'magenta'; PHPWord_Style_Font::FGCOLOR_BLUE = 'blue'; PHPWord_Style_Font::FGCOLOR_RED = 'red'; PHPWord_Style_Font::FGCOLOR_DARKBLUE = 'darkBlue'; PHPWord_Style_Font::FGCOLOR_DARKCYAN = 'darkCyan'; PHPWord_Style_Font::FGCOLOR_DARKGREEN = 'darkGreen'; PHPWord_Style_Font::FGCOLOR_DARKMAGENTA = 'darkMagenta'; PHPWord_Style_Font::FGCOLOR_DARKRED = 'darkRed'; PHPWord_Style_Font::FGCOLOR_DARKYELLOW = 'darkYellow'; PHPWord_Style_Font::FGCOLOR_DARKGRAY = 'darkGray'; PHPWord_Style_Font::FGCOLOR_LIGHTGRAY = 'lightGray'; PHPWord_Style_Font::FGCOLOR_BLACK = 'black';

     

  10. 新增文字及相關文字設定 $paragraphStyle=array('align' => 'both', 'spaceAfter'=>300); //段落設定 $section->addText('內容', $fontStyle, $paragraphStyle); //新增文字段落

     

    • (1)  可用段落設定:align、spaceBefore、spaceAfter、spacing
  11. 換行及換頁 $section->addTextBreak(2); //換行,可指定換幾行 $section->addPageBreak(); //換頁

     

  12. 插入連結和圖片,$style 可用設定:width、height、align,單位為px $section->addLink( $linkSrc, $linkName, $fontStyle, $paragraphStyle); //加入連結 $section->addImage( $src, $style ); //插入圖片

     

  13. 插入有序或無序清單, 設定有序(TYPE_NUMBER)或無序(TYPE_BULLET_FILLED)清單,$depth為階層,從0開始。 $listStyle = array('listType' => PHPWord_Style_ListItem::TYPE_NUMBER); $section->addListItem( $text, $depth, $fontStyle, $listStyle, $paragraphStyle ); //新增清單項目

     

  14. 插入表格 $styleTable=array('borderColor' => '006699', 'borderSize' => 6, 'cellMargin' => 50); //表格樣式 $styleFirstRow = array('bgColor' => '66BBFF'); //首行樣式 $PHPWord->addTableStyle('myTable', $styleTable, $styleFirstRow); //建立表格樣式 $table = $section->addTable('myTable'); //建立表格 $cellStyle = array('textDirection' => PHPWord_Style_Cell::TEXT_DIR_BTLR, 'bgColor' => 'C0C0C0'); //儲存格樣式 $table->addRow(); //新增一列 $table->addCell(2000, [$cellStyle])->addText('內容'); //新增一格

     

    • (1)  表格可用設定:cellMarginTop、cellMarginLeft、cellMarginRight、cellMarginBottom、cellMargin、bgColor、borderTopSize、borderTopColor、borderLeftSize、borderLeftColor、borderRightSize、borderRightColor、borderBottomSize、borderBottomColor、borderInsideHSize、borderInsideHColor、borderInsideVSize、borderInsideVColor、borderSize、borderColor
    • (2)  儲存格可用設定:valign、textDirection、bgColor、borderTopSize、borderTopColor、borderLeftSize、borderLeftColor、borderRightSize、borderRightColor、borderBottomSize、borderBottomColor
  15. 垂直合併除存格 $table = $section->addTable(); $table->addRow(); $table->addCell(100,array('vMerge' => 'restart'))->addText('1'); $table->addCell(100)->addText('2'); $table->addRow(); $table->addCell(100,array('vMerge' => 'fusion')); $table->addCell(100)->addText('3');

    看起來會像這樣:
     

    1 2
    3

     

  16. 水平合併儲存格

    $table = $section->addTable(); $table->addRow(); $table->addCell(100,array('gridSpan' => '2'))->addText('1'); $table->addRow(); $table->addCell(100)->addText('2'); $table->addCell(100)->addText('3');

    看起來會像這樣:

    1
    2 3

     

二、 無中生有產生圖片
  1. 使用PHP中GD函式庫:http://php.net/manual/en/ref.image.php
  2. 基本產生圖檔方法: header("Content-type: image/png"); $im = @imagecreatetruecolor(400, 100) or die("無法建立GD圖片"); imagepng($im, XOOPS_ROOT_PATH . "/uploads/{$sn}.png"); imagedestroy($im);

     

    • (1)  resource imagecreatetruecolor(int $寬 , int $高) //建立全彩畫布
    • (2)  bool imagepng(resource $im [, string $檔名 [, int $品質 [, int $濾鏡]]])//產生png
    • (3)  bool imagedestroy(resource $im) //釋放記憶體
  3. 產生透明背景 imagesavealpha($im, true); $trans_colour = imagecolorallocatealpha($im, 255, 255, 255, 127); imagefill($im, 0, 0, $trans_colour);

     

    • (1)  bool imagesavealpha ( resource $im , bool $是否保存alpha channel ) //透明色版
    • (2)  int imagecolorallocatealpha ( resource $ im , int $紅 , int $綠 , int $ 藍 , int $透明 )//設定含透明度的顏色,顏色值從1~255,透明值從0(不透明)~127(透明)
    • (3)  bool imagefill ( resource $im , int $x , int $y , int $顏色設定 )//填滿顏色
  4. 產生文字(各式字體練習素材:http://soft.aizhan.com/xtmh/ziti/範例字型 $text_color = imagecolorallocatealpha($im, 0, 0, 0, 50); $gd = gd_info(); if ($gd['JIS-mapped Japanese Font Support']) { $name = iconv("UTF-8", "shift_jis", $name); } imagettftext($im, 20, 0, 0, 60, $text_color, "font.ttf", $name);

     

    • (1)  array gd_info ( void ) //用來取得GD函式庫的各種支援情形,若伺服器設定成支援日文編碼,那就必須進行文字的轉碼,以避免中文變成亂碼。
    • (2)  array imagettftext(resource $im , float $大小  , float $角度  , int $x  , int $y  , xint $顏色  , string $字型檔  , string $文字) //若要置中x大約是「(圖寬-字數x字尺寸x1.5)/2」,而y則是「(圖高-字尺寸)/2+字尺寸」
  5. 製作縮圖(或加入為背景圖):https://pixabay.com/ $bg_im = imagecreatefromjpeg("images/bg.jpg"); imagecopyresampled($im, $bg_im, 0, 0, 0, 0, 400, 100, 1024, 768);

     

    • (1)  resource imagecreatefromjpeg ( string $jpg圖檔來源 ) //讀入某張圖
    • (2)  bool imagecopyresampled(resource $目的  , resource $來源  , int $目的_x  , int $目的_y  , int $來源_x  , int $來源_y  , int $目的寬  , int $目的高  , int $來源寬 , int $來源高) //縮放圖檔並產生新圖,若是不想讓底圖變形,來源寬和來源高可以指定成和目的寬、目的高一致,這樣就只會擷取局部,而不會使之變形。