多くの時間を高速で簡単に検索しましたが、ほとんどの場合、PDFドキュメントでページ数を取得する方法は正確)です。 PDFで多くの作業を行うグラフィック印刷および複製会社で働いているため、ドキュメント内のページ数を処理する前に正確に知る必要があります。PDFドキュメントはさまざまなクライアントから来ているため、同じアプリケーションで生成されたり、同じ圧縮方法を使用しないでください。
ここに私が見つけた答えのいくつかがありますinsufficientまたは単に動作しない:
Imagickには多くのインストールが必要で、Apacheを再起動する必要があり、最終的に動作させると、処理に驚くほど時間がかかり(ドキュメントあたり2〜3分)、すべてのドキュメントで常に_1
_ページが返されましたImagickの実際のコピーを見たことがないので、私はそれを捨てました。それはgetNumberImages()
メソッドとidentifyImage()
メソッドの両方でした。
FPDIは簡単に使用およびインストールできます(ファイルを抽出してPHPスクリプト)を呼び出すだけです)、[〜#〜] but [〜#〜]圧縮技術の多くはFPDIでサポートされていないため、エラーが返されます。
FPDFエラー:このドキュメント(test_1.pdf)は、おそらくFPDIに同梱されている無料のパーサーではサポートされていない圧縮技術を使用しています。
これにより、ストリーム内でPDFファイルが開かれ、ページ数などを含む何らかの文字列が検索されます。
_$f = "test1.pdf";
$stream = fopen($f, "r");
$content = fread ($stream, filesize($f));
if(!$stream || !$content)
return 0;
$count = 0;
// Regular Expressions found by Googling (all linked to SO answers):
$regex = "/\/Count\s+(\d+)/";
$regex2 = "/\/Page\W*(\d+)/";
$regex3 = "/\/N\s+(\d+)/";
if(preg_match_all($regex, $content, $matches))
$count = max($matches);
return $count;
_
/\/Count\s+(\d+)/
(_/Count <number>
_を検索)は機能しません。これは、パラメータ_/Count
_が内部にあるドキュメントが少数であるため、ほとんどの場合、何も返さないためです。 ソース/\/Page\W*(\d+)/
(_/Page<number>
_を探します)はページ数を取得しません。ほとんどの場合、他のデータが含まれています。 ソース/\/N\s+(\d+)/
(_/N <number>
_を検索)も機能しません。ドキュメントには_/N
_の複数の値を含めることができるためです。すべてではないにしても、ほとんどの場合、ページ数を含むnot。 ソースそれで、信頼性が高く正確な機能は何ですか?
LinuxおよびWindows用にダウンロード可能 です。いくつかの小さなPDF関連プログラムを含む圧縮ファイルをダウンロードします。どこかに展開します。
それらのファイルの1つは、pdfinfo(またはWindowsの場合はpdfinfo.exe) 。 PDFドキュメントで実行すると返されるデータの例:
Title: test1.pdf
Author: John Smith
Creator: PScript5.dll Version 5.2.2
Producer: Acrobat Distiller 9.2.0 (Windows)
CreationDate: 01/09/13 19:46:57
ModDate: 01/09/13 19:46:57
Tagged: yes
Form: none
Pages: 13 <-- This is what we need
Encrypted: no
Page size: 2384 x 3370 pts (A0)
File size: 17569259 bytes
Optimized: yes
PDF version: 1.6
PDF false pagecountを返したドキュメントはまだ見ていません。また、200 + MBの大きなドキュメントでも、応答時間はほんの数秒です。以下。
ここでは、出力からページカウントを抽出する簡単な方法があります。PHPの場合:
// Make a function for convenience
function getPDFPages($document)
{
$cmd = "/path/to/pdfinfo"; // Linux
$cmd = "C:\\path\\to\\pdfinfo.exe"; // Windows
// Parse entire output
// Surround with double quotes if file name has spaces
exec("$cmd \"$document\"", $output);
// Iterate through lines
$pagecount = 0;
foreach($output as $op)
{
// Extract the number
if(preg_match("/Pages:\s*(\d+)/i", $op, $matches) === 1)
{
$pagecount = intval($matches[1]);
break;
}
}
return $pagecount;
}
// Use the function
echo getPDFPages("test 1.pdf"); // Output: 13
もちろん、このコマンドラインツールは、外部プログラムからの出力を解析できる他の言語でも使用できますが、私はPHPで使用しています。
純粋なPHPではないことを知っていますが、外部プログラムはwayの方がPDF処理(質問で見られるように)。
これが人々の助けになることを願っています。私はこれに対する解決策を見つけるために多くの時間を費やし、見つけられなかったPDF pagecountについての多くの質問を見てきました私が探していた答えです。だから私はこの質問をして、自分で答えました。
最も簡単なのはImageMagickを使用することです
ここにサンプルコードがあります
$image = new Imagick();
$image->pingImage('myPdfFile.pdf');
echo $image->getNumberImages();
そうでない場合は、PDF
やMPDF
のようなTCPDF
などのPHP
ライブラリも使用できます。
シェルにアクセスできる場合、最も単純な(ただし、100%のPDFでは使用できない)アプローチはgrep
を使用することです。
これにより、ページ数のみが返されます。
grep -m 1 -aoP '(?<=\/N )\d+(?=\/)' file.pdf
例: https://regex101.com/r/BrUTKn/1
スイッチの説明:
-m 1
は、いくつかのファイルが正規表現パターンの複数の一致を持つ可能性があるために必要です(これをmatch-only-first正規表現ソリューション拡張で置き換えるには、ボランティアが必要です)-a
は、バイナリファイルをテキストとして扱うために必要です。-o
一致のみを表示する-P
Perlの正規表現を使用する正規表現の説明:
(?<=\/N )
後読み/N
(nb。スペース文字はここには表示されません)\d+
任意の桁数(?=\/)
先読み/
注意:一致するものが見つからない場合は、1ページしかないと想定しても安全です。
これは、特別なパッケージやコマンド出力の解析を必要とせずに、かなりうまくいくようです。
<?php
$target_pdf = "multi-page-test.pdf";
$cmd = sprintf("identify %s", $target_pdf);
exec($cmd, $output);
$pages = count($output);
追加のパッケージをインストールできない場合は、次のシンプルなワンライナーを使用できます。
foundPages=$(strings < $PDF_FILE | sed -n 's|.*Count -\{0,1\}\([0-9]\{1,\}\).*|\1|p' | sort -rn | head -n 1)
コマンドラインユーティリティを使用しても大丈夫なので、 cpdf (Microsoft Windows/Linux/Mac OS X)を使用できます。 1つのPDFのページ数を取得するには:
cpdf.exe -pages "my file.pdf"
以下のようにqpdf
を使用できます。ファイルfile_name.pdfに100ページがある場合、
$ qpdf --show-npages file_name.pdf
100
以下は、R
コマンドを使用してPDFファイルページ番号を報告するpdfinfo
関数です。
pdf.file.page.number <- function(fname) {
a <- pipe(paste("pdfinfo", fname, "| grep Pages | cut -d: -f2"))
page.number <- as.numeric(readLines(a))
close(a)
page.number
}
if (F) {
pdf.file.page.number("a.pdf")
}
Rパッケージ pdftools および関数pdf_info()
は、pdfのページ数に関する情報を提供します。
library(pdftools)
pdf_file <- file.path(R.home("doc"), "NEWS.pdf")
info <- pdf_info(pdf_file)
nbpages <- info[2]
nbpages
$pages
[1] 65
PDFファイルページ番号を報告するgsscriptを使用したWindowsコマンドスクリプト
@echo off
echo.
rem
rem this file: getlastpagenumber.cmd
rem version 0.1 from commander 2015-11-03
rem need Ghostscript e.g. download and install from http://www.ghostscript.com/download/
rem Install path "C:\prg\ghostscript" for using the script without changes \\ and have less problems with UAC
rem
:vars
set __gs__="C:\prg\ghostscript\bin\gswin64c.exe"
set __lastpagenumber__=1
set __pdffile__="%~1"
set __pdffilename__="%~n1"
set __datetime__=%date%%time%
set __datetime__=%__datetime__:.=%
set __datetime__=%__datetime__::=%
set __datetime__=%__datetime__:,=%
set __datetime__=%__datetime__:/=%
set __datetime__=%__datetime__: =%
set __tmpfile__="%tmp%\%~n0_%__datetime__%.tmp"
:check
if %__pdffile__%=="" goto error1
if not exist %__pdffile__% goto error2
if not exist %__gs__% goto error3
:main
%__gs__% -dBATCH -dFirstPage=9999999 -dQUIET -dNODISPLAY -dNOPAUSE -sstdout=%__tmpfile__% %__pdffile__%
FOR /F " tokens=2,3* usebackq delims=:" %%A IN (`findstr /i "number" test.txt`) DO set __lastpagenumber__=%%A
set __lastpagenumber__=%__lastpagenumber__: =%
if exist %__tmpfile__% del %__tmpfile__%
:output
echo The PDF-File: %__pdffilename__% contains %__lastpagenumber__% pages
goto end
:error1
echo no pdf file selected
echo usage: %~n0 PDFFILE
goto end
:error2
echo no pdf file found
echo usage: %~n0 PDFFILE
goto end
:error3
echo.can not find the ghostscript bin file
echo. %__gs__%
echo.please download it from:
echo. http://www.ghostscript.com/download/
echo.and install to "C:\prg\ghostscript"
goto end
:end
exit /b