2012年11月25日

任意のフォントを使ってテキストをPDFファイルに追加する方法

前回は、AddCJKFontメソッドを使ってのテキスト追加でしたが、今回は、任意のフォントを使ってPDFファイルにテキストを追加するPHPサンプルプログラムをご紹介します。DrawTextメソッドについての詳細は、Quick PDF Libraryの体験版もしくは製品版のマニュアル(PDF)にも記載されていますが、こちらにも記載されています。

なお、前回のAddCJKFontメソッドを使ったサンプルでもご紹介しましたが、PHPのCOMクラスにおける日本語のような2バイト文字の取り扱いには不具合がありますので、今回も同じハックを使います。

今回の中心メソッドは、AddSubsettedFontメソッドです。フォントを丸ごと埋め込むのではなく、サブセットを埋め込むことで、そのフォントがインストールされていない環境でも、作成者の期待通りにPDFファイルを表示させることが可能です。下記のコードで作成したPDFファイルは、少なくとも著者のテストした限りでは、Windowsだけでなく、Mac、iPhone、iPadでも期待通りに表示されました。

AddCJKFontメソッドを日本語環境で使用する際に一つ壁になるのは、フォント名の英語名を知る必要があることです。もっと良い方法があるかもしれませんが、私が見つけた方法は、Inkscapeというオープンソース・ベクターグラフィックエディタの不具合?を利用する方法です。Inkscapeでテキストの編集を行おうとした際に表示されるフォントの一覧が全て英語のフォント名になっていて使いづらいのですが、この不具合?を逆利用します。

Inkscape_font.jpg

