如何在Objective-C(CGPDF)的PDF页面上找到边距的大小

时间:2011-06-19 03:25:49

标签: iphone ios ipad pdf cgpdf

鉴于pdf文档中的页面,我希望能够使用objetive-C找到文本的边距。

我意识到已经有很多与CGPDF...有关的问题,但我找不到任何有用的东西。我还看了一下PDF规范文档。我确信它必须在某处,但我还没有找到它。

实施例

我创建了一个Word文档,每个文档的左右边距为2.5厘米。然后我打印到pdf。拿这个pdf,有没有办法弄清楚文本的宽度(即左右页边距)?

背景

如果我正在咆哮错误的树,我问这个问题的原因是能够像iBooks一样放大缩放。如果您双击iBooks,它会将您缩放到主体的宽度。这在Mac的预览应用程序中是相同的(按“缩放以适合”)。

第一个想法

我首先想到像PDF Boxes这样CGPDFPagekCGPDFBleedBox}可能会有所帮助,但看起来它对我的情况不会有帮助。

更新

我只关心页面的正文。可能在这之外的图像等不会打扰我。

相关文章

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

3 个答案:

答案 0 :(得分:4)

我不熟悉Apple的“Zoom to Fit”功能及其确切的行为(虽然我可以想象它最重要的属性)......

依赖于不同* 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)。

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

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页的缩略图,我用它来演示上述差异:

3-page PDF with different page sizes and *Boxes

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

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