エセプログラマーの戯言

プログラムやリナックスなどについてのメモです

全体表示

[ リスト | 詳細 ]

記事検索
検索
前回まで、TeX+PHP+MySQLによるPDF自動生成サーバの構築のために、Ubuntu Linuxのインストール、Webサーバ、TeX環境の構築を行ってきました。


さて、今回は、いよいよPHPからTeXを使ってみたいと思います。

とりあえず、PHPからTeXを使ってPDFを作るクラスを簡単に作ってみました。
まだエラー処理などは一切行っていないので、このままでは使えません!
<?php 
/**************************************
*     TeXPDFクラス  
*     08/02/24(C)yohei0511    
***************************************/
/*
PHPからTeXを使ってPDFを標準出力します。

*/
class TeXPDF{
  private $texfile;
  private $new_file_name;
  private $platex_path;
  private $dvipdf_path;
  private $param;
  
  public function __construct($texfile){
    $this->texfile = $texfile;
    $this->new_file_name = time();
    $this->platex_path = "platex";
    $this->dvipdf_path = "dvipdfmx";

  }
 
  //変数のセット
  public function set_param($name, $value){
    $this->param[$name] = $value;
  }
  //PDFを標準出力
  public function show_pdf(){
    $file_contents = $this->input_tex();
    $this->create_tex($file_contents);
    $this->platex();
    $this->dvipdf();

    $hadle = @fopen($this->new_file_name.".pdf", 'r');
    if ( $hadle ){
      while(!feof($hadle)){
	$pdf_contents .= fgets($hadle);
      }
    }
    fclose($hadle);

    exec("rm ".$this->new_file_name.".*");
    
    header("Content-type: application/pdf");
    echo $pdf_contents;
    exit;
  }

  //テンプレートのTEXファイルの読み込み
  public function input_tex(){
    $texfile = $this->texfile;
    $param = $this->param;

    $hadle = @fopen($texfile, 'r');
    if ( $hadle ){
      while(!feof($hadle)){
	$file_contents .= fgets($hadle);
      }
    }
    fclose($hadle);

    foreach($param as $key => $value){
      $file_contents = str_replace("tpf{".$key."}", $value, $file_contents);
    }
    return $file_contents;
  }

  //TEXファイルの出力
  private function create_tex($contents){
    $file = $this->new_file_name.".tex";
    $handle = @fopen($file, 'w');
    @fwrite($handle, $contents);
    fclose($handle);    
  }

  //TEXのコンパイル
  public function platex(){
    $file = $this->new_file_name.".tex";
    $platex = $this->platex_path;
    
    exec($platex." ".$file);
    exec($platex." ".$file);
  }

  //DVIファイルからPDFへ変換
  public function dvipdf(){
    $file = $this->new_file_name.".dvi";
    $dvipdf = $this->dvipdf_path;
    
    exec($dvipdf." ".$file);
  }

  //TEXをコンパイルするコマンドのパス
  public function set_platex($platex_path){
    $this->platex_path = $platex_path;
  }

  //DVI→PDFのコマンドのパス
  public function set_dvipdf($dvipdf_path){
    $this->dvipdf_path = $dvipdf_path;
  }
}

使い方

まず、テンプレートのTEXファイルには、動的に変えたい項目を「tpf{変数名}」で書いておきます。
sample.tex
\documentclass[a4j]{jsarticle}
\begin{document}
名前 : tpf{Name}
趣味 : tpf{Hobby}
\end{document}

PHPでは、次のように使います。
$template_file = "sample.tex";
$TeXPDF = new TeXPDF($template_file); //テンプレートファイルを引数にしてインスタンス化する
$TeXPDF->set_param("Name", "yokkun");       //変数に値を代入する。
$TeXPDF->set_param("Hobby", "カラオケ");      
$TeXPDF->show_pdf();                  //PDFを標準出力する。

以上で、PHPからTeXを用いてPDFを出力することが出来ました。

ただ、まだエラー処理を一切していないので、次回その処理を追加していきたいと思います。
前回は、TeX+PHP+MySQLによるPDF自動生成サーバの構築のために、VMware Server 上にUbuntu7.10をインストールし、NAT接続でネットワークを構成しました。


今回は、インストールしたUbuntuにWebサーバとTeX環境を構築します。

まず、今回はただのテストなので、なるべく簡単にするため、Webサーバは「Xampp for Linux」を使って構築することにしました。


インストール
$ wget http://www.apachefriends.org/download.php?xampp-linux-1.6.tar.gz
$ tar xvfz xampp-linux-1.6.tar.gz -C /opt
$ sudo /opt/lampp/lampp start 

起動
/opt/lampp/lampp start

「/ユーザー名/」で/「home/ユーザー/public_html/」にアクセス出来るようにする
$ mkdir ~/public_html
$ sudo ln -s ~/public_html /opt/lampp/htdocs/$USER 

以上で、Apache+MySQL+PHPのインストール完了です。
セキュリティなどを考えなければ、やはりXamppは簡単で良いですね。

続いて、TeX環境を構築します。
Ubuntuでは、TeX環境は全て「apt-get」でインストール出来ます。


ここから先は、apt-getをたくさん使うため、ルートになっておきます。
$ sudo -s

TeXの基本的なシステムのインストール
# apt-get install ptex-base ptex-bin ptex-jisfonts
# apt-get install jbibtex-bin jmpost mendexk
# apt-get install dvipsk-ja dvi2ps
# apt-get install xdvik-ja gv
# apt-get install okumura-clsfiles vfdata-morisawa5 dvi2ps-fontdesc-morisawa5
# jisftconfig add