<?php
	//このPHPファイルの文字コードはShift_JISで作成しています。
	$PDFLibrary= new COM("DebenuPDFLibraryAX0912.PDFLibrary");
	if(!$PDFLibrary){
		echo "COM error";
		exit;
	}

	if($PDFLibrary->UnlockKey("ライセンスキー") == 1){
		echo "License validation successful!";
		echo "
"; echo "Valid license key: "; echo $PDFLibrary->LicenseInfo; echo "

"; }else{ echo "License validation failed!"; echo "

"; exit; } //フォントを選択 MS明朝。フォント名は英語名を見つけ出す必要があります。 $font_name = "MS Mincho"; //$font_name = "MS UI Gothic"; //DFGPOP1体W12 標準 //$font_name ="DFGPOP1-W12"; //HG正楷書体-PRO 標準 //$font_name = "HGSeikaishotaiPRO"; //JSP明朝 標準 //$font_name = "JSPMincho-Lt"; //Shift_JIS=4 // http://www.quickpdflibrary.com/help/quickpdf/AddSubsettedFont.php $charset = 4; $text = "あいうえおテスト漢字コg@括Uケ戌ア本日は晴天なり。アイウエオ"; //PHPのCOMクラスには日本語の扱いに不具合があります。 // https://bugs.php.net/bug.php?id=40664 //PHPのバグに対処。無意味な空白文字を大量追加します。 //この対処をしないと、関係の無い文字が本来のテキストの後ろに //表示される場合があります。 for($i=0;$i<300;$i++){ $text .=" "; } $result = $PDFLibrary->AddSubsettedFont($font_name,$charset,$text); if(!$result){ echo "can not add subsetted Font."; exit; } //Quick PDF Libraryでは、座標系はデフォルトで0,0がPDFファイル //の左下になりますので注意してください。 //普通?の感覚どおりPDFファイルの左上を0,0にしたい場合は、 //SetOriginメソッド(引数1)を使ってください。 //http://www.quickpdflibrary.com/help/quickpdf/SetOrigin.php $PDFLibrary->SetOrigin(1); //SetOriginで左上が0,0座標になったら、後は普通?の感覚で座標 //を指定してください。 //http://www.quickpdflibrary.com/help/quickpdf/DrawText.php $PDFLibrary->DrawText(20,20,$text); $filename = "draw_text_subsetted_font.pdf"; //Quick PDF Libraryでは常にフルパスに変換して処理 $dir = realpath("./"); $filename_full = $dir ."\\$filename"; //保存します。 $PDFLibrary->SaveToFile($filename_full); $PDFLibrary = null; echo "success
"; echo "$filename
"; ?>
上記のサンプルコードでは、PDFファイルを無から新規作成する形になっていますが、もちろん既存のPDFファイルへのテキストの追加も可能です。

AddSubsettedFontメソッドを使って追加されたフォントを使った文書の場合、PDFファイルのプロパティを参照すると、下記のように「フォント」の「エンコーディング」のところが「カスタム」と表示されています。
font_property.jpg
posted by PDF太郎 at 22:27| Comment(0) | TrackBack(0) | サンプルプログラム | このブログの読者になる | 更新情報をチェックする

PDFファイルにテキストを追加する(Perl/CGI版)

Quick PDF Libraryを使ってPDFファイルにテキストを追加するPHPサンプルプログラムを前回紹介しました(参照:PHP版サンプルコード)。今回は、Perl/CGIの場合のコードをご紹介します。Perlなら下記のようなコードで、PDFファイルに日本語テキストを追加できます(このPerlコードの文字コードはShift_JISですので、日本語はShift_JISのバイト配列になっています)。DrawTextメソッドについての詳細は、Quick PDF Libraryの体験版もしくは製品版のマニュアル(PDF)にも記載されていますが、こちらにも記載されています。

なお、PHPのCOMクラスにおける日本語のような2バイト文字の取り扱いには不具合がありハックが必要でしたが、Perlの場合は不要のようです。

#!/usr/local/bin/perl

#このPerlプログラムの文字コードはShift_JISで作成しています。

use Win32::OLE;
use File::Basename;

my $ClassName = "DebenuPDFLibraryAX0912.PDFLibrary";

##ライセンスキー
my $LicenseKey = "ライセンスキー";

my $PDFLibrary = Win32::OLE->new($ClassName);

if(!$PDFLibrary){
	print "Content-type: text/html\n\n";
	print "COM error";
	exit;
}

if($PDFLibrary->UnlockKey($LicenseKey) == 1){
	print "Content-type: text/html\n\n";
	print "License validation successful!";
	print "
"; print "Valid license key: "; print $PDFLibrary->LicenseInfo; print "

"; }else{ print "Content-type: text/html\n\n"; print "License validation failed!"; print "

"; exit; } #フォントを選択 HeiseiKakuGo-W5 (Bold) $PDFLibrary->AddCJKFont(2); my $text = "あいうえおテスト漢字コg@括Uケ戌ア本日は晴天なり。アイウエオ"; #Quick PDF Libraryでは、座標系はデフォルトで0,0がPDFファイル #の左下になりますので注意してください。 #http://www.quickpdflibrary.com/help/quickpdf/DrawText.php $PDFLibrary->DrawText(50,650,$text); my $filename = "draw_text_test_perl.pdf"; #Quick PDF Libraryでは常にフルパスに変換して処理 my $basename = basename $0; my $dir = $0; $dir =~ s/$basename//g; my $filename_full = $dir ."\\$filename"; #保存します。 $PDFLibrary->SaveToFile($filename_full); $PDFLibrary = undef; print "success
"; print "$filename
";
上記のサンプルコードでは、PDFファイルを無から新規作成する形になっていますが、もちろん既存のPDFファイルへのテキストの追加も可能です。また、任意のフォントでのテキスト追加も、そのフォントのライセンスが許す限り可能ですが、そのためのコードの紹介は次回以降にさせていただきます。
posted by PDF太郎 at 19:18| Comment(0) | TrackBack(0) | サンプルプログラム | このブログの読者になる | 更新情報をチェックする

PDFファイルにテキストを追加する(PHP版)

PDFファイルにテキストを追加するというのは基本中の基本の機能ですが、Quick PDF Libraryでも当然出来ます。日本語にも対応しています。PHPなら下記のようなコードで、PDFファイルに日本語テキストを追加できます(このPHPコードの文字コードはShift_JISですので、日本語はShift_JISのバイト配列になっています)。DrawTextメソッドについての詳細は、Quick PDF Libraryの体験版もしくは製品版のマニュアル(PDF)にも記載されていますが、こちらにも記載されています。

なお、PHPのCOMクラスにおける日本語のような2バイト文字の取り扱いには不具合がありますので注意が必要です。テキストの末尾に、出現するはずの無い謎の文字(junk bytes)が出現します。PHPの最新版でも、2012年11月1日現在、直っていないようです。

参照:Bug #40664 String conversion functions wrong for multibyte chars
https://bugs.php.net/bug.php?id=40664

<?php
	//このPHPファイルの文字コードはShift_JISで作成しています。
	$PDFLibrary= new COM("DebenuPDFLibraryAX0912.PDFLibrary");
	if(!$PDFLibrary){
		echo "COM error";
		exit;
	}

	if($PDFLibrary->UnlockKey("ライセンスキー") == 1){
		echo "License validation successful!";
		echo "
"; echo "Valid license key: "; echo $PDFLibrary->LicenseInfo; echo "

"; }else{ echo "License validation failed!"; echo "

"; exit; } //フォントを選択 HeiseiKakuGo-W5 (Bold) $PDFLibrary->AddCJKFont(2); $text = "あいうえおテスト漢字コg@括Uケ戌ア本日は晴天なり。アイウエオ"; //PHPのCOMクラスには日本語の扱いに不具合があります。 // https://bugs.php.net/bug.php?id=40664 //PHPのバグに対処。無意味な空白文字を大量追加します。 //この対処をしないと、関係の無い文字が本来のテキストの後ろに //表示される場合があります。 for($i=0;$i<300;$i++){ $text .=" "; } //Quick PDF Libraryでは、座標系はデフォルトで0,0がPDFファイル //の左下になりますので注意してください。 //http://www.quickpdflibrary.com/help/quickpdf/DrawText.php $PDFLibrary->DrawText(50,650,$text); $filename = "draw_text_test.pdf"; //Quick PDF Libraryでは常にフルパスに変換して処理 $dir = realpath("./"); $filename_full = $dir ."\\$filename"; //保存します。 $PDFLibrary->SaveToFile($filename_full); $PDFLibrary = null; echo "success
"; echo "$filename
"; ?>
上記のサンプルコードでは、PDFファイルを無から新規作成する形になっていますが、もちろん既存のPDFファイルへのテキストの追加も可能です。また、任意のフォントでのテキスト追加も、フォントのライセンスが許す限り可能ですが、そのためのコードの紹介は次回以降にさせていただきます。

2012年11月25日午後10時35分ごろ追加
任意のフォントを使ってテキストをPDFファイルに追加する方法」を先ほどアップしました。
posted by PDF太郎 at 18:06| Comment(0) | TrackBack(1) | サンプルプログラム | このブログの読者になる | 更新情報をチェックする
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。