Jooooooooo
V2EX  ›  问与答

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

  •  
  •   Jooooooooo · Nov 26, 2020 · 1079 views
    This topic created in 2086 days ago, the information mentioned may be changed or developed.

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

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

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

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

    2 replies    2020-11-27 17:34:25 +08:00
    alaysh
        1
    alaysh  
       Nov 27, 2020   ❤️ 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
       Nov 27, 2020
    @alaysh 感谢. 我看看.
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3628 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 49ms · UTC 05:06 · PVG 13:06 · LAX 22:06 · JFK 01:06
    ♥ Do have faith in what you're doing.