首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Objective-C (CGPDF)中找到PDF页面的页边距大小

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

Stack Overflow用户
提问于 2011-06-19 11:25:49
回答 3查看 3.1K关注 0票数 1

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

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

示例

我创建了一个Word文档,左右边距各为2.5厘米。然后打印成pdf格式。以这个pdf为例,有没有什么方法可以计算出文本的宽度(即左右页边距)?

背景

如果我找错了树,我问这个问题的原因是为了能够像iBooks一样缩放。如果你双击iBooks,它会将你放大到正文的宽度。这在Mac的预览应用程序中也是一样的(按下“缩放以适应”)。

第一个想法

我首先想到的是,也许像kCGPDFBleedBox这样的PDF Boxes (CGPDFPage)可能会有所帮助,但在我的情况下,似乎没有帮助。

更新

我只关心页面的正文。图像等,这可能是外部的,我并不困扰。

相关帖子

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-19 18:51:35

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

票数 1
EN

Stack Overflow用户

发布于 2011-06-20 21:04:26

我不熟悉苹果的“缩放以适应”功能和它的具体行为(尽管我可以想象它最重要的属性)……

依赖不同的*box值(MediaBoxCropBoxTrimBoxBleedBox和(不推荐使用的) ArtBox)时的一个潜在缺点是,实际空白可能仍然与它们的返回值不同(主要是更大)。

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

代码语言:javascript
复制
gswin32c.exe ^
   -o nul: ^
   -sDEVICE=bbox ^
    input.pdf

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

代码语言:javascript
复制
%%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值。这就给你留下了:

代码语言:javascript
复制
%%BoundingBox: 86 122 509 719
%%BoundingBox: 103 199 152 271
%%BoundingBox: 103 195 185 271

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

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

代码语言:javascript
复制
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
 [...]

更新:这里是一个屏幕截图,显示了3个页面的缩略图,我用它来演示上面的区别:

票数 4
EN

Stack Overflow用户

发布于 2011-06-20 20:21:52

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

代码语言:javascript
复制
CGRect mediaBox = CGPDFPageGetBoxRect(pageRef, kCGPDFMediaBox);
CGRect cropBox = CGPDFPageGetBoxRect(pageRef, kCGPDFCropBox);
CGFloat leftMargin = CGRectGetMinX(cropBox) - CGRectGetMinX(mediaBox);

换句话说,你得到了页面边界和内容矩形边界,并对它们做了数学运算。一旦你了解了每个盒子代表什么,应该不会太难。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6400326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档