如何使用quartz搜索pdf文档中的文本

2024-04-16

我正在使用quartz 来显示pdf。我需要获取搜索文本所在页面的索引。有人可以帮助我吗?谢谢。

解决方案:有一个代码示例,用于从页面中提取文本并检查其序列。

#import <Foundation/Foundation.h>

@interface PDFSearcher : NSObject {
    CGPDFOperatorTableRef table;
    NSMutableString *currentData;
}

@property (nonatomic, retain) NSMutableString * currentData;
-(id)init;
-(BOOL)page:(CGPDFPageRef)inPage containsString:(NSString *)inSearchString;

@end

#import "PDFSearcher.h"

@implementation PDFSearcher
@synthesize currentData;
void arrayCallback(CGPDFScannerRef inScanner, void *userInfo)
{
    PDFSearcher * searcher = (PDFSearcher *)userInfo;

    CGPDFArrayRef array;

    bool success = CGPDFScannerPopArray(inScanner, &array);

    for(size_t n = 0; n < CGPDFArrayGetCount(array); n += 2)
    {
        if(n >= CGPDFArrayGetCount(array))
            continue;

        CGPDFStringRef string;
        success = CGPDFArrayGetString(array, n, &string);
        if(success)
        {
            NSString *data = (NSString *)CGPDFStringCopyTextString(string);
            [searcher.currentData appendFormat:@"%@", data];
            [data release];
        }
    }
}

void stringCallback(CGPDFScannerRef inScanner, void *userInfo)
{
    PDFSearcher *searcher = (PDFSearcher *)userInfo;

    CGPDFStringRef string;

    bool success = CGPDFScannerPopString(inScanner, &string);

    if(success)
    {
        NSString *data = (NSString *)CGPDFStringCopyTextString(string);
        [searcher.currentData appendFormat:@"%@", data];
        [data release];

    }
}

-(id)init
{
    if(self = [super init])
    {
        table = CGPDFOperatorTableCreate();
        CGPDFOperatorTableSetCallback(table, "TJ", arrayCallback);
        CGPDFOperatorTableSetCallback(table, "Tj", stringCallback);
    }
    return self;
}

-(BOOL)page:(CGPDFPageRef)inPage containsString:(NSString *)inSearchString
{
    [self setCurrentData:[NSMutableString string]];
    CGPDFContentStreamRef contentStream = CGPDFContentStreamCreateWithPage(inPage);
    CGPDFScannerRef scanner = CGPDFScannerCreate(contentStream, table, self);
    bool ret = CGPDFScannerScan(scanner);
    CGPDFScannerRelease(scanner);
    CGPDFContentStreamRelease(contentStream);
    //NSLog(@"%u, %@", [self.currentData length], self.currentData);
    return ([[self.currentData uppercaseString] 
             rangeOfString:[inSearchString uppercaseString]].location != NSNotFound);
}
@end

使用CGPDFDocument、CGPDFPage和CGPDFScanner扫描页面内容并将其解析为NSString。 然后使用 NSString 函数查找该页面上的文本。如果存在,则将相应的页码存储在某个数组中。在 for 循环中重复扫描和解析 pdf 中的页数

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用quartz搜索pdf文档中的文本 的相关文章

