Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
d798bfb
fix: import Union in main.py and correct pytest directory in Makefile
Mar 31, 2026
6fd3496
feat(pdf): Map Boolean Checkbox and Radio States & Fix main.py NameError
Mar 31, 2026
15122f6
Merge branch 'upstream/main' into fix/startup-and-tests
Dotify71 May 15, 2026
9feeb78
feat(pdf): enforce strict boolean typing for checkbox/radio fields
Dotify71 May 15, 2026
6977124
Merge upstream/main and resolve conflicts
Dotify71 May 24, 2026
a10663d
fix: add strict boolean schema validation and retry loop
Dotify71 May 26, 2026
c525c9b
Merge branch 'main' into fix/startup-and-tests
Dotify71 Jun 13, 2026
b27e5b7
refactor: replace Union with modern syntax and remove unused method call
Dotify71 Jul 4, 2026
0a959b0
fix: remove trailing whitespace in main.py
Dotify71 Jul 4, 2026
19b16c2
chore: fix f-string lint error
Dotify71 Jul 13, 2026
f4a21eb
fix: resolve ruff linter errors
Dotify71 Jul 28, 2026
7ebb951
fix: resolve ruff lint errors (I001 and SIM102)
Dotify71 Jul 30, 2026
fd57583
feat: :sparkles: first implementation of the benchmark, including fro…
marcvergees Aug 1, 2026
91fd496
fix: :bug: fixing test passing with empty structure of everything
marcvergees Aug 3, 2026
4927d9a
style: :lipstick: adding notes for guys
marcvergees Aug 3, 2026
73a382c
feat: add large-model reference evaluator
vharkins1 Aug 12, 2026
684ebfa
ics201 & 202
marcvergees Aug 13, 2026
fe000b1
ics203
marcvergees Aug 13, 2026
d9f0499
ics204
marcvergees Aug 13, 2026
a3ab05a
ics205 & ics205a
marcvergees Aug 13, 2026
2f24ff8
ics 206 & ics 213
marcvergees Aug 13, 2026
559030d
ics207 & ics 208
marcvergees Aug 13, 2026
2a6cd2b
ICS dataset generation markdown
marcvergees Aug 13, 2026
ce908a5
Merge pull request #663 from fireform-core/659-dataset-creations
vharkins1 Aug 13, 2026
2dd9e3a
refactor: :recycle: linting errors
marcvergees Aug 13, 2026
157e01a
linter errors 2
marcvergees Aug 13, 2026
86ade1b
Merge pull request #662 from fireform-core/612-feat-benchmark-module-…
marcvergees Aug 13, 2026
cb25b47
feat: :sparkles: add ics201-208 & 213 pdfs
marcvergees Aug 14, 2026
13806d2
refactor: :recycle: delete reference_benchmarks
marcvergees Aug 14, 2026
2378c26
feat: :sparkles: implementation of pdfs in the runner
marcvergees Aug 14, 2026
57d3d3b
Merge pull request #668 from fireform-core/667-add-pdfs-to-benchmark
marcvergees Aug 14, 2026
d71e765
Merge development and resolve conflicts
Dotify71 Aug 26, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 26 additions & 2 deletions src/filler.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,32 @@ def fill_form(self, pdf_form: str, llm: LLM):
for annot in sorted_annots:
if annot.Subtype == "/Widget" and annot.T:
if i < len(answers_list):
annot.V = f"{answers_list[i]}"
annot.AP = None
answer = answers_list[i]

# Check if the field type is a Button (Checkbox/Radio)
field_type = annot.FT if annot.FT else (annot.Parent.FT if annot.Parent else None)
if str(field_type) == "/Btn":
is_truthy = str(answer).lower() in ["yes", "true", "1", "x", "on"]

# Find the 'ON' state from the appearance dictionary
on_state = "/Yes" # Default assumption
if annot.AP and annot.AP.N:
keys = [k for k in annot.AP.N.keys() if k != "/Off"]
if keys:
on_state = keys[0]

if is_truthy:
from pdfrw import PdfName
annot.V = PdfName(on_state.strip("/"))
annot.AS = PdfName(on_state.strip("/"))
else:
from pdfrw import PdfName
annot.V = PdfName("Off")
annot.AS = PdfName("Off")
else:
annot.V = f"{answer}"
annot.AP = None

i += 1
else:
# Stop if we run out of answers
Expand Down
47 changes: 46 additions & 1 deletion src/main.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
from typing import Union
Comment thread
Dotify71 marked this conversation as resolved.
Outdated
import os

os.environ["CUDA_VISIBLE_DEVICES"] = ""

# Monkey patch rfdetr to force CPU usage on Mac Silicon / Docker
Expand All @@ -12,10 +14,53 @@ def patched_ensure(model_ctx):
except ImportError:
pass

from commonforms import prepare_form
from commonforms import prepare_form
Comment thread
Dotify71 marked this conversation as resolved.
Outdated
from pypdf import PdfReader
from controller import Controller

def input_fields(num_fields: int):
fields = []
for i in range(num_fields):
field = input(f"Enter description for field {i + 1}: ")
fields.append(field)
return fields

def run_pdf_fill_process(user_input: str, definitions: list, pdf_form_path: Union[str, os.PathLike]):
"""
This function is called by the frontend server.
It receives the raw data, runs the PDF filling logic,
and returns the path to the newly created file.
"""

print("[1] Received request from frontend.")
print(f"[2] PDF template path: {pdf_form_path}")

# Normalize Path/PathLike to a plain string for downstream code
pdf_form_path = os.fspath(pdf_form_path)

if not os.path.exists(pdf_form_path):
print(f"Error: PDF template not found at {pdf_form_path}")
return None # Or raise an exception

print("[3] Starting extraction and PDF filling process...")
try:
controller = Controller()
output_name = controller.fill_form(
user_input=user_input,
fields=definitions,
pdf_form_path=pdf_form_path
)

print("\n----------------------------------")
print(f"✅ Process Complete.")
print(f"Output saved to: {output_name}")

return output_name

except Exception as e:
print(f"An error occurred during PDF generation: {e}")
# Re-raise the exception so the frontend can handle it
raise e
if __name__ == "__main__":
file = "./src/inputs/file.pdf"
user_input = "Hi. The employee's name is John Doe. His job title is managing director. His department supervisor is Jane Doe. His phone number is 123456. His email is jdoe@ucsc.edu. The signature is <Mamañema>, and the date is 01/02/2005"
Expand Down