Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Polygons other than rects for crop (etc) #1001

Open
pseudomonas opened this issue Sep 29, 2023 · 3 comments
Open

Polygons other than rects for crop (etc) #1001

pseudomonas opened this issue Sep 29, 2023 · 3 comments
Labels
feature-request All feature requests receive this label initially, can be upgraded to "enhancement"

Comments

@pseudomonas
Copy link

I'm working with OCR'ed scans of historical documents where often the blocks of text have been rotated by a small amount (usually less than 5°) during the scanning process.

If the columns were originally printed straight, column detection along with rotation detection yields parallelograms. If the columns were printed wonky, then some other kind of polygon results from detecting the block of text.

So, what I'd like is to be able to specify (SVG-style) a list of coordinates [(x₀,y₀), (x₁,y₁), … (xₙ,yₙ)] that specify a closed polygon, and then to be able to select only the [characters|words] that fall [fully|partially] within that polygon as per pdfplumber's current tools for cropboxes.

An alternative might be providing a bitmap mask the same shape as the page - I think that I could reasonably easily use a third-party SVG-rendering package to generate such a thing.

@pseudomonas pseudomonas added the feature-request All feature requests receive this label initially, can be upgraded to "enhancement" label Sep 29, 2023
@jsvine
Copy link
Owner

jsvine commented Oct 4, 2023

Hi @pseudomonas, and thanks for the intriguing suggestion. Do you have any interest in developing a PR for this feature? If so, I'd be happy to discuss a general strategy with you.

@pseudomonas
Copy link
Author

I can give it a try. I see that there are various packages with an "is point within polygon" things so I could probably hack together something using the .filter method that tests each candidate object against the polygon. Not sure what performance would be like or what you think about extra dependencies.

My initial project I found I could get away with just increasing the size of the boxes a little bit to allow for rotation, and then filtering any stray characters out of the output later.

@jsvine
Copy link
Owner

jsvine commented Oct 6, 2023

Thanks, @pseudomonas! Given the niche-ness of this feature, I'm reluctant to add another required dependency, but I could see adding an optional dependency for this — something like:

def within_path(self, svg_style_path: list[tuple[int, int]]) -> DerivedPage:
  try:
    import name_of_dependency
  except ImportError:
    sys.stderr.write("Please install name_of_dependency to use .within_path; exiting.\n")
    exit()
  [actual logic]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feature-request All feature requests receive this label initially, can be upgraded to "enhancement"
Projects
None yet
Development

No branches or pull requests

2 participants