Created attachment 88530 [details] PDF which returns the wrong number of glyphs/rectangles As discussed on the mailing list, attached is a PDF containing one phrase where the last letter overlaps the page bounding box. Unless I'm mistaken, poppler_page_get_text_layout is returning 18 glyphs and poppler_page_get_text is returning 17. > Yes, it's a bug, poppler_page_get_text_layout should always return the > same number of glyps as poppler_page_get_text. In this case the problem > is that TextSelectionDumper::getWordList() returns the list of words > inside the selection, but if a word is not completely selected (like in > this case because part of the word is outside the bbox) it still returns > the whole word. > > So, we have at least two possibilities: > > - Discard characters that are off-page in > poppler_page_get_text_layout. > - Make TextWordSelection class public and return a list of > TextWordSelection instead of a list of words so that we know in > poppler_page_get_text_layout which chars of the word are selected. > > The first option is probably easier, but the second one would also fix > other cases using this API in the future, and would make > poppler_page_get_text_layout easier, we would only need to iterate the > words from begin_selection to end_selection instead of from 0 to len. My own preference for my use case is to not discard information. It would be great if the solution could ensure that all glyphs are returned, even if they go over the edge of the page or are off the page.
Created attachment 88531 [details] [review] Patch This patch should fix the bug.
(In reply to comment #0) > Created attachment 88530 [details] > PDF which returns the wrong number of glyphs/rectangles > > As discussed on the mailing list, attached is a PDF containing one phrase > where the last letter overlaps the page bounding box. Unless I'm mistaken, > poppler_page_get_text_layout is returning 18 glyphs and > poppler_page_get_text is returning 17. > > > Yes, it's a bug, poppler_page_get_text_layout should always return the > > same number of glyps as poppler_page_get_text. In this case the problem > > is that TextSelectionDumper::getWordList() returns the list of words > > inside the selection, but if a word is not completely selected (like in > > this case because part of the word is outside the bbox) it still returns > > the whole word. > > > > So, we have at least two possibilities: > > > > - Discard characters that are off-page in > > poppler_page_get_text_layout. > > - Make TextWordSelection class public and return a list of > > TextWordSelection instead of a list of words so that we know in > > poppler_page_get_text_layout which chars of the word are selected. > > > > The first option is probably easier, but the second one would also fix > > other cases using this API in the future, and would make > > poppler_page_get_text_layout easier, we would only need to iterate the > > words from begin_selection to end_selection instead of from 0 to len. > > My own preference for my use case is to not discard information. It would be > great if the solution could ensure that all glyphs are returned, even if > they go over the edge of the page or are off the page. I don't think we should return characters that are not inside the page. What is your use case exactly?
(In reply to comment #2) > I don't think we should return characters that are not inside the page. What > is your use case exactly? I'm trying to extract information out of PDFs which may be poorly formatted, for example having glyphs that unintentionally go out of bounds.
I've pushed the patch to git master and also added poppler_page_get_text_for_area, poppler_page_get_text_layout_for_area and poppler_page_get_text_attributes_for_area, so that you can pass any rectangle to those methods.
Use of freedesktop.org services, including Bugzilla, is subject to our Code of Conduct. How we collect and use information is described in our Privacy Policy.