ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Let's PHPコミュのPHP でBarCode 出力 帳票(PDF)作成

  • mixiチェック
  • このエントリーをはてなブックマークに追加
はじめまして、PAOです。
最近、PHPをやり始めました。
よろしくお願いいたします。

このような投稿をして良いのかどうか?迷いましたが、投稿させていただきます。
うちを、宣伝するつもりはありません。
申し訳ございませんが、この場を借りて、リサーチさせていただければと、思っております。
そのかわり、関連するネット上の私の知りえる情報をお伝えします。

現在、PHPでBarCodeを生成したり、帳票(PDF)を出力するツールを作ろうかどうか?迷っています。
私は、.NETや、Javaで、そのようなコンポーネントを作成していて、それなりのニーズがあるのですが、はたして、PHPでは、どうか?と いうところで迷っています。
ちなみに、私が開発した、BarCode / 帳票ツール は、
http://www.pao.ac/
を見ていただければ、その仕組みがわかります。

そこで今回アンケートをとらせていただきたいと思います。
.NETやJavaでは、それなりにニーズがありましたが、PHPでニーズがあるかどうか?調べたいためです。
アンケートというと、上から目線ですが、そうでなく、皆さんにピントが合うところだけご意見をお聞かせくださっても結構です。
なので、わたしも、アンケートというより、もうちょっと砕けた感じで、ご質問させていただきます。
よろしくお願いいたします。

どうか、ご協力ください。m(_ _;)m

1.PHPで・・・
 (1) バーコード生成コンポーネント(クラス)
 (2) 帳票(PDF)生成コンポーネント(クラス)
どちらが必要だとおもいますか?

2.バーコード出力コンポーネントを作成するのであれば、どちらが必要でしょうか?
 (1) JPEG等画像(GDI)出力してブラウザでバーコード表示
(ブラウザにバーコードを出力できるものを作るのか?)
 (2) PDFでバーコード出力
(バーコードをPDF出力できるものを作るのか?)

どちらのニーズが高いと思いますか?

または、どちらもいらない。バーコード出力を兼ねた帳票ツールがなければ、
そのようなバーコードだけ出力するような中途半端なものはいらない。
ってかんじでしょうか?
ちなみに、QRコードに限ってののブラウザ出力は、要望は高いかもしれませんが、既にフリーで、
http://www.swetake.com/qr/qr_cgi.html
が、出回っていて有名です。

ちなみに、ブラウザに出力では、
http://q.hatena.ne.jp/1180586816
このような要望もあり、
バーコードの種類は少ないですが、
http://www.ashberg.de/php-barcode/
のようなプログラムがあります。

バーコードのPDF出力では・・・
http://www.mmdb.net/m_kaneko/php/PDF_barcode.htm
のようなコードがありました。
しかし、PDF帳票を1から手組みするような人はいないですよね?
PHPの現状を良く知らないので、ご存知でしたら教えてください。

3.帳票(PDF)出力コンポーネントを作成するのであれば・・・
  まず、Windowsの帳票デザインソフト(Reports.NET)で作成した帳票デザインのXMLに対して、
  サーバサイドで、Reports.php(仮称)のメソッドを使ってデータを埋め込み、
  PDF 出力を考えております。

  いかがでしょうか?

  必要であれば、現在、.NET版や、Java版でも対応している SVG/SVGZ出力も可能にしようと思っております。

  いかがでしょうか?

是非、ご意見をお聞かせください。

よろしくお願いいたします。m(_ _;)m

コメント(27)

> 1.PHPで・・・
> どちらが必要だとおもいますか?
PDFはすでにあるFPDFクラス http://www.fpdf.org/ を拡張して日本語が使えるようになったMBFPDF http://www.geocities.jp/rui_hirokawa/php/pdf/ クラスを利用していますので、これがそこそこ使える現状では(1)のバーコード出力クラスを回答とさせていただきます。

> 2.バーコード出力コンポーネントを作成するのであれば、どちらが必要でしょうか?
1.への回答で紹介したFPDFは画像ファイルの貼り付けができますので汎用性に優れる(1)のほうがよいかとおもいます。
(ここで紹介されているPHPでのPDFの出力はPDFlibを使ってるのかしら?)

> 3.帳票(PDF)出力コンポーネントを作成するのであれば・・・
これについては必要をあまり感じていないので回答を控えさせていただきます。
貴重なご意見ありがとうございます。
非常に参考になりました。
FPDFクラスは、画像の貼り付けもできるのですね。
ちょっと、ためしに作ってみようと思います。

帳票は、PHPは、弱いかと思っておりましたが、
FPDFクラスで十分というご意見ですね。

