PDF 문서의 페이지 수 얻기
이 질문은 참조와 비교를위한 것입니다. 해결책은 아래에서 허용되는 대답입니다 .
여러 시간 동안 PDF 문서의 페이지 수를 얻는 빠르고 쉬우면서도 대부분 정확한 방법을 찾았습니다 . 저는 PDF 작업을 많이하는 그래픽 인쇄 및 복제 회사에서 일하기 때문에 문서의 페이지 수를 정확하게 알고 있어야 처리됩니다. PDF 문서는 다양한 클라이언트에서 제공되므로 동일한 응용 프로그램으로 생성되지 않거나 동일한 압축 방법을 사용하지 않습니다.
다음은 불충분 하거나 작동하지 않는 답변 중 일부입니다 .
사용 Imagick (PHP 확장)
Imagick은 많은 설치가 필요하고 Apache를 다시 시작해야합니다. 마침내 작동하게되었을 때 처리하는 데 놀라 울 정도로 오래 걸렸고 (문서 당 2 ~ 3 분) 항상 1
모든 문서의 페이지를 반환했습니다 (작업 사본을 보지 못함). 지금까지 Imagick의), 그래서 나는 그것을 버렸습니다. 그것은 getNumberImages()
및 identifyImage()
방법 모두였습니다 .
사용 FPDI을 (PHP는 라이브러리)
FPDI 사용하고 (단지 파일을 추출하는 PHP 스크립트를 호출) 설치가 용이, 하지만 압축 기술의 대부분은 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
. 전부는 아니지만 대부분은 페이지 수를 포함하지 않습니다 . 출처.
그렇다면 신뢰할 수 있고 정확한 작업은 무엇입니까?
pdfinfo 라는 간단한 명령 줄 실행 파일 .
Linux 및 Windows 용 으로 다운로드 할 수 있습니다. 몇 가지 작은 PDF 관련 프로그램이 포함 된 압축 파일을 다운로드합니다. 어딘가에 추출하십시오.
이러한 파일 중 하나는 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 문서를 보지 못했습니다. 200MB 이상의 큰 문서에서도 응답 시간이 몇 초 이하로 매우 빠릅니다.
여기 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를 알고 있지만, 외부 프로그램은 방법 (질문에서와 같이) PDF 처리에 더 나은.
나는 이것에 대한 해결책을 찾기 위해 많은 시간을 보냈고 내가 찾고 있던 답을 찾지 못한 PDF 페이지 수에 대한 많은 질문을 보았 기 때문에 이것이 사람들을 도울 수 있기를 바랍니다. 그래서 제가이 질문을하고 직접 대답했습니다.
가장 간단한 방법은 ImageMagick을 사용하는 것입니다.
다음은 샘플 코드입니다.
$image = new Imagick();
$image->pingImage('myPdfFile.pdf');
echo $image->getNumberImages();
그렇지 않으면 당신은 또한 사용할 수 있습니다 PDF
와 같은 라이브러리를 MPDF
나 TCPDF
에 대해PHP
추가 패키지를 설치할 수없는 경우 다음과 같은 간단한 한 줄짜리를 사용할 수 있습니다.
foundPages=$(strings < $PDF_FILE | sed -n 's|.*Count -\{0,1\}\([0-9]\{1,\}\).*|\1|p' | sort -rn | head -n 1)
이것은 특별한 패키지 나 구문 분석 명령 출력 없이도 꽤 잘 작동하는 것 같습니다.
<?php
$target_pdf = "multi-page-test.pdf";
$cmd = sprintf("identify %s", $target_pdf);
exec($cmd, $output);
$pages = count($output);
셸에 액세스 할 수있는 경우 가장 간단한 (PDF의 100 %에서 사용할 수 없음) 접근 방식은 grep
.
페이지 수만 반환해야합니다.
grep -m 1 -aoP '(?<=\/N )\d+(?=\/)' file.pdf
예 : https://regex101.com/r/BrUTKn/1
스위치 설명 :
-m 1
일부 파일은 정규식 패턴의 일치를 두 개 이상 가질 수 있으므로 필요합니다 (이를 일치 전용 첫 번째 정규식 솔루션 확장으로 바꾸려면 volonteer 필요)-a
바이너리 파일을 텍스트로 처리하는 데 필요합니다.-o
경기 만 보여주기 위해-P
Perl 정규 표현식을 사용하려면
정규식 설명 :
- 시작 "구분자":
(?<=\/N )
뒤에/N
보이는 (nb. 공백 문자는 여기에 표시되지 않음) - 실제 결과 :
\d+
임의의 자릿수 - 끝 "구분자":
(?=\/)
미리보기/
Nota bene: if in some case match is not found, it's safe to assume only 1 page exists.
Since you're ok with using command line utilities, you can use cpdf (Microsoft Windows/Linux/Mac OS X). To obtain the number of pages in one PDF:
cpdf.exe -pages "my file.pdf"
You can use qpdf
like below. If a file file_name.pdf has 100 pages,
$ qpdf --show-npages file_name.pdf
100
Here is a R
function that reports the PDF file page number by using the pdfinfo
command.
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")
}
Here is a Windows command script using gsscript that reports the PDF file page number
@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
The R package pdftools and the function pdf_info()
provides information on the number of pages in a pdf.
library(pdftools)
pdf_file <- file.path(R.home("doc"), "NEWS.pdf")
info <- pdf_info(pdf_file)
nbpages <- info[2]
nbpages
$pages
[1] 65
참고URL : https://stackoverflow.com/questions/14644353/get-the-number-of-pages-in-a-pdf-document
'IT TIP' 카테고리의 다른 글
2 개의 "float"를 사용하여 "double"을 에뮬레이션 (0) | 2020.12.11 |
---|---|
Codemirror 텍스트 영역의 가치를 얻는 방법 (0) | 2020.12.11 |
Ruby에서 예외를 포착 한 후 다시 발생 (동일한 예외) (0) | 2020.12.11 |
Mac에 sshpass를 설치하는 방법은 무엇입니까? (0) | 2020.12.10 |
Node.js의 S3 getObject에서 응답을 얻는 방법은 무엇입니까? (0) | 2020.12.10 |