鉴于pdf文档中的页面,我希望能够使用objetive-C找到文本的边距。
我意识到已经有很多与CGPDF...
有关的问题,但我找不到任何有用的东西。我还看了一下PDF规范文档。我确信它必须在某处,但我还没有找到它。
我创建了一个Word文档,每个文档的左右边距为2.5厘米。然后我打印到pdf。拿这个pdf,有没有办法弄清楚文本的宽度(即左右页边距)?
如果我正在咆哮错误的树,我问这个问题的原因是能够像iBooks一样放大缩放。如果您双击iBooks,它会将您缩放到主体的宽度。这在Mac的预览应用程序中是相同的(按“缩放以适合”)。
我首先想到像PDF Boxes
这样CGPDFPage
(kCGPDFBleedBox
}可能会有所帮助,但看起来它对我的情况不会有帮助。
我只关心页面的正文。可能在这之外的图像等不会打扰我。
Fast and Lean PDF Viewer for iPhone / iPad / iOs - tips and hints?
答案 0 :(得分:4)
我不熟悉Apple的“Zoom to Fit”功能及其确切的行为(虽然我可以想象它最重要的属性)......
依赖于不同* Box值(MediaBox
,CropBox
,TrimBox
,BleedBox
和(已弃用的)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页的缩略图,我用它来演示上述差异:
答案 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);
换句话说 - 您获得页面边界和内容矩形边界并对它们进行数学运算。一旦你了解每个方框代表什么,就不应该太难。