GhostScriptのインストール
PostScriptのインタプリタです。PSファイルの印刷などに必要。
# apt-get install gs gs-esp gs-cjk-resource

dvipdfmxのインストール
DVIファイルをPDFファイルに変換するためのソフト。
# apt-get install dvipdfmx
# apt-get install cmap-adobe-cns1 cmap-adobe-gb1
# apt-get install cmap-adobe-japan1 cmap-adobe-japan2
# apt-get install adobereader-jpn xpdf

CMAPのパスを通す
dvipdfmxはデフォルトだとエラーが出る。/etc/texmf/texmf.d/50dvipdfmx.cnfに以下を追加する
長いため改行しましたが、一行で書きます。
CMAPINPUTS=.;/usr/share/fonts/cmap/adobe-japan1//;
                   /usr/share/fonts/cmap/adobe-japan2//;
                   /usr/share/fonts/cmap/adobe-gb1//;
                   /usr/share/fonts/cmap/gs-cjk-resource//

jsarticleを使っているなら /etc/texmf/dvipdfm/dvipdfmx.cfg の最後に以下を追加
f jis-cjk.map

最後に
# update-texmf

として、完了です。

しかし、bibtexを利用すると複数回ファイルをコンパイルしなければいけません。
それを自動的に必要な回数だけファイルのコンパイルを行い、不要ファイルの削除もできる「latexmk」という便利なものがあります。

latexmkのインストール
Latexmkからダウンロードして展開、インストール
# unzip latexmk-307a.zip
# cp latexmk.pl /usr/local/bin/latexmk
# chmod +x /usr/local/bin/latexmk

~/.latexmkrc に以下の設定を書きます。
$latex = 'platex';
$bibtex = 'jbibtex';
$dvipdf  = 'dvipdfmx';
$dvips  = 'dvips';
$ps2pdf = 'ps2pdf';

$pdf_previewer = 'acroread';
$ps_previewer  = 'gv';
$dvi_previewer  = 'xdvi-ja';

以上で、TeX環境の構築も完了です。

次は、いよいよTex+PHP+MySQLでPDFの生成を行いたいと思います。

開く トラックバック(1)

先日紹介したTeX+PHP+MySQLによるPDF自動生成サーバの構築を行いと思います。

今回は、VMware Server上にUbuntu 7.10をインストールすることにしました。
Ubuntuを選んだ理由は、最近流行ってるので一度入れてみたかったということと、VMware用の仮想マシンが提供されているからです。


上のリンクからVMware用仮想マシンのzipファイルをダウンロードして展開。
展開されたディレクトリの中にある拡張子がvmxとなっているファイルをVMware Serverで開く。


すると、言語、タイムゾーン、およびユーザーアカウントを設定する画面が表れるので、その指示に従って選択、入力します。

以上でインストール完了!



さて、今回は、環境の都合でDHCPが使用不可でIPも一個しかないため、VMwareのネットワークはブリッジではなくNATで行いました。



構成としては、次のような感じになりました。
ルーター 172.16.1.1
        |
        |
ホストOS 172.16.25.123
        |   192.168.244.2
        |
ゲストOS 192.168.244.128

ホストOSの設定
IPアドレス             : 172.16.25.123
サブネットマスク        : 255.255.0.0
デフォルトゲートウェイ : 172.16.1.1

ゲストOSの設定
IPアドレス             : 192.168.244.128
サブネットマスク        : 255.255.255.0
デフォルトゲートウェイ : 192.168.244.2

ここまでは、本当にすんなり出来たんですが、この後、次のことでかなり時間かかってしまいました。
1 ホストOSから、このゲストOSのWebページが見れない。
2 ホストOSから、SSHで入れない。

かなり悩んだんですが、原因は単純なことでした。

1に関しては、ホストOS上でXamppが自動起動しており、VMwareのNATで80番ポートを指定しても、ホストOSのXamppが優先されてしまったためでした。
Xamppを停止してから、172.16.25.123 でアクセスしたら、普通に見ることが出来ました。

2に関しては、もっと単純で、ゲストOSに「openssh-server」が入ってませんでした。

こんな初歩的なことに1、2時間も使ったかと思うと、すごく損した気分になります。。。


まぁ、とりあえず以上で、サーバの準備が出来ました。
次回は、WebサーバとTeX環境の構築を行いたいと思います。

開く トラックバック(2)

Shell ループ処理 ( for )

Linuxでは、端末上でループ処理が出来ます。

$ for 変数 in 引数 ; do コマンド ; done

for文はinの後に続く引数を変数に代入しながら doとdoneの間に記述されたコマンドを繰り返し実行します。


名前に"さん"を付けて表示する場合
$ for name in taro yuki yokkun; do echo $name"さん"; done

ディレクトリ内のファイルやディレクトリに対して「ls -la」を実行する場合
$ for file in * ; do ls -la $file ; done

awk コマンド

今日は、Linuxの「awk」というコマンドを紹介します。


awk(おーく)は、入力データ1行ごとに各列の様々な処理を行うコマンドです。
awkを用いると、例えば「ファイルの2列目を2倍する」というような操作をコマンドライン一行で出来ます。

% awk '条件文{実行文}' ファイル名

また、-F オプションでフィールド区切りとしてセパレーターを設定できます。

% awk -F '{セパレータ}' '条件文{実行文}' ファイル名

.


プライバシー -  利用規約 -  メディアステートメント -  ガイドライン -  順守事項 -  ご意見・ご要望 -  ヘルプ・お問い合わせ

Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.

みんなの更新記事