读取 PDF 文件并获取其尺寸以验证其大小 PHP

haa*_*kym 1 php pdf ghostscript fpdf fpdi

我正在向现有 Web 应用程序添加一项新功能,该功能将验证上传的 PDF 文件的大小以确保其不小于 A4。Web 应用程序是使用 PHP/Laravel 构建的。

\n

我考虑了两种方法来解决这个问题:

\n
    \n
  1. 通过 php exec 使用 GhostScript 读取上传的文件并获取其尺寸 - 我还无法使这种方法发挥作用
  2. \n
  3. 使用 PHP PDF 库读取上传的文件并获取其尺寸(例如 fdpi/fpdf) - 我有一些工作(我认为!)
  4. \n
\n

至于 Ghostscript,我在 SO 上找到了这个答案,建议使用一个名为的附加脚本pdf_info.ps(我确实按照评论建议首先下载了这个脚本)。但是,我无法让它正常工作。在将其添加到任何 PHP 脚本之前,我尝试运行以下命令:

\n
\xce\xbb .\\gswin64c -dNODISPLAY -q -sFile=c:\\test.pdf [-dDumpMediaSizes=false] [-dDumpFontsNeeded=false] [-dDumpXML] [-dDumpFontsUsed [-dShowEmbeddedFonts] ] ..\\toolbin\\pdf_info.ps\nError: /undefinedfilename in ([-dDumpMediaSizes=false])\nOperand stack:\n\nExecution stack:\n   %interp_exit   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   --nostringval--   --nostringval--   false   1   %stopped_push\nDictionary stack:\n   --dict:1196/1684(ro)(G)--   --dict:0/20(G)--   --dict:78/200(L)--\nCurrent allocation mode is local\nLast OS error: No such file or directory\nGPL Ghostscript 9.19: Unrecoverable error, exit code 1\n
Run Code Online (Sandbox Code Playgroud)\n

当我尝试不同的方法(例如添加完整文件路径)时,我似乎收到错误的不同变体:“错误:/undefinedfilename in ([-dDumpMediaSizes=false])”。我在 Windows 上,所以我尝试添加像这样的完整文件路径“C:/Program Files/gs/gs9.19/toolbin/pdf_info.ps”并得到相同的错误。

\n

通过 FPDF/FDPI,我使用 Composer 设置了一个小项目,并引入了这个包https://github.com/Setasign/FPDI-FPDF。我目前正在使用以下代码来读取现有文件:

\n
<?php\nuse setasign\\Fpdi;\n\n// setup the autoload function\nrequire_once(\'vendor/autoload.php\');\n\n// initiate FPDI\n$pdf = new Fpdi\\Fpdi();\n\n// add a page\n$pdf->AddPage();\n\n// set the source file\n$pdf->setSourceFile("test.pdf");\n\n// import page 1\n$tplId = $pdf->importPage(1);\n\n// use the imported page and place it at point 10,10 with a width of 100 mm\n$pdf->useTemplate($tplId, 10, 10, 100);\n\n// output page dimensions\necho $pdf->GetPageWidth(); \necho \'<br>\';\necho $pdf->GetPageHeight();\n
Run Code Online (Sandbox Code Playgroud)\n

我得到以下输出

\n
\n

210.00155555556

\n

297.00008333333

\n
\n

所以我想问以下问题:

\n

Ghostscript 方法问题

\n
    \n
  1. 我怎样才能让它工作?
  2. \n
  3. 与使用 FPDF/FPDI 相比,这种方法是否会带来相当大的性能提升?
  4. \n
\n

FPDF/FPDI 方法问题

\n
    \n
  1. 关于代码,这是读取现有文件并检查其尺寸的正确方法,还是我本质上用该方法将其添加到 A4 大小的页面useTemplate()
  2. \n
  3. 我回显的值是什么(我认为是 pt),我可以使用这些值(即 210,297)来验证页面是否为 A4?
  4. \n
  5. 使用这种方法时我还应该记住其他注意事项吗?例如文件可能比 A4 少几个点或像素?
  6. \n
\n

我欢迎任何替代方法的建议。

\n

非常感谢任何帮助,谢谢!

\n

Jan*_*bon 5

导入页面的大小例如通过getTemplateSize()FPDI 方法返回:

$pdf = new FPDI('P','mm'); // change the snd parameter to change the units
$pdf->setSourceFile('test.pdf');
$pageId = $pdf->importPage(1);
$size = $pdf->getTemplateSize($pageId);
Run Code Online (Sandbox Code Playgroud)

$size 将是一个具有以下键的数组:宽度、高度、0(=宽度)、1(=高度)和方向(L 或 P)。