随机推荐

  • MySQL优化INSERT速度因索引而变慢

    MySQL 文档 http dev mysql com doc refman 5 0 en insert speed html say 假设 B 树索引 表的大小会使索引的插入速度减慢 log N 这是否意味着对于每个新行的插入 插入速度将
  • Java图形图像

    嘿 我在 Jpanel 中添加以下图像 msu footprints org 2011 Aditya map jpg http msu footprints org 2011 Aditya map jpg 然后添加多边形 int x new
  • 在 Linux 上安装 tar.gz

    我已经从以下位置下载了 Node js这个链接 https nodejs org en 单击按钮时指向此链接 https nodejs org dist v4 1 2 node v4 1 2 linux x64 tar gz https n
  • 为什么 1 不大于 -0x80000000 [重复]

    这个问题在这里已经有答案了 为什么1不大于 0x80000000 我知道这与溢出有关 但有人可以解释为什么吗 0x80000000 不是一个常量吗 我认为它是 assert 1 gt 0x80000000 C 中的断言触发器 这是为什么 我
  • 使用 jQuery 动态填写表单值

    我知道如何使用纯 PHP 执行此操作 但我需要在不重新加载页面的情况下执行此操作 无论如何 jQuery 是否可以有效地拉回一些数据库结果 基于用户在表单上的第一个文本字段中输入的内容 然后使用从数据库查询拉回的数据填充剩余的一些字段 本质
  • 运行 Jest 测试并收集特定目录中所有文件的覆盖率

    我正在使用以下代码对特定文件运行 Jest 测试 jest utils spec js collectCoverageFrom utils js 如果我想测试我使用的整个目录 jest someDirectory collectCovera
  • ...此内容也应该通过 HTTPS 加载

    再会 Site https mult privet com https mult privet com 在我的 Chrome 控制台中 我看到以下错误 blocked The page at https yandex st share ya
  • Vaadin Flow 应用程序自动在明暗模式之间切换

    Vaadin Flow 14 附带了两个捆绑主题的浅色和深色版本 Lumo and Material And now 浏览器可以向主机操作系统询问用户对浅色或深色模式的偏好 https stackoverflow com q 5084016
  • 返回空字符串或空值是否有更多优势?

    如果我正在编写以下方法 例如 那么以下方法是否被认为是良好的做法 A 如果文档不存在则返回空字符串 B 返回一个null value 做了很多 Java 工作 并且 Java 中的方法需要返回类型 我的印象是返回一致的类型是最佳实践 PHP
  • 使用 jquery UI 下一个按钮提交输入字段值,php 回显结果

    我当前正在使用 jquery ui 选项卡 仅适用于下一个 上一个按钮 和文本区域 我开发了一个 ajax js 函数 它将自动提交存储在文本区域中的值 并在 tab 2 中回显结果 但我目前想将自动提交表单的方法更改为当用户单击 下一步
  • 在 Xcode 4 中编译 Java

    我知道这个问题已经流传了很长时间 Xcode 4 中的 Java 我不需要任何建议 Eclipse Netbeans 例如 我只想在 XCode4 而不是 3 中编译一些简单的 Java 代码 我设法创建了一个文件 正如预期的那样 语法和一
  • 如何使 QPlainTextEdit 看起来像 .txt 文件?

    我有一个 QPlainTextEdit 它以表格形式显示一些信息 并且我添加了将其另存为 txt 文件的选项 我建了桌子漂亮的 https pypi python org pypi PrettyTable 当我打开 txt 文件时 它看起来
  • Android 平台中的推送通知

    我正在寻找编写一个从服务器接收推送警报的应用程序 我找到了几种方法来做到这一点 SMS 拦截传入的 SMS 并从服务器发起拉取 定期轮询服务器 每个都有其自身的局限性 短信 不保证到达时间 轮询可能会耗尽电池电量 请问您有更好的建议吗 非常
  • 再次:CSS、UL/OL:自定义计数器的缩进不正确

    我在中描述了我原来的问题这个线程 https stackoverflow com questions 16521330 css ul ol incorrect indent with custom counter 简而言之 当在 UL 中使
  • php 字符串转十六进制并带有 2 的补码:

    嗨 我有一根绳子193390663我想将其转换为hex with 2 s compliment 输出是0B86E847 现在我正在使用下面的功能 但它给了我313933333930363633 public static function
  • 为什么push指令会改变rsp的值? [复制]

    这个问题在这里已经有答案了 我正在检查 Ericksons Hacking The Art of Exploitation 中的这段代码片段 void test function int a int b int c int d int fl
  • JMS 客户端应用程序错误。无法使用 URL 连接

    我正在 C 上编写客户端应用程序以连接到我的本地 JMS Weblogic Server 12c 我尝试使用这里的示例代码 http docs oracle com cd E15523 01 web 1111 e13746 app exam
  • 创建和使用 Android 的 ContentProvider

    当我调用 Android ContentProvider 时 出现以下异常 java lang RuntimeException 无法 开始活动 ComponentInfo de harm android couchone de harm
  • 在水平列表上使用鼠标滚轮进行水平滚动

    我正在尝试使用鼠标滚轮进行水平滚动 但似乎不起作用 这是我的Fiddle http jsfiddle net a3j1x47a 我的主课 selector是一个可滚动的overflow 这是 JS 我正在尝试用它初始化滚动 selector
  • 如何使用quartz搜索pdf文档中的文本

    我正在使用quartz 来显示pdf 我需要获取搜索文本所在页面的索引 有人可以帮助我吗 谢谢 解决方案 有一个代码示例 用于从页面中提取文本并检查其序列 import