【问题标题】:How do I find the size of the margins on a PDF page in Objective-C (CGPDF)如何在Objective-C(CGPDF)中找到PDF页面的边距大小
【发布时间】:2011-09-18 00:34:30
【问题描述】:

给定一个 pdf 文档的页面,我希望能够使用 objetive-C 找到文本的边距。

我意识到已经有很多与CGPDF... 相关的问题,但我还没有找到任何有用的东西。我还查看了 PDF 规范文档。我确定它一定在某个地方,但我还没有找到它。

示例

我创建了一个左右边距各为 2.5 厘米的 Word 文档。然后我打印成pdf。拿这个pdf,有没有办法算出文字的宽度(即左右页边距)?

背景

万一我找错树了,我问这个问题的原因是能够像 iBooks 缩放一样缩放。如果您双击 iBooks,它会将您缩放到主体的宽度。这在 Mac 的 Preview 应用程序中也是如此(按“Zoom to Fit”)。

最初的想法

我首先想到的是 kCGPDFBleedBox 之类的 PDF Boxes (CGPDFPage) 可能会有所帮助,但它看起来对我的情况没有帮助。

更新

我只关心页面的正文。可能不在此范围内的图像等不会打扰我。

相关帖子

Fast and Lean PDF Viewer for iPhone / iPad / iOs - tips and hints?

【问题讨论】:

  • 我认为最好的办法是查看页面上所有元素的边界框。这也会计算页眉/页脚/数字等内容,但您对此无能为力。
  • 我会对正文的正文感到满意。我将更新我的问题以反映这一点...
  • 没有简单的方法可以做到这一点。 AIUI,PDF几乎完全是一种打印格式——一堆矢量数据、位图数据,可能还有一些文本。许多 PDF 阅读器无法正确选择文本(多列文档或任何使用 pdflatex 格式化的内容往往会导致 IME 出现问题);我不希望找到“正文”矩形更容易。

标签: iphone ios ipad pdf cgpdf


【解决方案1】:

我不熟悉 Apple 的“缩放以适应”功能及其确切行为(尽管我可以想象它最重要的属性)...

依赖于不同 *Box 值(MediaBoxCropBoxTrimBoxBleedBox 和(已弃用)ArtBox)的一个潜在缺点是,真正的 空白可能仍与其返回的值不同(大多数情况下更大)。

Ghostscript 有一个名为bbox 的特殊设备,它返回所有页面渲染内容的“边界框”。示例:

gswin32c.exe ^
   -o nul: ^
   -sDEVICE=bbox ^
    input.pdf

返回(对于我尝试使用此命令的随机 3 页示例):

%%BoundingBox: 86 122 509 719
%%HiResBoundingBox: 86.993997 122.993996 508.013984 718.001978
%%BoundingBox: 103 199 152 271
%%HiResBoundingBox: 103.408098 199.998064 151.107956 270.897953
%%BoundingBox: 103 195 185 271
%%HiResBoundingBox: 103.208059 195.000041 184.000002 270.897953

您可能可以忽略高精度 HiResBoundingBox 值。这给你留下了:

%%BoundingBox: 86 122 509 719
%%BoundingBox: 103 199 152 271
%%BoundingBox: 103 195 185 271

这四个值表示左下角和右上角的坐标或包围所有渲染像素的矩形。单位是 PostScript 点 (72 points == 1 inch)。

将此与pdfinfo.exe 返回的*Box 值进行比较:

pdfinfo ^
  -f 1 ^
  -l 3 ^
  -box ^
   input.pdf
 [....]
 Page    1 size: 421 x 595 pts (A5)
 Page    2 size: 421 x 595 pts (A5)
 Page    3 size: 92 x 80 pts

 Page    1 MediaBox:     0.00     0.00   595.00   842.00
 Page    1 CropBox:     87.00   123.00   508.00   718.00
 Page    1 BleedBox:    87.00   123.00   508.00   718.00
 Page    1 TrimBox:     87.00   123.00   508.00   718.00
 Page    1 ArtBox:      87.00   123.00   508.00   718.00

 Page    2 MediaBox:     0.00     0.00   595.00   842.00
 Page    2 CropBox:     87.00   123.00   508.00   718.00
 Page    2 BleedBox:    87.00   123.00   508.00   718.00
 Page    2 TrimBox:     87.00   123.00   508.00   718.00
 Page    2 ArtBox:      87.00   123.00   508.00   718.00

 Page    3 MediaBox:     0.00     0.00   595.00   842.00
 Page    3 CropBox:     92.00   194.00   184.00   274.00
 Page    3 BleedBox:    92.00   194.00   184.00   274.00
 Page    3 TrimBox:     92.00   194.00   184.00   274.00
 Page    3 ArtBox:      92.00   194.00   184.00   274.00
 [...]

更新:这是我用来演示上述差异的 PDF 文档的 3 页缩略图的屏幕截图:

【讨论】:

  • +1 以获得非常全面的答案。但这对我使用 Objective-C 有帮助吗?我正在为 Apple iOS 开发...
【解决方案2】:

根据 CGPDF 文档,您最多可以获得四个内容框,它们定义了内容的保存、打印、裁剪、修剪等区域。使用CGPDFPageGetBoxRect() 函数获取这些框。我不确定他们的确切用途,所以这只是我对您需要哪些盒子的猜测:

CGRect mediaBox = CGPDFPageGetBoxRect(pageRef, kCGPDFMediaBox);
CGRect cropBox = CGPDFPageGetBoxRect(pageRef, kCGPDFCropBox);
CGFloat leftMargin = CGRectGetMinX(cropBox) - CGRectGetMinX(mediaBox);

换句话说 - 你得到页面边界和内容矩形边界并对它们进行数学运算。一旦您了解了每个框代表的含义,应该不会太难。

【讨论】:

  • 感谢您的回答 - 但我已经尝试过了。至少对于我的文件,它不起作用。 this answer 也表示不可靠(即使它们已设置)。
【解决方案3】:

您可以将 PDF 页面呈现为位图,检测其像素状态并获取白边距。看看 Skim 的这个出色的实现:http://skim-app.svn.sourceforge.net/viewvc/skim-app/trunk/NSBitmapImageRep_SKExtensions.m?revision=7036&content-type=text%2Fplain

【讨论】:

  • +1 - 嗨 - 谢谢! - 这看起来不错的样子。该应用程序也非常好!我想让这个问题再久一点,看看是否有任何 CGPDF~ish 解决方案,但如果没有更好的解决方案,我会将其标记为已接受。再次感谢。
猜你喜欢
  • 2019-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-16
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
相关资源
最近更新 更多