PDF 生成模板编辑器
开源可视化 PDF 生成引擎,支持自定义模板,并提供面向开发者的 API,灵活构建文档生成流程。
阅读器中的文本处理通常包含两类任务:
本页同时说明这两类能力,但两者的用途并不相同:
如果目标是获取阅读器中手动选中的文本内容,应查看 获取选中内容。
关键字搜索通常用于以下场景:
搜索流程通常包括以下步骤:
ITextSearcher。List<CPDFTextRange> searchTextInfoList = new ArrayList<>();
ITextSearcher textSearcher = readerView.getTextSearcher();
String keywords = "ComPDF";
textSearcher.setSearchConfig(
keywords,
CPDFTextSearcher.PDFSearchOptions.PDFSearchCaseSensitive
);
for (int i = 0; i < document.getPageCount(); i++) {
CPDFPage page = document.pageAtIndex(i);
CPDFTextPage textPage = page.getTextPage();
if (textPage == null || !textPage.isValid()) {
continue;
}
List<CPDFTextRange> searchPageContent = textSearcher.searchKeyword(i);
if (!searchPageContent.isEmpty()) {
searchTextInfoList.addAll(searchPageContent);
}
}val searchTextInfoList = mutableListOf<CPDFTextRange>()
val textSearcher: ITextSearcher = readerView.getTextSearcher()
val keywords = "ComPDF"
textSearcher.setSearchConfig(
keywords,
CPDFTextSearcher.PDFSearchOptions.PDFSearchCaseSensitive
)
for (i in 0 until document.pageCount) {
val page = document.pageAtIndex(i)
val textPage = page.textPage
if (textPage == null || !textPage.isValid) {
continue
}
val searchPageContent = textSearcher.searchKeyword(i)
if (searchPageContent.isNotEmpty()) {
searchTextInfoList.addAll(searchPageContent)
}
}setSearchConfig(...) 支持以下常见选项:
| 选项 | 说明 | 值 |
|---|---|---|
PDFSearchCaseInsensitive | 大小写不敏感 | 0 |
PDFSearchCaseSensitive | 大小写敏感 | 1 |
PDFSearchMatchWholeWord | 匹配整个单词 | 2 |
搜索选项应根据业务目标选择。例如,全文检索通常适合大小写不敏感搜索,术语精确匹配则更适合大小写敏感或整词匹配。
如果页面需要展示搜索摘要、片段预览或上下文命中内容,可以继续从 CPDFTextRange 中提取文本。
以下示例展示如何读取命中文本和前后上下文。
int pageIndex = 0;
List<CPDFTextRange> searchPageContent = textSearcher.searchKeyword(pageIndex);
if (searchPageContent.isEmpty()) {
return;
}
CPDFTextRange textRange = searchPageContent.get(0);
CPDFPage page = document.pageAtIndex(pageIndex);
CPDFTextPage textPage = page.getTextPage();
String text = textPage.getText(textRange);
int targetStart = textRange.location - 20;
int length;
if (targetStart > 0) {
length = textRange.length + 40;
} else {
length = textRange.length + 40 + targetStart;
targetStart = 0;
}
CPDFTextRange targetTextRange = new CPDFTextRange(targetStart, length);
String contextText = textPage.getText(targetTextRange);在处理单页结果时,应确保 CPDFTextRange 与当前页面的 CPDFTextPage 对应,避免跨页错误读取。
当搜索结果需要在阅读器中高亮显示时,可以使用以下方法:
int pageIndex = 0;
int textRangeIndex = 0;
textSearcher.searchBegin(pageIndex, textRangeIndex);
readerView.invalidateAllChildren();textSearcher.searchBackward();textSearcher.searchForward();textSearcher.cancelSearch();除了关键字搜索,CPDFPage 和 CPDFTextPage 也支持按矩形范围提取文本。这个能力适合用于:
下面的示例先定义页面坐标中的矩形区域,再转换为当前页面可用于文本提取的坐标范围。
CPDFPage pdfPage = document.pageAtIndex(0);
CPDFTextPage pdfTextPage = pdfPage.getTextPage();
RectF selectRect = new RectF(0f, 0f, 500f, 500f);
selectRect = pdfPage.convertRectFromPage(
false,
pdfPage.getSize().width(),
pdfPage.getSize().height(),
selectRect
);
CPDFTextSelection[] textSelectionArr = pdfTextPage.getSelectionsByLineForRect(selectRect);
for (CPDFTextSelection textSelection : textSelectionArr) {
if (textSelection == null) {
continue;
}
String text = pdfTextPage.getText(textSelection.getTextRange());
}val pdfPage = document.pageAtIndex(0)
val pdfTextPage = pdfPage.textPage
var selectRect = pdfPage.convertRectFromPage(
false,
pdfPage.size.width(),
pdfPage.size.height(),
RectF(0f, 0f, 500f, 500f)
)
val textSelectionArr = pdfTextPage.getSelectionsByLineForRect(selectRect)
for (textSelection in textSelectionArr) {
val text = pdfTextPage.getText(textSelection.textRange)
}这里提取的是指定矩形范围内的文本,不等同于阅读器中通过长按产生的手动选中结果。
pageIndex 和 CPDFTextRange 的对应关系。