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

时间:2017-11-03 15:55:41

标签: php pdf fpdf ghostscript fpdi

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

我已经考虑过两种方法来解决这个问题:

  1. 通过php exec使用GhostScript来读取上传的文件并获取其尺寸 - 我无法使这种方法正常工作
  2. 使用PHP PDF库读取上传的文件并获取其尺寸(例如fdpi / fpdf) - 我有一些工作(我想!)
  3. 对于Ghostscript,我发现this answer here on SO建议使用另一个名为pdf_info.ps的脚本(我确实按照建议的评论下载了这个脚本)。但是,我无法让它正常工作。在将其添加到任何PHP脚本之前,我尝试运行以下命令:

    λ .\gswin64c -dNODISPLAY -q -sFile=c:\test.pdf [-dDumpMediaSizes=false] [-dDumpFontsNeeded=false] [-dDumpXML] [-dDumpFontsUsed [-dShowEmbeddedFonts] ] ..\toolbin\pdf_info.ps
    Error: /undefinedfilename in ([-dDumpMediaSizes=false])
    Operand stack:
    
    Execution stack:
       %interp_exit   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   --nostringval--   --nostringval--   false   1   %stopped_push
    Dictionary stack:
       --dict:1196/1684(ro)(G)--   --dict:0/20(G)--   --dict:78/200(L)--
    Current allocation mode is local
    Last OS error: No such file or directory
    GPL Ghostscript 9.19: Unrecoverable error, exit code 1
    

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

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

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

    我得到以下输出

      

    210.00155555556

         

    297.00008333333

    所以我想问下列问题:

    Ghostscript处理问题

    1. 我怎样才能让它发挥作用?
    2. 与使用FPDF / FPDI相比,这种方法会有相当大的性能提升吗?
    3. FPDF / FPDI方法问题

      1. 关于代码,这是读取现有文件并检查其尺寸的正确方法,还是基本上使用useTemplate()方法将其添加到A4大小的页面?
      2. 我正在回应的值(我认为它的pt)是什么衡量标准,我可以使用这些值(即210,297)来验证页面是A4吗?
      3. 使用这种方法我还应该记住其他任何考虑因素吗?如文件可能是A4的几个点或像素?
      4. 我欢迎任何替代方法的建议。

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

2 个答案:

答案 0 :(得分:2)

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

$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);

$ size将是一个包含以下键的数组:width,height,0(= width),1(= height)和orientation(L或P)。

答案 1 :(得分:1)

文档中的[]字符旨在表明这是可选的。如果你想使用它们,那就这样做:

gswin64c -dNODISPLAY -q -sFile=c:\test.pdf -dDumpMediaSizes=false -dDumpFontsNeeded=false -dDumpXML -dDumpFontsUsed -dShowEmbeddedFonts ..\toolbin\pdf_info.ps

PDF文件的单位为1/72英寸。文件根本不需要A4。您还应该查看CropBox以及可能的ArtBox和BleedBox以及MediaBox值。

请注意,在这种情况下(我认为)输出将转到stdout,您可能希望将其重定向到文件。