你们有没有使用RM SDK for iOS?RM SDK以以下格式保存注释:
Run Code Online (Sandbox Code Playgroud)startBookmark = "#pdfloc(bd0d,0,101,5,2,0,0,1)"; endBookmark = "#pdfloc(bd0d,0,101,14,0,0,1,1)";
我们如何才能从这2行获得直觉?
您拥有的PDF位置指向PDF文件中的特定对象.此对象与屏幕上的(x,y)坐标没有直接关系,因为这取决于用于呈现PDF文件的分辨率和DPI.它还取决于您用于渲染文件的渲染引擎.
要在iOS中绘制一个框,您需要使用(x,y)坐标绘制它.您需要获取与您正在使用的注释相关的框的(x,y)坐标.您可以使用getRangeInfo使用RMSDK执行此操作.您还可以使用上面的PDF位置导航到特定注释.请注意,您将获得的框仅对您的文件的再现以及您拥有的参数有效.如果更改任何参数 - RMSDK版本,导航矩阵值,dpi,渲染分辨率,则需要从RMSDK获取该框的新值.
这里有一些代码可以帮助您使用RMSDK从两个位置获取(x,y)坐标.该代码用于主C/C++库,因为我不确定您的Objective-C层是什么样的.它可能会有所不同,具体取决于您使用的RMSDK版本.
dpdoc::RangeInfo* rangeInfo = renderer->getRangeInfo(startBookmark, endBookmark);
dpdoc::Rectangle* rect;
rangeInfo->getBox(0, false, rect&);
Run Code Online (Sandbox Code Playgroud)
然后"rect"变量将包含(x,y)坐标,用于您需要绘制的框.请注意,每2组坐标可能有多个框.在这种情况下,您将需要循环它们.
如果您确实拥有RMSDK通常附带的Objective-C层,那么它应该会稍微容易一些.在这种情况下你的代码应该是这样的:
NSArray *boxes = nil;
RMRangeInfo *rangeInfo = [document getRangeInfoWithStart:startBookmark end:endBookmark];
boxes = rangeInfo.boxes
Run Code Online (Sandbox Code Playgroud)
然后,您可以遍历框数组以获取(x,y)并在屏幕上绘制它们.在大多数情况下,您将获得1个盒子,但是您应该考虑有多个盒子可以绘制的情况.一个简单的循环应该可以解决问题.