TCPDFってのは、皆さんどんな評価ですか?

どちらにしても、帳票デザイン時に苦労しそうだというのが、
私の感覚なのですが、そこら辺は、慣れの問題なのですかね。
>文字列、画像の座標を指定しまくるのが単調過ぎて涙目。(感じ的にはGDで画像生成するのと変わらないけど)
私も以前FPDFで作成したのですが超同感です。
これがなんとかなればなぁ・・・。まぁ仕方ないといえば仕方ないんでしょうけど。
TCPDFの私的評価

自分はバーコードは扱ったことないんですが、
htmlでレイアウト出来るのがやっぱ一番の利点ですね。
テキストの折り返しもライブラリ側で勝手にやってくれますし。

欠点は、
cssのborder対応がいまいちなところ。

後は、フォントの問題
標準搭載されているフォントだと埋め込みが出来ないため、ロケーションフリーにならない(Arial UniはMacで表示されないとかそういう話です)。
IPAフォントなどを付属のコンバーターで使えるようにすれば埋め込み出来るけども、
欠落データが出てきてしまう(フォント自体には定義されていて、表示できるはずの文字が表示できないってことです)。
皆様の貴重なご意見ありがとうございます。

今回は、まず、BaCodeのコンポーネント(クラス)を作成してみたいと思います。
具体的には・・・
コードを受けって、バーコードをグラフィックオブジェクトとして返す
メソッドを作成するイメージです。

ただ、先日から急遽、受託の開発仕事が入ってしまい、
しばらく、集中して取り組めそうもないので、
ソースコードを含み展開するには時間がかかるかもしれません。
すいません。

帳票ツールに関しては・・・
やはりPDFのデザインで苦労されているようなご意見がありますが、
それを、Windowsのアプリケーションでデザインできれば、
相当工数も削れると思うのですが、
その辺はいかがなのでしょうかね?

今のところ、不評のようですが・・・
とりあえず、Code39 だけ、作ってみました。
http://www.pao.ac/BarCodeTest.html

とりあえず、ソースコードはべた書きなので、

まだまだ足りない機能を補強して、
クラス化したら、ソースも公開しようと思います。
今日少し時間があったので、クラス化をしてみました。

ところが・・・
クラスを、内部に持つと正常に動作するのですが、
クラスファイルを外部ファイルにすると、動かなくなってしまいます。
理由が分かれば教えてください。

【正常に動作する方】
http://www.pao.ac/BarCodeTestUgoku.html
・ソースファイル
 http://www.pao.ac/BarCodeTest.ugoku.php.txt

【まともに動かない方】
http://www.pao.ac/BarCodeTest.html
・ソースファイル
 http://www.pao.ac/Code39.php.txt
 http://www.pao.ac/BarCodeTest.php.txt

よろしくお願いいたします。
まず、レスポンスヘッダ見ると、あなたのサーバーはこいつを返してくる。
Content-Type: text/html; charset=UTF-8

そして本来求められているのはこれ。
Content-Type: image/png

コード上ではブラウザ出力の前にheader("Content-Type: image/png")でちゃんと指定されているから問題なさげ。だとするとそれ以前に問題がありそうな予感。

次に送信されてきたデータのHexダンプを見ると、あなたのサーバーはこいつを返してくる。
0a 0a 89 50 4e 47 0d 0a 1a 0a...

PNGファイルシグネチャは89 50 4e 47 0d 0a 1a 0aで始まると規定されているから、先頭2バイトの0a(UnixのLF=改行?)が紛れているのが問題だと思われる。

Content-Type:出力前に意図しないところで改行が出力されてるんじゃない?
例えば、PHPの終了タグ後とかに。

display_errors = OffであればCannot modify header information...も出ないだろうし、気づいてないだけとか。

まぁ、Unix環境(?)の細かい設定分からないし、それ以上のことは言えない。
興味があったので、自前サーバで再現させてみました。

ソースそのままでは確かに再現しますね。
原因は単純で、Code39.phpファイルの ?> の後に改行があるからだと思われます。

#あちきは?>を全く使わないのでいままで経験したこと無いですが、今後参考にします
さだちんさん

改行2つ、その通りでした。
ありがとうございました。

http://www.pao.ac/BarCodeTest.html

無事、動くようになりました。

ceem さんも、改行2つ入っている件を解析していただき
ありがとうございました。

