【问题标题】:Using GhostScript to get page size使用 GhostScript 获取页面大小
【发布时间】:2011-02-25 23:05:41
【问题描述】:

是否可以使用 GhostScript 获取页面大小(例如来自 PDF 文档页面)?我见过“bbox”设备,但它返回边界框(每页不同),而不是 PDF 页面的 TrimBox(或 CropBox)。 (有关页面框的信息,请参阅http://www.prepressure.com/pdf/basics/page_boxes。)还有其他可能性吗?

【问题讨论】:

    标签: pdf size ghostscript


    【解决方案1】:

    不幸的是,在 Ghostscript 的帮助下,在 PDF 中获取(可能不同的)页面大小(或 *Boxes)似乎并不容易。

    但是由于您还要求其他可能性:命令行工具 pdfinfo 是一种相当可靠的方法来确定每个页面(甚至每个嵌入的 {Trim,Media,Crop,Bleed}Boxes)的媒体大小。 EXE文件。此实用程序是来自 http://www.foolabs.com/xpdf/download.html 的 XPDF 工具的一部分。您可以使用“-box”参数运行该工具,并使用“-f 3”告诉它从第 3 页开始,使用“-l 8”告诉它在第 8 页停止处理。

    示例输出:

    C:\downloads>pdfinfo -box -f 1 -l 3 _IXUS_850IS_ADVCUG_EN.pdf 创建者:FrameMaker 6.0 制作者:Acrobat Distiller 5.0.5 (Windows) 创建日期:08/17/06 16:43:06 修改日期:08/22/06 12:20:24 标签: 没有 页数:146 加密:否 第 1 页大小:419.535 x 297.644 点 第 2 页大小:297.646 x 419.524 点 第 3 页大小:297.646 x 419.524 点 第 1 页媒体框:0.00 0.00 595.00 842.00 第 1 页裁剪框:87.25 430.36 506.79 728.00 第 1 页出血盒:87.25 430.36 506.79 728.00 第 1 页修剪框:87.25 430.36 506.79 728.00 第 1 页艺术盒:87.25 430.36 506.79 728.00 第 2 页媒体框:0.00 0.00 595.00 842.00 第 2 页裁剪框:148.17 210.76 445.81 630.28 第 2 页出血框:148.17 210.76 445.81 630.28 第 2 页修剪框:148.17 210.76 445.81 630.28 第 2 页艺术盒:148.17 210.76 445.81 630.28 第 3 页媒体框:0.00 0.00 595.00 842.00 第 3 页裁剪框:148.17 210.76 445.81 630.28 第 3 页出血框:148.17 210.76 445.81 630.28 第 3 页修剪框:148.17 210.76 445.81 630.28 第 3 页艺术盒:148.17 210.76 445.81 630.28 文件大小:6888764 字节 优化:是 PDF版本:1.4

    【讨论】:

    • 要获取所有页面,不要指定第一页(所以没有-f)并将最后一页设置为-1(所以-l -1
    【解决方案2】:

    与此同时,我发现了另一种方法。这个仅使用 Ghostscript(正如您所需要的那样)。无需额外的第三方实用程序。

    这个方法使用一个小助手程序,用 PostScript 编写,附带 Ghostscript 的源代码。在 toolbin 子目录中查找 pdf_info.ps 文件。

    包含的 cmets 说您应该像这样运行它以列出使用的字体、使用的媒体尺寸

    gswin32c -dNODISPLAY ^
       -q ^
       -sFile=____.pdf ^
       [-dDumpMediaSizes] ^
       [-dDumpFontsUsed [-dShowEmbeddedFonts]] ^
       toolbin/pdf_info.ps
    

    我确实在本地示例文件上运行了它,命令行参数只询问媒体大小(而不是使用的字体)。结果如下:

    C:\> gswin32c ^
          -dNODISPLAY ^
          -q ^
          -sFile=c:\downloads\_IXUS_850IS_ADVCUG_EN.pdf ^
          -dDumpMediaSizes ^
          C:/gs8.71/lib/pdf_info.ps
    
    
      c:\downloads\_IXUS_850IS_ADVCUG_EN.pdf has 146 pages.
      Creator: FrameMaker 6.0
      Producer: Acrobat Distiller 5.0.5 (Windows)
      CreationDate: D:20060817164306Z
      ModDate: D:20060822122024+02'00'
    
      Page 1 MediaBox: [ 595 842 ] CropBox: [ 419.535 297.644 ]
      Page 2 MediaBox: [ 595 842 ] CropBox: [ 297.646 419.524 ]
      Page 3 MediaBox: [ 595 842 ] CropBox: [ 297.646 419.524 ]
      Page 4 MediaBox: [ 595 842 ] CropBox: [ 297.646 419.524 ]
      [....]
    

    【讨论】:

    • ghostscript 是否仍与pdf_info.ps 一起提供?如果没有,哪里是获得副本的好地方?
    • 您可以在 Ghostscript 的 Git 存储库中查找它:http://git.ghostscript.com/?p=ghostpdl.git;a=summary。或尝试 this direct link
    • 谢谢!我在某个地方找到了一份副本,但我认为它不是最新的。
    • 在 git repo 中找不到它——至少不是通过谷歌。而且,在 ubuntu 上,/usr/share/ghostscript/9.18/lib 目录不包含它。有替代方案吗? (其他地点或计划?)
    • @Diagon 看起来该文件在 git 存储库中仍然可用。如果您转到 repo 上的“树”视图,然后导航到“toolbin”文件夹,您会在其中找到它。
    【解决方案3】:

    纯 GhostScript PostScript 的解决方案,无需额外的脚本:

    gs -dQUIET -sFileName=path/to/file.pdf -c "FileName (r) file runpdfbegin 1 1 pdfpagecount {pdfgetpage /MediaBox get {=print ( ) print} forall (\n) print} for quit"

    该命令将 PDF 中每一页的 MediaBox 打印为每行四个数字。来自 3 页 PDF 的示例:

    0 0 595 841
    0 0 595 841
    0 0 595 841
    

    以下是命令的细分:

    FileName (r) file  % open file given by -sFileName
    runpdfbegin        % open file as pdf
    1 1 pdfpagecount { % for each page index
      pdfgetpage       % get pdf page properties (pushes a dict)
      /MediaBox get    % get MediaBox value from dict (pushes an array of numbers)
      {                % for every array element
        =print         % print element value
        ( ) print      % print single space
      } forall
      (\n) print       % print new line
    } for
    quit               % quit interpreter. Not necessary if you pass -dBATCH to gs
    

    /MediaBox 替换为/CropBox 以获得裁剪框。

    【讨论】:

    • 不错的答案!和不错的突破!我在这里遇到了一个错误(无法打开 X 显示 :0.0),可以通过打开 X 服务器或在调用中添加 -dNODISPLAY 来修复(更好,因为我们不需要 X)。
    • 如果您的页面被旋转,此命令将失败。它输出高度的宽度,反之亦然。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多