- Ghostscript:は、PostSriptファイルとPDFファイルを解釈するWindows、Linux、Macの3つの主要なプラットフォームすべてで利用できるコマンドラインユーティリティです。これについて詳しくは、彼の公式サイト。
- ImageMagick:これは、ラスター画像とベクター画像ファイルを表示、変換、編集するための無料のオープンソースソフトウェアパッケージです。 PHPを含むほとんどの主要なプログラミング言語。これがクイック概要の標準ドキュメントです。
#RPMベースのディストリビューション、Fedora 26/27/28 $ sudo dnf install ghostscript確認このコマンドを使用したインストール
$gs --versionインストール後、PDFファイルを含むディレクトリに移動し、次のコマンドを実行します。
$ gs -dSAFER -dBATCH -sDEVICE = jpeg -dTextAlphaBits = 4 -dGraphicsAlphaBits = 4 -dFirstPage = 1 -dLastPage = 1 -r300 -sOutputFile = Preview.jpg input.pdfこれにより、ドキュメントから最初のページの画像が作成されます。実際の動作を理解しましょう。
- -sDEVICE:出力画像ファイル形式を設定します。
- -sTEXTVAL、-sGRAPHICVAL:結果の画像のアンチエイリアシングを設定します。有効な値は、1、2、および4です。
- -r {NUM}:画像の解像度(dpi)を設定します。
- -sFirstPage、-sLastPage:表示するドキュメントの最初と最後のページを設定します。
- -sOutputFile:出力の名前を設定しますファイル。
- input.pdf:これは、変換に使用される実際のPDFドキュメントです。
exec()関数
を呼び出します。例: <? php
exec
(
"ls -l"
、
$ output_str
、
$ return_val
);
foreach
(
$ output_str
as
$ line
){
echo
$ line
。
""
;
}
?>;
このLinuxの例では、 ls
を実行し、すべてのディレクトリとファイルをコンソールに出力します。この概念を使用して、PHPコードからコマンドを実行します。これが私がやった方法です; <? php
function
is_pdf(
$ file
){
$ file_content
=
file_get_contents
(
$ file
) ;
if
(preg_match(
"/ ^%PDF- [0-1 ]。[0-9]+/ "
、
$ file_content
)){
return
true;
}
else
{
return
false;
}
}
function
create_preview(
$ file
){
$ output_format
=
"jpeg"
;
$ antialiasing
=
"4"
;
$ Preview_page
=
"1"
;
$ resolution
=
"300"
;
$ output_file
=
"preview.jpg"
;
$ exec_command
=
"gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE ="
。
$ output_format
。
""
;
$ exec_command
<コード>。 = "-dTextAlphaBits ="
。
$ antialiasing
。
"-dGraphicsAlphaBits ="
。
$ antialiasing
。
""
;
$ exec_command
。 =
"-dFirstPage ="
。
$ Preview_page
。
"-dLastPage ="
。
$ Preview_page
。
""
;
$ exec_command
。 =
"-r"
。
$ resolution
。
""
;
$ exec_command
。 =
"-sOutputFile ="
。
$ output_file
。
"`"
。
$ file
。
"`"
;
echo
"コマンドを実行しています..."
;
exec
(
$ exec_command
、
$ command_output
、
$ return_val
);
foreach
(
$ command_output
as
$ line
){
echo
$ line
。
""
;
}
if
(!
$ return_val
){
echo
"プレビューが正常に作成されました!!"
;
}
else
{
echo
"プレビューの作成中にエラーが発生しました。"
;
}
}
function
__ main __(){
global
$ argv
;
$ input_file
=
$ argv
[1];
if
(is_pdf(
$ input_file
)){
//PDFプレビューを作成
create_preview(
$ input_file
);
}
else
{
echo
"入力ファイル"
。
$ input_file
。
"は有効なPDFドキュメントではありません。"
;
}
}
__ main __();
?>
実行スターコマンドラインでPDFファイルを受け入れる__main __()
を使用します。入力ファイルが有効なPDFであるかどうかをチェックします。有効な場合は、入力ファイルに対してコマンドを実行します。
終了: $ phppdf_preview.phpinput.pdfコマンドを実行しています...GPLGhostscript 9.22(2017-10-04) Copyright(C)2017 Artifex Software、Inc.無断複写・転載を禁じます。このソフトウェアには保証はありません。詳細については、PUBLICファイルを参照してください。ページ1から1を処理しています。Page1プレビューが正常に作成されました。
ImageMagickの使用いつものように、システムにImageMagickバイナリをインストールすることから始めます。依存関係から始めましょう。 $ sudo dnf install gcc php-devel php-pear
次にImageMagickをインストールします;$ sudo dnf install ImageMagick ImageMagick-devel
次に、PHPラッパークラスをインストールします; $ sudo pecl install imagick $ sudo bash -c "echo" extension = imagick.so "> / etc /php.d/imagick.ini"
LAMPアーキテクチャで使用する場合は、ApacheWebサーバーの再起動を検討してください。 $ sudo service httpd restart
システムの準備ができたので、サンプルプロジェクトでImageMagickを使用できます。スクリプトの基本的な機能は同じです。 create_preview()
関数のコンテンツを次のコードに置き換えるだけです。 function
create_preview(
$ file
){
$ output_format
=
"jpeg"
;
$ Preview_page
=
"1"
;
<コード>
$ resolution
=
"300"
;
$ output_file
=
"imagick_preview.jpg"
;
echo
"プレビューを取得しています..."
;
$ img_data
=
new
Imagick();
$ img_data
-> setResolution(
$ resolution
、
$ resolution
);
$ img_data
-> readImage(
$ file 。
"["
。 (
$ Preview_page
-1)。
"]"
);
$ img_data
-> setImageFormat(
$ output_format
);
file_put_contents
(
$ output_file
、
$ img_data
、FILE_USE_INCLUDE_PATH );
}
コードは一目瞭然です。タイプImagick
のインスタンスを定義し、解像度、ファイル形式などのさまざまなパラメータを設定します。表示するPDFページは、ファイル名の後に配列インデックスと呼ばれます。例:最初のページ:input.pdf [0] 2番目のページ:input.pdf[1]。 ... ... N番目のページ:input.pdf [N-1]
出力: $ phppdf_preview.phpinput.pdfプレビューの取得...なぜ前の方法よりもこの方法を使用するのか疑問に思っています。そうですね、ImageMagickはPHPコードと非常によく一致していることがわかりました。プログラミングのコマンドラインは見栄えがよくなく、一般的な知識になることもあります。ただし、同じ構成セットで、GhostscriptはImageMagickによって生成されたファイルよりも小さい画像ファイルを生成しました。これがいくつかの最適化の問題によるものかどうかはわかりませんが、違いはありません。どちらを選択するかは、単に自分の好みに基づいているため、特定のPDFドキュメントのプレビューを作成する方法です。この投稿から何か新しいことを学んだことを願っています。どちらの方法がいいですか?さらなる改善のための提案はありますか?コメント欄でお気軽にご連絡ください。