1

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

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

例子

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

背景

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

最初的想法

我首先认为也许PDF Boxes( CGPDFPage) likekCGPDFBleedBox可能会有所帮助,但它看起来对我的情况没有帮助。

更新

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

相关文章

适用于 iPhone / iPad / iOs 的快速精益 PDF 查看器 - 提示和提示?

4

3 回答 3

4

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

依赖不同的 *Box 值(MediaBoxCropBox、和(已弃用的) )时TrimBox,一个潜在的缺点是,实际的空白区域可能仍与其返回的值不同(大多数情况下更大)。BleedBoxArtBox

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 页缩略图:

具有不同页面大小和 *Boxes 的 3 页 PDF

于 2011-06-20T13:04:26.440 回答
1

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

于 2011-06-19T10:51:35.260 回答
0

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

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

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

于 2011-06-20T12:21:51.920 回答