V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Jooooooooo
V2EX  ›  问与答

有办法能拿到 Mac 自带 preview 打开的 pdf 的进度吗?

  •  
  •   Jooooooooo · 2020-11-26 15:01:00 +08:00 · 564 次点击
    这是一个创建于 1285 天前的主题,其中的信息可能已经有所发展或是发生改变。

    搜了一下没搜着, 很可能是因为关键词不对

    需求是多个 Mac 之间同步 pdf 的进度

    找了很多方法都不行, 苹果自带 Books 不好用, Kindle 也不好用

    我想着如果我能拿到本机是怎么保存 pdf 读取进度的, 我可以自己写个同步的小脚本自己用

    2 条回复    2020-11-27 17:34:25 +08:00
    alaysh
        1
    alaysh  
       2020-11-27 17:29:47 +08:00   ❤️ 1
    ~/Library//Containers/com.apple.Preview/Data/Library/Preferences/com.apple.Preview.ViewState.plist
    找到文件对应 Key 的 Data,用 plist 格式解开,elementIndex 就是所需的值。

    #import <Foundation/Foundation.h>
    #include <sys/stat.h>

    NSString *persistentIdForFileURL(NSURL *url) {
    NSString *persistentId;

    id value;
    NSError *error;
    BOOL res = [url getResourceValue:&value forKey:NSURLVolumeUUIDStringKey error:&error];
    if (res) {
    struct stat statBuf;
    int res = stat(url.fileSystemRepresentation, &statBuf);
    if (res == 0) {
    persistentId = [NSString stringWithFormat:@"%@.%llu", value, statBuf.st_ino];
    }
    else {
    NSLog(@"stat error: %d", res);
    }
    }
    else {
    NSLog(@"getResourceValue error:%@", error);
    }
    return persistentId;
    }

    int main(int argc, const char * argv[]) {
    @autoreleasepool {
    NSURL *url = [NSURL URLWithString:@"file:///tmp/1.pdf"];
    NSString *persistentId = persistentIdForFileURL(url);

    NSString *path = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, true)[0];
    path = [path stringByAppendingString:@"/Containers/com.apple.Preview/Data/Library/Preferences/com.apple.Preview.ViewState.plist"];
    NSData *data = [NSData dataWithContentsOfFile:path];

    NSError *error;
    NSDictionary *propertyList = [NSPropertyListSerialization propertyListWithData:data options:NSPropertyListMutableContainers format:0 error:&error];
    propertyList = propertyList[persistentId];
    if (propertyList) {
    data = propertyList[@"Data"];
    propertyList = [NSPropertyListSerialization propertyListWithData:data options:NSPropertyListMutableContainers format:0 error:&error];
    if (propertyList) {
    NSLog(@"propertyList: %@", propertyList);
    }
    else {
    NSLog(@"propertyListWithData error:%@", error);
    }
    }
    else {
    if (error) {
    NSLog(@"propertyListWithData error:%@", error);
    }
    NSLog(@"propertyList for %@ is null", url);
    }
    }
    return 0;
    }
    Jooooooooo
        2
    Jooooooooo  
    OP
       2020-11-27 17:34:25 +08:00
    @alaysh 感谢. 我看看.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3000 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 14:03 · PVG 22:03 · LAX 07:03 · JFK 10:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.