Home

Extract text from pdf using coordinates python

  • Extract text from pdf using coordinates python. I will use lxml library:. I've tried. extract_text() function returns a dictionary with the following structure: Jun 2, 2022 · 1. Apr 9, 2021 · To show the result of the first PDF file: extraction_pdfs[ocr_file_list[0]] Conclusion. The most simple way to extract text from a PDF is to use extract_text: >>> from pdfminer. /” before the command “ grewed Nov 28, 2017 · If your pdf is text-based and not a scanned document (i. pdf -o output. pdf) Link to the full PDF file File. Jan 5, 2016 · Nowadays, pdfminer. Translations of this document are available in: Chinese (by May 25, 2018 · I want to extract text based on it's coordinates from converting multiple PDF files from a folder using pdfminer and storing my result into a list or a dictionary. Sep 6, 2010 · 6. Document(filename) This creates the Document object doc. extract_table(table_settings={"vertical_strategy": "lines", Sample Python code for using Apryse SDK to read a PDF (parse and extract text). argv[1]) The output file name is input-filename appended with ". Often it looks good for the reader, but is internally a mess. Learn more about our Python PDF Library and PDF Parsing & Content Extraction Library. May 30, 2022 · Regarding the text coordinates, Building a PDF Classifier using Python from scratch is referred to as Text Recognition. However, we can use the pdfplumber. Extract pdf pages which contains Parse all objects from a PDF document into Python objects. For simple documents you could use something like pdfminer to extract the text elements and then sort them left-to-right, top-to-bottom. Here, I am attaching the CSV file in which I am getting a data. Now, I just want to extract those coordinates from XML file Jan 24, 2012 · I am looking for a tool to extract a given rectangular region (by coordinates) of a 1-page PDF file and produce a 1-page PDF file with the specified region: # in. image_to_string(imge,lang='eng',boxes=True,config='hocr iterate through input and apply . ·. Saved ROIs. To wit - often text justification is achieved by breaking up text and just placing inlines so that it appears justified. But I want to make my code to convert a pdf folder rather than a single pdf file, then the extract text files will be store in a folder that I want. You could iterate over the pages and decode them individually. image_path = r"csv\sample_text. pdf') >>> print (repr (text)) 'Hello \n\nWorld\n\nHello \n\nWorld\n\nH e l l o \n\nW o r l d\n\nH e l l o \n\nW o r l d\n\n\x0c' >>> print Mar 27, 2016 · Concise, friendly PDF scraping using JQuery or XPath syntax. Lovecraft. image import Image as wi from PIL import Image pdf = wi (filename=("F:\\cng- Apr 27, 2023 · This is a Python library that streamlines data extraction process from PDF files by using selectors, (CSS-like)to locate elements in a document. 9, 3. tokenize RegexpTokenizer. fromstring(raw_html) divs = tree. Otherwise, it probably is a scanned pdf. We will see an example further down. It's more like an image - text can appear anywhere. We will need the following libraries: * pdfminer. page = pdf. The person reading the extracted text should be able to know what value corresponds to what column. jpg' imge = Image. (This mimics how dragging a cursor highlights text in a PDF; as with that, the order does not always appear to be logical. I want to extract all of the text from each PDF but pdfPlumber will break if my index is too large and I do not know the number of pages the PDF will have. join(cleaned_row)+'|'+'\n') # Removing the last line break. Here, we will use PDFQuery to read and extract data from multiple PDF files. It accesses the desired information by its specific Jul 17, 2019 · Using Opencv method to detect image and crop would be unreasonable for small projects for smaller projects with knowledge of bounding area following code works perfect and also saves image with same resolution as in original pdf or image. with pdfplumber. my function takes three arguments where src is a tuple of 4 float numbers representing (x0, y0, x1, y1). Use extract_text method found in pdfminer. To handle such a case you must use this knowledge for making specialized code. May 16, 2021 · A PDF document doesn't have a sense of reading order. We start off with a si Here is a working example (ported from previous answer) extracting annotations with the python module popplerqt5: python3 extract. 25134, -98. That code looks something like this: s = "pdftotext -x %d -y %d -w %d -h %d". close() text = ''. The input file name is provided as a parameter to this script (sys. from PIL import Image. Data Models Nov 12, 2019 · highlight (x1,y1,x2,y2) x1,y1 : coordinates of bottom left corner (start of word) x2,y2 : coordinates of upper right corner (end of word) This code of pdfminer that i found on the web provides the following output given a pdf. Please add below settings when using extract_tables() option (This may need to be changed based on your input file) : import pdfplumber. Feb 12, 2024 · How to run GROBID. To extract text from a PDF document using PyPDF3, you first need to open the PDF file in binary mode using Python's built-in open () function. Let’s get started. Mate Pocs. import camelot tables = camelot. I need something like Apache pdfbox or a python library for the task. converter. High-level api. If you want to extract text (properties) with Python, you can use the high-level api. Mar 6, 2023 · These include PDFMiner, PyPDF2, PDFQuery and PyMuPDF. How to Extract Text as Markdown# Jan 16, 2024 · Extracting font sizes from a PDF using pdfplumber is a bit more complex, as the library does not provide a built-in function for this. Here is the sample input PDF file (File. Feb 21, 2022 · Install Libraries. If you would like to convert a lot of images in the same folder into a single searchable PDF file, you can use os. Nov 12, 2020 · I'm trying to give to my script "X" coordinates, in where is a text that i want to retrieve and later name the . Pdf library may be used to extract text from PDF files as plain text or as a collection of text chunks with coordinates for each chunk. I know that Apache pdfbox does this nicely. The high-level API can be used to do common tasks. First of all, the pdf contains a clear table, as in there are separated columns, but these columns aren't separated by line. Feb 22, 2018 · I want to know the exact pixel position, so that i can click that text using some other tool. 877) or (31. If no text, then there could be 2 columns. Although in some files, data can be extracted easily as in CSV, while in files like unstructured PDFs we have to perform additional tasks to extract data from PDF Python. getPage(0)) for each page you want the text added to, then use output. Its items are words with position information. To run this sample, get started with a free trial of Apryse SDK. 3. from pdfrw import PdfReader doc = PdfReader (pdf_path) for page in doc. This wouldn't work, for Mar 19, 2020 · how to extract text from images in a pdf file using pytesseract. We can extract text from the image, cameras, scanned documents, and Jan 17, 2023 · Use these Python libraries to convert a Pdf into an image, extract text, images, links, and tables from pdfs using the 3 popular Python libraries PyMuPDF, Py Jun 16, 2021 · In this video we learn how to extract text from a PDF file with Python using PyPDF2. Then I write the data to a csv file. By extracting the text from these . extract_text() function to extract the text and font sizes at the same time. Aug 26, 2021 · How to extract text and text coordinates from a PDF file? Get coordinates of the given text in pdf using python. Let’s say we want to extract all of the text. pdf") page = doc[0] # example first page # extract text including its coordinates blocks = page. For Sample 1 the font information could be accessed too, thus resulting in better text extraction than PyPDF2 which tries to indicate bold text by grouping it with "\n". The pdfplumber. Use it to determine text contained in a given rectangle – see next section. from wand. Support for Chinese, Japanese and Korean CJK) languages as well as vertical writing. To access a supported document, it must be opened with the following statement: doc = pymupdf. For each word: (x1,y1,word). the last answer is correct but fails to correct the y coordinates. the bounding box co-ordinates, pdf is the object Jun 7, 2022 · I've found the bbox coordinates in the lxml file and managed to extract the wanted data with PDFQuery. Sep 5, 2023 · Extract Text from PDF using Python. ) Sep 29, 2023 · Read and Convert the PDF Files. from pytesseract import pytesseract. 2 Read specific region from PDF. Internally it's basically a list of characters with the coordinates of where to place them on the page using which font, etc. pip install fitz. As, it can be different for other pdf. pdf – Link. For example for Lattice: parser = Lattice (**kwargs) for p in pages: t = parser. Sorted by: 4. May 23, 2017 · How to extract text and text coordinates from a pdf file? The class provided is very helpful in that I can get the position of every text box in a PDF. Edit : import pytesseract from pytesseract import pytesseract import PIL from PIL import Image import cv2 import csv img = 'E:\\OCR-DATA\\sample. This allows you to inspect all of the elements on a page, ordered in a meaningful hierarchy created by the layout algorithm. layout import LAParams, LTTextBox, LTText, LTChar, LTAnno from If you want to extract text just once you can use the commandline tool pdf2txt. We use the page method 'get_text("words")' which delivers a list of This sample demonstrates how to use GPT-4 Vision to extract structured JSON data from PDF documents, such as invoices, using the Azure OpenAI Service. I've experimented with all 3, and so far I've only gotten code for pdftotext to extract text from within a given bounding box. boundingRect() then extract the ROI using Numpy slicing. Extracting text. pdf is a 1-page pdf file extract file. imwrite(). extend (t) Then you have access to parser. PDFQuery is a Python library that provides an easy way to extract data from PDF files by using CSS-like selectors to locate elements in the document. It’s designed to reliably extract data from sets of PDFs with as little code as possible. Options and comparison between Python libraries available for PDF/Image table reconstruction: pdfminer. get_fields() Then ff is a dict that contains all the relevant form information. getvalue() yield text. Sep 19, 2019 · 1 Answer. Aug 24, 2021 · 1. Plus: Table extraction and visual debugging. Extract text, images (JPG, JBIG2 and Bitmaps), table-of-contents, tagged contents and more. Import Libraries. path_to_tesseract = r"C:\Program Files\Tesseract-OCR\tesseract. pdf_document. 8, 3. I have tried the below code. open("input. Feb 26, 2023 · Extracting Text from PDF Documents. However, I ran into a few problems. get_text ()) Dec 26, 2020 · Image for demonstration: An image of white text with black background. pdf") Mar 7, 2024 · pdfplumber. Table of Contents. It employs various libraries such as pdfplumber, fitz Aug 17, 2020 · This looks good. high_level to extract text from the PDF file. From what I've found it sounds like PyMuPDF is the best option, and the below code came from the project's documentation. layout import LTTextContainer for page_layout in extract_pages ( "test. png with that text. pdf 0 0 100 100 > out. TEXTFLAGS_TEXT)["blocks"] old_bbox = fitz. PDF to text in Python returning empty results in image files. See my code below: Jul 19, 2022 · I am trying to extract the coordinates of each word from the input PDF file using pdfminer. Jul 9, 2020 · As is, this will only take the text from the first page of each PDF. Aug 21, 2021 · 2. pdf Apr 10, 2018 · path = 'reportlab-sample. Here's a working example: Input image: Detected ROIs to extract highlighted in green. This approach is the go-to solution if you want to programmatically extract information from a PDF. six has multiple API's to extract text and information from a PDF. pdf --generate-output -a "Highlight". May 25, 2020. img = Image. It does not provide tools for table extraction or visual debugging. Text on page 1: Jul 14, 2019 · Write the following code to create a PDF file object. We could do: from pdfminer. I tried all these libraries but didn't get the desired results. Disclaimer: I work for Bit Miracle. The provided code demonstrates a powerful Python script for efficiently extracting and processing content from PDF documents. six. So if in a multi-column page the second column has a slightly higher y-coordinate, it will come before the first column. Get Started Samples Download. PDF documents such as research papers, legal documents, contracts, or reports often contain important textual information. pq('LTTextLineHorizontal:overlaps_bbox("356. I'm thinking of using pdfminer to extract text from my PDF. extract_text() function returns a dictionary with the following structure: Sep 16, 2023 · I have a pdf file that contains a table of information I need to parse using python. Reading and Extracting Text from a PDF File in Python. pdf here; to get the pdf, use the link below. 11. pdf. py example. Feb 26, 2021 · I want to get the coordinates of a text in pdf by using python script. There are a couple of Python libraries using which you can extract Mar 16, 2017 · Based on the last answer I made my own function because it didn't work. Dec 19, 2022 · But, here I am putting coordinates after checking xml manually. Contents. pages[0--1] but this breaks as well. I have not been able to find a workaround with PyPDF2, either. filename must be a Python string (or a pathlib. We will now read one of the pdf files as an element object and load it. You can then create a PdfFileReader object using PyPDF3, which allows you to read the contents of the PDF file. close() return extracted_text. open () method is used to read file in python. # close open handles. 8 min read. This is the pdf from which I am extracting data. Jan 16, 2024 · Extracting font sizes from a PDF using pdfplumber is a bit more complex, as the library does not provide a built-in function for this. Extract text from a PDF using Python¶. pdf", 'rb') Now you have to open your file to read. Concise, friendly PDF scraping using JQuery or XPath syntax. jpg") left = 90. You can do so using any Word processor like Microsoft Word or Google Docs and save the file as a PDF. answered Apr 15, 2011 at 15:14. f = PyPDF2. In the first example, we pass the OpenCV image object of our input image along with the detail parameter as 0 to produce a simple output. We can keep a counter to save each ROI then save it with cv2. get_text("text", clip=rect) # Append extracted text to the result. Through this code, I was able to extract many PDF documents. pdf = pdfquery. py. May 29, 2023 · Data Extraction is the process of extracting data from various sources such as CSV files, web, PDF, etc. Document. Published in. Sep 21, 2023 · row = table[row_num] # Remove the line breaker from the wrapped texts. import pdfquery. 0. Click here if you want to check out the PDF I am using in this example. 7 specification. PDF to text convert using python pytesseract. May 14, 2022 · You can convert the PDF to Postscript (pstopdf or ps2pdf) and than use text processing on the Postscript file. I also need it to provide the x2,y2 coordinates if possible. sample. See the following two sections for examples and further explanations. Below is the full implementation: Python3. The problem is that sometimes the string has variable length so one time it might look like this (31. Pdfplumber seems to be the best option for this. 10, 3. PDFQuery is a light wrapper around pdfminer, lxml and pyquery. This program extracts the text of an input PDF and writes it in a text file. An example of a searchable (digitized) pdf document. pip install pandas. Method 1: Scrape PDF Data using TextBox Coordinates. 285 Opening a Document #. Now that's working for images, let's try for PDF files: $ python pdf_ocr. Photo by Aleksandar Pasaric from Pexels. pdf is now a 1-page pdf file with a page of size 100x100 # it contains the region (0, 0) to (100, 100) of file. For programmatically extracting information I would advice to use extract_pages(). from lxml import html tree = html. In the terminal ensure to use “. 684, 563. import numpy as np. Towards Data Science. 1. import pandas as pd. P. Extract a list of single words via Page. load(fn) annotations = [] for i in range(doc. So, I want to use coordinates dynamically (directly from xml file). This is an example for using the Python binding PyMuPDF of MuPDF. To extract the text from the pdf, we need to follow the following steps: Importing the library. The thing is that the script reads the entire . open(filename) # or pymupdf. close() fake_file_handle. read_pdf('foo. Once you downloaded and unzipped the “ grobid” file, proceed to the folder and run the grewed file. Note: We are using the sample. using pytesseract to generate a PDF from image. # Close the PDF document. # open input May 30, 2022 · Regarding the text coordinates, Building a PDF Classifier using Python from scratch is referred to as Text Recognition. How to split, save, and extract text from PDF files using PyPDF2 and PDFMiner, demonstrated with the complete works of H. I try to make a searchable pdf according to extracted coordinates but when I convert it to csv, the lines are not tune. You can create the PDF parser directly. Jun 17, 2022 · I want to extract plain text from a PDF and run it through a named entity recognition function that spits out text and string positions. Jul 1, 2022 · I use easyocr to extract table from a photo or scanned PDF, but I have a problem in fine tuning the data as a table. from pdfminer. Now our divs variable Aug 24, 2023 · Method extract extracts all text of the table as a list of lists, which each contain the string of the respective cell. Currently tested on Python 3. cleaned_row = [item. This script assumes that PDF is stored in pdfs directory and extracted images needs to be stored in images directory inside current directory. Path) specifying the name of an existing file. open(img) data=pytesseract. You can also pass -c or --show-comparison to display the original image and the edited image in the same window. This approach takes advantage of the GPT-4 Vision model's ability to understand the structure of a document and extract the relevant information, without the need to use additional AI services, such as Azure AI Document Intelligence (formerly A simple approach is to find contours, obtain the bounding rectangle coordinates using cv2. This works nicely if the PDFs you want to process are all generated by the same application and are somewhat similar. pip install pymupdf. load() Next we need to convert the pdf object into an Extensible Markup Language (XML) file. pdf') ff = f. PDFQuery('patient1pdf. Feb 25, 2011 · 6. exe". For the purpose of this tutorial we are creating a sample PDF with 2 pages. Changing use_text_flow to True will use the PDF's underlying flow of characters as a guide for ordering and segmenting the words, rather than presorting the characters by x/y position. Apr 9, 2019 · I understand there are tools for pdf scraping such as pdfminer, pypdf, and pdftotext. if you can click and drag to select text in your table in a PDF viewer), then you can use the module camelot-py with. import argparse. Here is some code to answer the question below: May 30, 2019 · Other solutions didn't work for me, so here's my solution: Install PyMuPDF with: pip install pymupdf Create and run following script. pdf') pdf. import popplerqt5. pages: bytestream = page. Opening document. def pdf_scrape(pdf): """ Extract each relevant information individually input: pdf to be scraped returns: dataframe of scraped data """ # Define coordinates of text to be extracted CUSTOMER = pdf. . addPage() to add the modified pages to a new document. extracted_text += text. walk to create a list of paths for all the image files in the same folder, then use the same functions mentioned above to process the images and export into a single searchable PDF file. Aug 23, 2021 · I'm trying to extract images from a PDF file using pdfminer. The first thing we do is create our own get_info function that accepts a PDF file path as its only argument. See PyPDF's sample for watermarking a document. six: This library is used to read and manipulate PDF files. I am trying to extract text from a specific portion of a PDF file. open("page_1. May 25, 2020 · PDF Text Extraction in Python. We can extract text from the image, cameras, scanned documents, and Oct 5, 2020 · Set up PDFMiner using !pip install pdfminer. Installation; Quick Start; Usage. We need to extract the value of Invoice Number, Due Date and Total Due from the whole PDF file. six provides the foundation for pdfplumber. Import the necessary libraries. open(image_path) Changing use_text_flow to True will use the PDF's underlying flow of characters as a guide for ordering and segmenting the words, rather than presorting the characters by x/y position. therefore you have to get the size of the PDF and substract the pdf coordinates AND THEN Transform it. Perform operations such as getting frequency distributions of the words, getting words more than some length etc. I need to give to the script the coordinates (that i have) and then retrieve only the words that im looking for Sep 25, 2019 · text = fake_file_handle. Here's an example: Jun 29, 2007 · See the "COPYING" file of this repository. py: $ pdf2txt. Docotic. I must say I'm not really good at Python but I'm trying my best. EMPTY_RECT() # store previous bbox here old_text = "" # store previous text here for b Apr 8, 2024 · text = page. And I wonder if it's possible to translate back to page coordinates from string positions. high_level import extract_pages from pdfminer. As we will see later, pymupdf does not work with a scanned pdf. I was wondering whether there was some way to get the position of each line of text within the textbox as well? Feb 2, 2021 · The tool we are using in this tutorial is PDF Plumber, an open-source python package, it’s great, simple and powerful. top = 580. pdf') Oct 5, 2020 · Set up PDFMiner using !pip install pdfminer. I would appreciate if someone guide me about this. ) 2. pdf" ): for element in page_layout : if isinstance ( element , LTTextContainer ): print ( element . e. This also assumes that the full page is in a 2 column layout. Script i have used so far: Apr 10, 2023 · Using PyMuPDF, you are able to suppress pseudo-bold text like for example this: import fitz # import PyMuPDF doc = fitz. I want the output to be interpretable. py -s "BERT" -i image. layout which contains all the components in the page. s = s%(<various inputs into my function>) Jul 16, 2023 · Next, we open the PDF file in read-binary mode (‘rb’) using Python’s built-in open() PyPDF2 enables you to extract text from PDF files, which can be useful for searching, indexing, or It's just a little tricky, because PDF doesn't generally provide text flow. get_text("dict", sort=True, flags=fitz. In this article, I’ve shared code for how to use two popular Tesseract python APIs to conduct OCR on PDF Jul 2, 2019 · How to extract text from PDF image file with in the coordinates, using python and with its external libraries. If I provide a pdf and "some_sample_text", the script should search inside the pdf and provide the x,y coordinates of "some_sample_text". In the docs the explain how to extract the text. The file is opened in rb mode ( r for read and b for binary). Jan 15, 2023 · Example 1 – Using EasyOCR Without Details. Tokenize the text file using NLTK. edited Mar 20 at 16:51. Aug 18, 2023 · Sure, here is an in-depth explanation on how to extract the x and y coordinates of an image in a PDF file using Python. Mar 10, 2022 · Image by Author Convert Multiple Images in the same folder to a Single searchable PDF. Here is sample code for finding text and highlighting with PyMuPDF: import fitz. I have a latitude and longitude that come in a string like this: I would like to use Python to extract the coordinates from the above string. open(r'document. image_to_string(imge,lang='eng',boxes=True,config='hocr Oct 30, 2023 · Suppose on the following page we want to highlight all occurrences of the word “whale”: For this, we can use the following simple script: import pymupdf # import package PyMuPDF. pdfFileObject = open(r"F:\pdf. doc = fitz. high_level import extract_text >>> text = extract_text ('samples/simple1. How to Use PDFQuery. Apr 30, 2020 · Now, for our purposes, we should extract all divs from the page. If you'd like to search text on PDF pages, see our code sample for text search. Dec 20, 2022 · BTW the sort parameter causes the text blocks to be sorted ascending by (1) vertical, (2) horizontal coordinate of their bounding boxes. pip install pdfquery. for page in extract_pdf('Path of the PDF Document'): text += page. PdfReader('form. Of course, you will have to tweak the 5% and see what best fits your need. This file will include data and metadata for a given pdf page. Nov 26, 2017 · PyMuPDF can find text by coordinates. Plumb a PDF for detailed information about each text character, rectangle, and line. Or you can just use PyMuPDF to highlight the text. numPages()): Sep 30, 2020 · How to extract some of the specific text only from PDF files using python and store the output data into particular columns of Excel. This class gives us the ability to read a PDF and extract data from it using various accessor methods. Nov 30, 2021 · A simpler solution could be to crop the page keeping the middle 5% and run text extraction on it to see if there's any text or not. Mar 8, 2024 · Installation. Jul 16, 2021 · I want get results exactly the same way as shown in the images by using any of the Python libraries like PyPDF2, PDFPlumber, PDFminer etc. Support for (almost all) features from the PDF-1. edited Jan 21, 2023 at 18:20. Follow. It primarily focuses on parsing PDFs, analyzing PDF layouts and object positioning, and extracting text. py sample. //div'). png and give me all the text. def extract(fn): doc = popplerqt5. 877435). xpath('. You can use this in conjunction with the PyPDF2 highlighting method to accomplish what you're describing. ### READ IN PDF. We also learn how to convert PDF to a text file. Oct 13, 2020 · In this tutorial we will learn how to extract text from a PDF file in Python. but when I tested it on other random PDFs from the internet, it starts fluctuating and then the Feb 22, 2022 · To figure out whether a pdf is searchable, open a pdf document, press CTRL+F and type a word that is present on the document. 2. Analyze and group text in a human-readable way. get_info(path) Here we import the PdfFileReader class from PyPDF2. The problem is that the text that is extracted is not from the rectangle. pdfminer is able to extract the text in Sample 2 too and also extracts the text from the figure in it (which can be turned off). pages[0] table = page. Aug 23, 2023 · Aug 23, 2023. png". So if I do something like my_string[9:15] to extract the The Python PyPDF2 package (successor to pyPdf) is very convenient: import PyPDF2. This works well for simple text additions. Pdf can be used to extract images from PDFs, too. get_text(“words”). * numpy: This library is used to work with arrays. Built on pdfminer. However, it's just a bytestream. Works best on machine-generated, rather than scanned, PDFs. After that you can convert the output back to PDF. mergePage(*text*. From the output, it can be seen that EasyOCR has done a decent job of identifying almost all text correctly from the image. I initially managed to convert a single file, and was able to extract text based on its coordinates. Let’s make a quick example, the following PDF file includes W2 data in unstructured format, in which we don’t have typical row-column structure. extract_tables (p, suppress_stdout=suppress_stdout, layout_kwargs=layout_kwargs) tables. pdf'. And give the input of your file name and file path. stream # This is a string with bytes, Not a bytestring string = #somehow decode bytestream. Sep 20, 2020 · I have the code to extract/convert text from scanned pdf files/normal pdf files by using Tesseract OCR. If the program can find that word, it is searchable. txt". on a page. pdf') as pdf: page = pdf. table_string+=('|'+'|'. replace('\n', ' ') if item is not None and '\n' in item else 'None' if item is None else item for item in row] # Convert the table into a string. Poppler. extract. pdf # out. The class given also inserts a '_' every time there is a new line within the textbox. dr gx vz er wr uu zk wc gm bi