web-dev-qa-db-ja.com

PDFドキュメントのページ数を取得する

この質問は参照と比較のためのものです。解決策は 以下の受け入れられた回答

多くの時間を高速で簡単に検索しましたが、ほとんどの場合、PDFドキュメントでページ数を取得する方法は正確)です。 PDFで多くの作業を行うグラフィック印刷および複製会社で働いているため、ドキュメント内のページ数を処理する前に正確に知る必要があります。PDFドキュメントはさまざまなクライアントから来ているため、同じアプリケーションで生成されたり、同じ圧縮方法を使用しないでください。

ここに私が見つけた答えのいくつかがありますinsufficientまたは単に動作しない

Imagick (a PHP extension)

Imagickには多くのインストールが必要で、Apacheを再起動する必要があり、最終的に動作させると、処理に驚くほど時間がかかり(ドキュメントあたり2〜3分)、すべてのドキュメントで常に_1_ページが返されましたImagickの実際のコピーを見たことがないので、私はそれを捨てました。それはgetNumberImages()メソッドとidentifyImage()メソッドの両方でした。

[〜#〜] fpdi [〜#〜] (a PHP library)を使用

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ソース

それで、信頼性が高く正確な機能は何ですか?

以下の回答を参照

58
Richard de Wit

pdfinfoという単純なコマンドライン実行可能ファイル。

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についての多くの質問を見てきました私が探していた答えです。だから私はこの質問をして、自分で答えました。

85
Richard de Wit

最も簡単なのはImageMagickを使用することです

ここにサンプルコードがあります

$image = new Imagick();
$image->pingImage('myPdfFile.pdf');
echo $image->getNumberImages();

そうでない場合は、PDFMPDFのようなTCPDFなどのPHPライブラリも使用できます。

17
Kuldeep Dangi

シェルにアクセスできる場合、最も単純な(ただし、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ページしかないと想定しても安全です。

1
Saran

これは、特別なパッケージやコマンド出力の解析を必要とせずに、かなりうまくいくようです。

<?php                                                                               

$target_pdf = "multi-page-test.pdf";                                                
$cmd = sprintf("identify %s", $target_pdf);                                         
exec($cmd, $output);                                                                
$pages = count($output);
1
dhildreth

追加のパッケージをインストールできない場合は、次のシンプルなワンライナーを使用できます。

foundPages=$(strings < $PDF_FILE | sed -n 's|.*Count -\{0,1\}\([0-9]\{1,\}\).*|\1|p' | sort -rn | head -n 1)
1
Muad'Dib

コマンドラインユーティリティを使用しても大丈夫なので、 cpdf (Microsoft Windows/Linux/Mac OS X)を使用できます。 1つのPDFのページ数を取得するには:

cpdf.exe -pages "my file.pdf"
1

以下のようにqpdfを使用できます。ファイルfile_name.pdfに100ページがある場合、

$ qpdf --show-npages file_name.pdf
100
1
SuperNova

以下は、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")
}
0
Feiming Chen

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
0
emeryville

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
0
commander