2015年02月13日

検索されないPDFファイルを作成する方法

PDFファイルの中には、表示自体は正しい日本語でも、テキストを選択して、コピー&ペーストすると文字化けしまくる不思議なPDFファイルに出くわすことがあります。意図的にやっているのではなく、多くの場合、単にPDFファイルを作成するソフトウェアがバグっているか、設定が間違っていることが原因なのでしょうが、その「バグ」を人為的に再現できないかを研究しています。

しかし、一番手っ取り早い方法は画像ベースのPDFファイルを作成することだと、当たり前の結論にたどりつつあります。Quick PDF LibraryでもPDFファイルをまずJPEGに変換する機能もありますし、逆にJPEGファイルをPDFファイルに変換する機能も付いていますので、プログラムをしっかり組めべ、普通のテキストベースのPDFファイルを画像ベースのPDFファイルに変換することは可能は可能なのですが、結構手間がかかります。

しかし、Quick PDF Library開発元のDebenu社がリリースしているDebenu PDF Tools Proを使えば、画像ベースへのPDFファイルへの変換も比較的簡単にできます。もちろんバッチ処理可能です。Debenu PDf Tools Proを使った画像ベースのPDFファイルへの変換方法はこちらを参照してください。

【関連する記事】
posted by PDF太郎 at 00:14| Comment(0) | TrackBack(0) | その他 | このブログの読者になる | 更新情報をチェックする

2014年09月17日

Quick PDF LibraryがWEB最適化(linearization)に対応

Quick PDF Libraryの最新バージョン11が先日リリースされ、待望のWEB最適化に対応しました。

ただし、ページ数が多い場合(100ページを超える場合。特にBookmark=しおりを表示させているPDFの場合が多いです。)に不具合が見られるようであり、サポートに問い合わせ中です。この不具合さえクリアされれば、Quick PDF Libraryはまさに最強のPDFライブラリーといえるでしょう。
posted by PDF太郎 at 16:27| Comment(0) | TrackBack(0) | サンプルプログラム | このブログの読者になる | 更新情報をチェックする

2012年12月03日

PDFファイルのページサイズを取得する(PHP編その2・トラブルシューティング)

前回は、PDFファイルの各ページのサイズ(WidthやHeight)を取得する方法としてPageWidthメソッド及びPageHeightメソッドをご紹介しましたが、実は、この標準メソッドでは正しくサイズを取得できないPDFファイルがあることが分かり、Quick PDF Libraryのサポートに連絡したことがあります。その時に教えてもらったのが、下記のような自作関数を用いる方法です。このMyGetPageWidth関数及びMyGetPageHeight関数で取得した値は常に正しいようです。(私が調べた限りでは、)Adobe® Readerなどで表示されるサイズと全く同じです。

だったら、最初からMyGetPageWidth関数の方だけ使えば良さそうですが、私の場合、敢えてGetWidthメソッドとMyGetPageWidth関数の両方を兼用しています。この2つの数値が違うPDFファイルの場合、何らかの理由でファイルの構造がおかしくなっているか、少なくとも標準タイプではない、問題児とも言うべきPDFファイルの場合がほとんどです。この場合、テキストや画像などを描画する際の座標系の指定もことごとくおかしくなっているため、このようなファイルの場合、最初にNormalizePageメソッドでNormalize(正常化・標準に合わす作業)する必要があります。

しかし、私の頭のイメージの中では、NormalizePageメソッドは劇薬系であり、できるだけ使わずに、どうしても必要な場合にのみ使いたいというのが本音としてあります。ファイルサイズがオリジナルのファイルと比べてかなり増える場合があるからです。(NormalizePageメソッド利用後、ファイルサイズがかなり増える問題は、サポートに問い合わせてかなり改善してもらいましたが、それでも1.3倍以上になる場合もあります。)

このどうしても使わなくてもいけないケースのうちの一つが、このPageWidthメソッドの値とMyGetPageWidth関数の値が食い違っている場合です。ですから、Normalizeメソッドを使用しなければならないケースかどうかを判断するための手段として、敢えて、PageWidthメソッドとMyGetPageWidth関数の両方を私は併用しています。

以下は、トラブルシューティング用の自作関数を用いたPHPのサンプルコードです。

<?php

	error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

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

	$PDFLibrary= new COM("DebenuPDFLibraryAX0912.PDFLibrary");
	if(!$PDFLibrary){
		echo "COM error";
		exit;
	}

	if($PDFLibrary->UnlockKey("ライセンスキー") == 1){
		header("Content-type: text/html; charset=Shift_JIS");
		echo "License validation successful!";
		echo "
"; echo "Valid license key: "; echo $PDFLibrary->LicenseInfo; echo "

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

"; exit; } //トラブルシューティング用のwidth取得関数 function MyGetPageWidth(){ global $PDFLibrary; $mediaw = $PDFLibrary->GetPageBox(1, 2); $cropw = $PDFLibrary->GetPageBox(2, 2); if ($cropw != 0){ return $cropw; }else{ return $mediaw; } } //トラブルシューティング用のheight取得関数 function MyGetPageHeight(){ global $PDFLibrary; $mediah = $PDFLibrary->GetPageBox(1, 3); $croph = $PDFLibrary->GetPageBox(2, 3); if ($croph != 0){ return $croph; }else{ return $mediah; } } $filename ="manual.pdf"; //Quick PDF LibraryでPDFファイルを取り扱うときは常にフルパスに $filename = realpath($filename); try{$result = $PDFLibrary->LoadFromFile($filename,"");}catch(Exception $error){ echo "can not load " . $filename . "
"; echo $error . "
"; $error_code=$PDFLibrary->LastErrorCode(); echo $error_code . "
"; exit; } if(!$result){ $error_code=$PDFLibrary->LastErrorCode(); echo "load error
". $error_code; exit; } //ミリメートルで表示したい場合などは、SetMeasurementUnitsメソッドを利用して //ください。デフォルトの単位は、ポイントにになっています。 //http://www.quickpdflibrary.com/help/quickpdf/SetMeasurementUnits.php //$PDFLibrary->SetMeasurementUnits(1); $pages = $PDFLibrary->PageCount(); for($i=1;$i<=$pages;$i++){ //PDFファイルの場合、いろんな用紙サイズが混在できるのも大きな特長 //の一つですから、必ずしも全頁同じサイズとは限りません。 $PDFLibrary->SelectPage($i); //標準のPageWidthメソッドを使わないで、トラブルシューティング用の関数 //を使用する場合 $pdf_width = MyGetPageWidth(); $pdf_height = MyGetPageHeight(); echo $i . "ページ目:" . $pdf_width."*". $pdf_height."
\n"; } $PDFLibrary = null; echo "finish"; ?>


posted by PDF太郎 at 11:57| Comment(0) | TrackBack(0) | サンプルプログラム | このブログの読者になる | 更新情報をチェックする
×

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