synchronize hightlights in non-/reflowing modes

and there is no need to OCR word if we can extract text from
original page in reflowing mode thanks to the rect maps between
normal page and reflowed page.
This commit is contained in:
chrox
2013-10-12 23:07:13 +08:00
parent 2f61b96748
commit 4660a3532b
7 changed files with 599 additions and 395 deletions

View File

@@ -1,6 +1,5 @@
require "cache"
require "ui/geometry"
require "ui/screen"
require "ui/reader/readerconfig"
require "ui/data/koptoptions"
require "document/koptinterface"
@@ -10,8 +9,6 @@ PdfDocument = Document:new{
-- muPDF manages its own additional cache
mupdf_cache_size = 5 * 1024 * 1024,
dc_null = DrawContext.new(),
screen_size = Screen:getSize(),
screen_dpi = Screen:getDPI(),
options = KoptOptions,
configurable = Configurable,
koptinterface = KoptInterface,
@@ -44,27 +41,27 @@ function PdfDocument:unlock(password)
return self:_readMetadata()
end
function PdfDocument:getTextBoxes(pageno)
if self.configurable.text_wrap == 1 then
return self.koptinterface:getReflewTextBoxes(self, pageno)
else
local page = self._document:openPage(pageno)
local text = page:getPageText()
page:close()
if not text or #text == 0 then
return self.koptinterface:getTextBoxes(self, pageno)
else
return text
end
end
function PdfDocument:getPageTextBoxes(pageno)
local page = self._document:openPage(pageno)
local text = page:getPageText()
page:close()
return text
end
function PdfDocument:getWordFromPosition(spos)
return self.koptinterface:getWordFromPosition(self, spos)
end
function PdfDocument:getTextFromPositions(spos0, spos1)
return self.koptinterface:getTextFromPositions(self, spos0, spos1)
end
function PdfDocument:getPageBoxesFromPositions(pageno, ppos0, ppos1)
return self.koptinterface:getPageBoxesFromPositions(self, pageno, ppos0, ppos1)
end
function PdfDocument:getOCRWord(pageno, rect)
if self.configurable.text_wrap == 1 then
return self.koptinterface:getReflewOCRWord(self, pageno, rect)
else
return self.koptinterface:getOCRWord(self, pageno, rect)
end
return self.koptinterface:getOCRWord(self, pageno, rect)
end
function PdfDocument:getUsedBBox(pageno)
@@ -91,48 +88,23 @@ function PdfDocument:getUsedBBox(pageno)
end
function PdfDocument:getPageBBox(pageno)
if self.configurable.text_wrap ~= 1 and self.configurable.trim_page == 1 then
-- auto bbox finding
return self.koptinterface:getAutoBBox(self, pageno)
elseif self.configurable.text_wrap ~= 1 and self.configurable.trim_page == 2 then
-- semi-auto bbox finding
return self.koptinterface:getSemiAutoBBox(self, pageno)
else
-- get saved manual bbox
return Document.getPageBBox(self, pageno)
end
return self.koptinterface:getPageBBox(self, pageno)
end
function PdfDocument:getPageDimensions(pageno, zoom, rotation)
if self.configurable.text_wrap == 1 then
return self.koptinterface:getPageDimensions(self, pageno, zoom, rotation)
else
return Document.getPageDimensions(self, pageno, zoom, rotation)
end
return self.koptinterface:getPageDimensions(self, pageno, zoom, rotation)
end
function PdfDocument:renderPage(pageno, rect, zoom, rotation, gamma, render_mode)
if self.configurable.text_wrap == 1 then
return self.koptinterface:renderPage(self, pageno, rect, zoom, rotation, render_mode)
else
return Document.renderPage(self, pageno, rect, zoom, rotation, gamma, render_mode)
end
return self.koptinterface:renderPage(self, pageno, rect, zoom, rotation, gamma, render_mode)
end
function PdfDocument:hintPage(pageno, zoom, rotation, gamma, render_mode)
if self.configurable.text_wrap == 1 then
self.koptinterface:hintPage(self, pageno, zoom, rotation, gamma, render_mode)
else
Document.hintPage(self, pageno, zoom, rotation, gamma, render_mode)
end
return self.koptinterface:hintPage(self, pageno, zoom, rotation, gamma, render_mode)
end
function PdfDocument:drawPage(target, x, y, rect, pageno, zoom, rotation, gamma, render_mode)
if self.configurable.text_wrap == 1 then
self.koptinterface:drawPage(self, target, x, y, rect, pageno, zoom, rotation, render_mode)
else
Document.drawPage(self, target, x, y, rect, pageno, zoom, rotation, gamma, render_mode)
end
return self.koptinterface:drawPage(self, target, x, y, rect, pageno, zoom, rotation, gamma, render_mode)
end
DocumentRegistry:addProvider("pdf", "application/pdf", PdfDocument)