code: def _read(self) -> Iterator[Dict]:
      import fitz
  
      doc = fitz.open(self.file_url)
  
      # PAGE ID, PARAGRAPH ID, STRING
      row_num = 0
      for page_no, page in enumerate(doc):
          blocks = page.get_text("dict")["blocks"]
          # iterate through the text blocks
          for paragraph_no, b in enumerate(blocks):
              # this block contains text
              if b["type"] == 0:
                  # text found in block
                  block_string = ""
                  # iterate through the text lines
                  for lines in b["lines"]:
                      # iterate through the text spans
                      for span in lines["spans"]:
                          # removing whitespaces:
                          if span["text"].strip():
                              block_string += span["text"]
                  yield {
                      ROW_NUM_COLUMN: row_num,
                      "page": page_no + 1,
                      "paragraph": paragraph_no + 1,
                      "data": block_string,
                  }
                  row_num += 1
  
imports: from typing import Dict, Iterator
  from evadb.catalog.sql_config import ROW_NUM_COLUMN
  from evadb.readers.abstract_reader import AbstractReader
  from evadb.utils.generic_utils import try_to_import_fitz
label_desc: Use image node_id 2 for calling the PDFReader obj's underlying member method code with example usage: obj._read() without return types