当前位置: 首页 > 知识库问答 >
问题:

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

卞成荫
2023-03-14

我考虑了两种解决方法:

  1. 通过php exec使用GhostScript读取上传的文件并获取其尺寸-我还不能让这种方法起作用
  2. 使用PHP PDF库读取上传的文件并获取其尺寸(如fdpi/fpdf)-我有一些东西在工作(我想!)

至于Ghostscript,我在这里找到了这个答案,因此建议使用另一个名为pdf\u 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

当我尝试添加完整文件路径等不同方法时,我似乎收到了不同的错误变体:“error:/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

所以我想问以下问题:

  1. 我怎样才能让它工作
  2. 与使用FPDF/FPDI相比,这种方法会有相当大的性能提升吗
  1. 关于代码,这是读取现有文件并检查其尺寸的正确方法,还是我基本上用useTemboard()方法将其添加到A4大小的页面?
  2. 我正在回响的值是什么度量值(我认为是pt),我可以使用这些值(即210,297)来验证页面是A4吗?
  3. 使用这种方法,我应该记住其他任何考虑因素吗?比如文件可能是几个pt或A4的像素?

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

非常感谢您的帮助,谢谢!

共有2个答案

邹胜泫
2023-03-14

文档中的[]字符旨在表明这是可选的。如果要使用它们,请按如下方式操作:

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,您可能希望将其重定向到文件。

丌官博文
2023-03-14

返回导入页面的大小,例如通过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将是一个具有以下键的数组:宽度、高度、0(=宽度)、1(=高度)和方向(L或P)。

 类似资料:
  • 问题内容: 我需要读取文件路径为“ C:\ file.pdf”的pdf文件,并将其写入outputStream。最简单的方法是什么? ................................................... ................................................... 问题答案: import java.io.*; 到目前为止

  • 问题内容: python中是否有一种方法可以获取视频文件或其他可实现此目标的库的尺寸?相当于一个或什么?谢谢。 问题答案: 在我的上一家公司中,我们遇到了类似的问题,但我找不到任何python库来执行此操作。因此,我最终使用了来自python的mediainfo,media info也具有命令行选项,并且很容易解析输出,因此实际上,使用media- info的python模块就足够了。它具有进一步

  • 问题内容: 有没有一种方法可以获取图像尺寸而无需读取整个文件? 问题答案:

  • 我希望获得PDF中每个页面的准确大小,作为我将创建的PDF单元测试的一部分。当我处理每个文档中具有许多不同页面大小的PDF时,代码返回一个ArrayList维度。 AFAIK每个页面也可以有自己的DPI设置。 我在谷歌上搜索了很多次,但我只找到了这个答案,这只给了我部分答案,因为我仍然需要计算出每页的DPI。 PDFBox-查找页面维度

  • 问题内容: 我的Unix机器上有文件test.json,其数据如下 现在,我正在编写 REST jersey客户端 以读取test.json并显示如下输出 如何阅读test.json并显示其内容? 问题答案: 对于: 对于: 您的数据将在对象内部

  • 我如何通过我自己的API从另一个API获取PDF,然后到前面供用户下载。 我现在得到的只是一张空白页。 后面是Scala的,当我打印文件时,我得到一个字符串。