スッキリ(^^;
さだちんさん

PHP初心者なので、知ってて当たり前の質問かもしれません。
#初心者も言い訳にはならないと承知しております。
申し訳ないのですが、質問させてください。

>#あちきは?>を全く使わないのでいままで経験したこと無いですが、今後参考にします

では、どうやって、PHPのコードを書いているのですか?

くだらない質問で申し訳ありません。
よろしくお願いいたします。
<?は必須ですがファイルの最後までPHPのコードであれば
最後の?>は必要ないです。
#というか安全策の為に付けない方が良いとも言われてる
本当ですね。
ありがとうございます。

ネット上の私の見た限りのソースコードは、
全部「?>」が、付いていたので、必ずつけるものと思っておりました。

めからうろこです。

ありがとうございました。
 私の開発しているシステムで、Code39のバーコードの
 クラスを使わせてもらいました。

 使えますね。このバーコードクラス。
 まさか、アルゴリズムをお手持ちの全部のバーコードの
 ソースを公開していただけるということは、ありませんか?

 そうしていただけるとありがたいのですが。

 よろしくお願いいたします。
とときちさん

評価ありがとうおございます。
Code39については、機能(プロパティやメソッド)を
.NET版やJava版並に強化したものを
ソース公開させていただこうと思っています。

ただ、本業の合間にちょこまかやるので少し時間がかかると思います。

その他のバーコードについては、申し訳ございませんが、
BarCode.php として販売を目的としておりますので、
ソース公開の予定はございません。

よろしくお願いいたします。
PDFにもバーコード出力できるようにしてみました。
http://www.pao.ac/BarCodeTest.html

ソースコードはこんな感じです。
http://www.pao.ac/BarCodeTest.php.txt
x(Top), y(Left)の分だけ画像が大きくなってしまうのはおかしいと気づき、
BarCode のクラスは、x,y 指定できないようにし、BarCodeの画像のみを返すように変更しました。

header("Content-Type: image/png")
もやめて、テストプログラムでDIV で直接座標に描くように変更してみました。
http://www.pao.ac/BarCodeTest.html

ソースコードはこんな感じ・・・
http://www.pao.ac/BarCodeTest.php.txt
http://www.pao.ac/Code39.php.txt

そもそも、PHPの場合は、.NETやjavaと違い、Graphics が存在せず、
イメージ(画像データ)だけなので、このようなつくりにしたのですが、
いかがでしょうか?
ご感想を聞かせていただければ幸いです。
バーコードの下のコード文字のフォントのサイズを指定できるようにしようと思いました。

ところが・・・
http://www.pao.ac/BarCodeTest.html
で、フォントのサイズを例えば、100 とかにして、
PNG 出力を行うと・・・
・バーの高さが長くなる
・フォントのサイズは、そんなに大きくならない
という事象が発生してしまいます。

ソースコードはこんな感じです。
http://www.pao.ac/BarCodeTest.php.txt
http://www.pao.ac/Code39.php.txt

PDFにしたときの動作は、何となく理解できるのですが、
画像出力した時の・・・
・バーの高さが長くなる
・フォントのサイズは、そんなに大きくならない
が、さっぱり理解できません。

わかる方がいらっしゃいましたら教えてください。

よろしくお願いいたします。
事故レスです。

http://www.pao.ac/BarCodeTest.html
で、GIF出力のときだけ・・・

case "gif":
header("Content-Type: image/gif");
ImageGIF($img);

のように、イメージをそのまま書いてみました。
そうすると期待通りの出力結果になりました。

他の画像は、DIVタグとIMGタグを使用しているので、
そこで何か、変換がかかってしまったのですね。

どこが悪いんだろう?
事故レスです。

GIF以外の画像(PNG/JPEG)もDIVタグ等使っているからおかしいのかと思いましたが、
F5(更新)を押すと期待値通りになりますね。

キャッシュにたまっていたのが出ていただけのようですね。

来週から常勤仕事に入るため、これからは、ますます更新が難しくなってしまいますが、

どうか、よろしくお願いいたします。
しかし、PNG で、F5(リロード)を押さないと、
変なバーコードが表示されるのは、何なんですかね?
画像がキャッシュされてしまう問題なんとかなりました。

お決まりのようである・・・
header("Expires: Thu, 01 Dec 1994 16:00:00 GMT");
header("Last-Modified: ". gmdate("D, d M Y H:i:s"). " GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
これをやっても同じファイル名の画像は、ダメでした。

.htaccess の設定を変えてもだめでした。

結局、imgタグの画像ファイルにランダムなパラメータを与えることで回避しました。

以下のような感じです。
<IMG src=\"".$fileName."?".rand()."\" width=".$size[0]." height=".$size[1]." border=\"0\">

ログインすると、残り5件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

Let's PHP 更新情報

Let's PHPのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング