Running the script would generate both html files and pdf files for all rows. Recently we launched our first Python SDK specifically for support with the Adobe PDF Extract API. Jupyter Notebooks comes from an open-source project designed to create a sort of interactive playground for working with code. Connect and share knowledge within a single location that is structured and easy to search. To use Gilfoyle, we first instantiate the Report class and tell it the name of our output file, which Ive called example.pdf, and then use get_payload() to obtain the initial payload. You can use df.to_html(). For my report, I want to select a bunch of common metrics, and show the value in the most recent month, and the value in the same month last year. It differs from Styler.copy where data and data dependent attributes are also copied. The left side of the image below shows this representation. The original pyPdf package was released way back in 2005. round Note: When using to_html() recently I had to remove extra '\n' characters for some reason. Microsofts docs give a good overview, but the easiest way to quickly start is to make a new file and use the ipynb extension. you choose to use Jinja for your webapps. When doing this, Gilfoyle will first create the template in HTML and then save the output to pdf. Why was the nose gear of Concorde located so far aft? What are some tools or methods I can purchase to trace a water leak? Modules Needed. Dont like Jinja? and more! If youd like to learn more, Carnegie Mellon University has an interesting paper on the topic. | from flask import * import pandas as pd app = Flask (__name__) @app.route ("/tables") def show_tables (): data = pd.read_excel ('dummy_data.xlsx') data.set_index ( ['Name'], inplace=True) data.index.name=None females = data.loc [data.Gender=='f'] males = data.loc [data.Gender=='m'] return render_template ('view.html',tables= [females.to_html First, open a Jupyter notebook and install my GAPandas and Gilfoyle packages by executing the below pip commands in a Jupyter cell, then import the packages. Chapter 5: Categorical data. After I installed nbconvert, I received an error saying 500: Internal Server Error. The reason why you see this error is that you havent installed LaTeX or Pandoc yet. You will receive an AssertionError otherwise. iveco stralis fehlermeldung symbole. What I like about this cssis: Lets try re-rendering it with our updatedstylesheet: Just adding a simple stylesheet makes a hugedifference! All the code and PDF files used in this tutorial/article are available here. for a while and does generate PDFs effectively from HTML. Do German ministers decide themselves how to vote in EU decisions or do they have to follow a government line? To speed up the reporting process, I built a Python package that generates stylish looking PDF reports directly from Pandas dataframes. This is especially true of PDFs that contain a lot of scanned-in content, but there are a plethora of good reasons for wanting to split a PDF. of HTML and use it repeteadly in different portions of the code. Lets generate invoices according to the following sales table: Each customer needs an invoice pdf file which is named by the customers name. While were focusing here on Python, other languages like R and Haskell are supported as well. Chapter 6: Computational Tools. Pandas DataFrame Styler We can apply any type of conditional formatting to the DataFrame and visualize the styling of a DataFrame depending on the condition on data within, by using the DataFrame.Style property. average quantity and price of the CPU and Softwaresales. After playing different tools for a while, I have chosen pdfkit, which is a python wrapper for wkhtmltopdf. When a cell contains code and is run, its output will be printed directly beneath the cell. One all-in-one tool for this method is to use Atom text editor (https://atom.io/). How to choose voltage value of capacitors. I had to do a little digging to figure out the best way to make the pages However, if you choose to use other markup languages, the flow should work break so I thought I would include it to help othersout. The table is pretty printed with some minimal css. Using the same data from the previous example, import the show command: from pandasgui import show show(df) If everything works, you will end up with a separate GUI. The reason watermarking is important is that it allows you to protect your intellectual property, such as your images or PDFs. are patent descriptions/images in public domain? How to print dataframe row by row into pdf and to align it in page? By the end of this article, youll know how to do the following: Free Download: Get a sample chapter from Python Tricks: The Book that shows you Pythons best practices with simple examples you can apply instantly to write more beautiful + Pythonic code. If you print this, youll see that a page has been added to the pages list, which contains the placeholder values for our template. The Pandas to_html () function lets you convert a Pandas data frame into HTML table format. Weapon damage assessment, or What hell have I unleashed? How to upgrade all Python packages with pip. Gilfoyle has converted the original Pandas dataframe into an HTML table, added some styling elements to improve its appearance, and written it back to the dictionary, so it can be inserted into the template. configured to resemble PowerPoint presentations. Then you can print pdf files for every row. pandas DataFrames. statement Lets find out how to do the opposite of merging! After each call to the rotation methods, you call .addPage(). The name Jinja was chosen because its the name of a Japanese temple and temple and template share a similar pronunciation. Let's write Pandas DataFrame in an HTML file. to Text in a cell can be used to describe whats going on, so in some ways its much like code comments, but with rich Markdown support, it becomes a bit easier to read as well as provide richer documentation. Import modules, and read in the sales funnelinformation. Overview When converting Jupyter Notebooks to pdf using nbconvert, pandas DataFrames appear as either raw text or as simple LaTeX tables. random warrior cat generator perchance. customisable presentation that looks crisp on any screen. A simple one. import tabula df = tabula.io.read_pdf (url, pages='all') then you will get many tables, you can call it by using index, it's like printing element from list, Example: # ex df [0] more info here - https://pypi.org/project/tabula-py/ Share Improve this answer Follow edited Sep 29, 2021 at 11:55 answered Sep 22, 2021 at 10:13 zzhapar 87 3 We reassign the output of add_page() back to the payload dictionary. We create a dictionary called standalone PDF document using Jinja templates and WeasyPrint. Another term for watermark is overlay. I'm not 100% sure what you meant by your question? the summary contains some simple national level stats we want to include on want to have finer grained control over the output of yourtable. It will simply make use of the last result from the previous cell. Learning pandas eBook (PDF) Download this eBook for free. nbconvert allows users to convert Notebooks to other formats. Is it possible to open PDFs and read it in using python pandas or do I have to use the pandas clipboard for this function? Curated by the Real Python team. Most of the examples in this article will work perfectly fine with PyPDF4, but there are some that cannot, which is why PyPDF4 is not featured more heavily in this article. we have access to: To create the data for your other marketing channels, its simply a case of passing in the required Google Analytics API filter parameter to the filters argument. free avatars on gumroad. Browse other questions tagged, Where developers & technologists share private knowledge with coworkers, Reach developers & technologists worldwide. You will also need to know where to save the result, so this function takes a list of input paths and an output path. This variable is how reportlab which allows you to create PDFs using text and drawing primitives. These tables via matplotlib dont look so great, compared to LaTeX or troff for that matter. What does the "yield" keyword do in Python? Was Galileo expecting to see so many stars? Was Galileo expecting to see so many stars? https://blog.chezo.uno/tabula-py-extract-table-from-pdf-into-python-dataframe-6c7acfa5f302, There is a new version of tabula called tabula-py, the .read_pdf method works just like in the old version, documentation is here: The default pdf format cut off the side of the page. This can be done with method render as follows: Lets go ahead and write some code that you can use to merge PDFs together: You can use merge_pdfs() when you have a list of PDFs that you want to merge together. FPDF is a PHP class that allows generating PDF files with pure PHP. Site design / logo 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA. Secondly, it assumes credential files as well. two DataFrames on one Excel sheet, you need to use the Excel libraries to manually construct your output. with alternating colors for the rows), see the answer below, Worked great! Find centralized, trusted content and collaborate around the technologies you use most. The pdf conversion is done with weasyprint. Both have a web version, so you can try with some example to decide which is the best one for your application. There are many websites that do not allow to download the content in form of pdf, they either ask to buy their premium version or don't have such download service in form of pdf. Since you will want to encrypt the entire input PDF, you will need to loop over all of its pages and add them to the writer. which mentions another file. First letter in argument of "\affil" not being output if the first letter is "L", Can I use this tire + rim combination : CONTINENTAL GRAND PRIX 5000 (28mm) + GT540 (24mm). I suspect that when you start to do more of these you will Last but not least, dont forget to delete the default article.tplx from the LaTeX folder. 20122023 RealPython Newsletter Podcast YouTube Twitter Facebook Instagram PythonTutorials Search Privacy Policy Energy Policy Advertise Contact Happy Pythoning! I first installed his nb_pdf_template by running a command line: pip install nb_pdf_template. I have one quick aside before we talk templates. A Medium publication sharing concepts, ideas and codes. @ccsv: who fills the clipboard? Making statements based on opinion; back them up with references or personal experience. Before writing the code we need to install the required module pdf2image and poppler. {{ title }} Now weve got our data into Pandas, we can move on to the creation of the PDF itself, which is done using my Gilfoyle package. language. To subscribe to this RSS feed, copy and paste this URL into your RSS reader. The metric tile requires a Then for page two, you call .rotateCounterClockwise() and pass it 90 degrees as well. Launching the CI/CD and R Collectives and community editing features for Embed indented HTML in Markdown with Pandoc. DataFrame to the clipboard which you can then easily paste into Excel. Asking for help, clarification, or responding to other answers. If you want to repeat the process, click in the code cell with the Extract code, and in the Runtime menu, select Run after. In seconds, Gilfoyle has taken the outputs of our Pandas dataframes, which were created by querying your Google Analytics data, and has created a fairly attractive PDF report containing monthly data on each metric, as well as a range of metric tiles, which make it easier to see whats improved and what hasnt. Distance between the point of touching in three touching circles. This can be achieved by using the to_html () method. For the first example of using PDF Extract with Jupyter Notebooks, we'll look at Google Colab. Heres the link: https://colab.research.google.com/drive/1mg5bPJxNHClf_Gu5VQP-jrVXbdNOGA2U?usp=sharing. You can run the first cell, then the second, realize you messed up, and choose to rerun just the second cell. our HTML. However, if you would like to combine multiple pieces of Site design / logo 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA. Installing PyPDF2 can be done with pip or conda if you happen to be using Anaconda instead of regular Python. We can now repeat the process for direct (or untracked) sessions, which are identified with the filter ga:medium==(none). Everything is run in the cloud with no need for any local installations. The issue here is that nbconvert sees the DataFrames as HTML (plus the styling, which you're seeing in the output, issue here), which gets ignored by pandoc's Markdown converter. Any idea how to fix this issue, please? By placing placeholders `` in a html template, in Python, Jinja can pass actual values to the placeholders when rendering html files. https://levelup.gitconnected.com/how-to-write-a-pandas-dataframe-as-a-pdf-5cdf7d525488. Without much effort, pandas supports This contains most of the information that youre interested in. Pandas read File is an amazing and adaptable Python bundle that permits you to work with named and time-series information and also helps you work on plotting the data and writing the statistics of data. We need Software If youre one of many data scientists looking for a job, you might find yourself working on a data science take-home assignment. How to iterate over rows in a DataFrame in Pandas, Get a list from Pandas DataFrame column headers. Am I being scammed after paying almost $10,000 to a tree company not being able to withdraw my profit without paying a fee. col_spacestr or int, list or dict of int or str, optional Note: The PyPDF2 package only allows you to rotate a page in increments of 90 degrees. It returns a list of dfs (dataframes) and not a single df even if there's only one table found. While you can run a notebook from start to finish, you can also run one cell at a time. The third cell is more text and the final cell simply prints it out. Alan Jones in CodeFile Data Analysis with ChatGPT and Jupyter Notebooks Lucas Soares in Geek Culture Automating Notion with Python Help Status This new PDF will contain three pages. If you find this helpful, please share and follow my blog so you wont miss out! into this workflow. Pandas is excellent at manipulating large amounts of data and summarizing it in fees by linking to Amazon.com and affiliated sites. Say I have several table slices of a pandas dataframe and I want each table to start on a new page. Convert HTML/webpage to PDF. Acceleration without force in rotational motion? Raymond Camden is a Senior Developer Evangelist for Adobe. Then you call the page objects .rotateClockwise() method and pass in 90 degrees. If None, the output is returned as a string. Then use Pandas to wrangle the Excel data. to do withinPandas. very complicated about our templates so any tool should workfine. Partner is not responding when their writing is needed in European project application. To learn more, see our tips on writing great answers. They havent actually done anything with the result. You can go to the first code step and choose the Execute cell and below option which will show new ages for the cats. Step 4: Render DataFrame to HTML table keeping custom CSS style Finally let apply custom styling and convert the DataFrame as HTML table. This is how the template looks like: As you may see from the template, the column names in our table have corresponding placeholders. You can run your notebook via the Run All link on bottom. generate a simple report. in First, open a Jupyter notebook and install my GAPandas and Gilfoyle packages by executing the below pip commands Thanks for contributing an answer to Stack Overflow! Distance between the point of touching in three touching circles. PDFMiner is much more robust and was specifically designed for extracting text from PDFs. Visual Studio Code provides excellent support for Jupyter Notebooks via its extension. By clicking Accept all cookies, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy. The site provides articles and tutorials on data science, machine learning, and data engineering to help you improve your business and your data science skills. In this tutorial, you learned how to do the following: Also keep an eye on the newer PyPDF4 package as it will likely replace PyPDF2 soon. Theres loads more you can do with Gilfoyle, including adding in commentary, alert messages, graphs, and much more. There are tools to remove passwords from PDFs. The get_payload() function returns a Python dictionary, which we can see in its empty form below. Once youre finished iterating over all of the pages of all of the PDFs in your list, you will write out the result at the end. multi-page PDFdocument. . yet but I chose WeasyPrint because it is still being actively maintained The following items are exported since they are not generally data dependent: Styling functions added by the apply and applymap. Load the Excel XLSX file using the Workbook class. What are examples of software that may be seriously affected by a time jump? You can do this by calling the df.to_html () function. You also call .getNumPages() on the reader object, which returns the number of pages in the document. is CSS. While the PDF was originally invented by Adobe, it is now an open standard that is maintained by the International Organization for Standardization (ISO). For me the best way is using ipypublish (https://ipypublish.readthedocs.io/en/latest/). So far our notebooks have only performed an extraction. pdfFileObj = open ('2017_SREH_School_List.pdf', 'rb') pdfReader = PyPDF2.PdfFileReader (pdfFileObj) Now we can take a look at the first page of the PDF, by creating an object and then extracting the text (note that the PDF pages are zero-indexed). The other key component is the creation of ViewResolver new-form viewResolver .BeanNameViewResolver new-f. Now lets learn how you can merge multiple PDFs into one. In case it is a one-off, you can copy the data from your PDF table into a text file, format it (using search-and-replace, Notepad++ macros, a script), save it as a CSV file and load it into Pandas. I also think everyone knows (or can figure out) enough HTML to Fortunately, the python environment has many options to help usout. pandas.io.formats.style.Styler.render # Styler.render(sparse_index=None, sparse_columns=None, **kwargs) [source] # Render the Styler including all applied styles to HTML. for variables that we will provide when we render thedocument. at least serviceable for a start. You can use Python to help you do that sort of thing. The decision-making panel can see the data frame values translated to their native document environment, without requiring any environment shift. You would find the same issue run in the usual fashion on your own machine. In order to pull it all together, here is the fullprogram: You can also view the gist if you are interested amd download a zip file of allows us to bring in a snippet and Launching the CI/CD and R Collectives and community editing features for How can I convert a Panda DataFrame or QTableWidget to a Pdf? I chose Jinja because I have experience with Django and it closely mirrors It also provides you with many options to customize your HTML output based on your requirements by using different parameters, some of which are discussed in this article. In many cases, you can provide more rich output than usual with tables that are nicely rendered with sorting features or charts that make the results easier to read. While reporting is often quite a useful way to stay on top of your data, its also something you can automate to save time, even if your reports include custom sections of analysis. sda emv chip writer by paws tutorial. Not the answer you're looking for? of code that alters the control flow. as well as to optionally paginate the PDF: Explanation of the code is here: What factors changed the Ukrainians' belief in the possibility of a full-scale invasion between Dec 2021 and Feb 2022? In a nutshell, Jinja bridges our Python code and html files which will be shown to end users. import pandas as pd import PyPDF2 Then we will open the PDF as an object and read it into PyPDF2. All our later functions basically populate this dictionary with pages, which get passed to Gilfoyle and used to render the reports using specially named variables that map to placeholders in the template. To start with, I have already composed a template html file based on this repo. How to choose voltage value of capacitors. intermediate, Recommended Video Course: How to Work With a PDF in Python. 542), How Intuit democratizes AI development across teams through reusability, We've added a "Necessary cookies only" option to the cookie consent popup. Djangos syntax. Why is "1000000000000000 in range(1000000000000001)" so fast in Python 3? Up until now, we havent done anything different than if we had just generated #function to display the PDF of a given file def displayPDF (file): # Opening file from file path. If you're not pulling live data from the Google Analytics API, you can skip the GAPandas bit and just load your data straight into Pandas. This means you can skip rerunning it multiple times as you iterate over how you work with that data. I did not use pdfkit, because I had some problems with it on a headless machine. 542), How Intuit democratizes AI development across teams through reusability, We've added a "Necessary cookies only" option to the cookie consent popup. Now, all we have to do is index through the list to get each of the tables as a data frame. Let's go through an example and see how to render the data frame into each of these formats and how does the output looks like in their respective document viewers. Some PDFs will return text and some will return an empty string. Finally, you write the newly watermarked PDF out to disk, and youre done! Each tutorial at Real Python is created by a team of developers so that it meets our high quality standards. you want to combine multiple pieces of data into one document. After I successfully converted the notebook into a pdf file, I realized that the margin of the file was off! This contains most of the information that youre interested in languages like R and are... Paper on the topic the placeholders when rendering HTML files range ( 1000000000000001 ) '' so fast in?. This can be done with pip or conda if you find this helpful, please open-source project designed to a. Empty form below wont miss out the cell from PDFs out how to Work with that data in! Import PyPDF2 then we will open the PDF as an object and in. Camden is a Python dictionary, which we can see in its empty form below s write Pandas DataFrame headers... You call.rotateCounterClockwise ( ) on the reader object, which we can see in its empty form below installed. For every row this method is to use Atom text editor ( https //colab.research.google.com/drive/1mg5bPJxNHClf_Gu5VQP-jrVXbdNOGA2U... Will first create the template in HTML and then save the output PDF. Then we will provide when we Render thedocument to align it in fees by linking to Amazon.com and affiliated.! Also copied PDFs will return an empty string on writing great answers is how reportlab allows. Error saying 500: Internal Server error PythonTutorials search Privacy Policy Energy Policy Advertise Contact Pythoning... Studio code provides excellent support for Jupyter Notebooks comes from an open-source project designed to create PDFs text! For any local installations try re-rendering it with our updatedstylesheet: Just adding a simple stylesheet makes hugedifference..., all we have to do is index through the list to each! Pdfs effectively from HTML private knowledge with coworkers, Reach developers & technologists worldwide, please youd... By linking to Amazon.com and affiliated sites RSS feed, copy and paste this URL your... And below option which will show new ages for the rows ), see our tips writing. Realpython Newsletter Podcast YouTube Twitter Facebook Instagram PythonTutorials search Privacy Policy Energy Advertise! Pieces of data into one, alert messages, graphs, and youre done the required module and... Meets our high quality standards link on bottom you wont miss out Get a list from Pandas dataframes appear either! Fees by linking to Amazon.com and affiliated sites show new ages for the.. That data paying almost $ 10,000 to a tree company not being able to withdraw my profit without paying fee! It into PyPDF2 load the Excel XLSX file using the to_html ( ) function lets convert! Output to PDF up with references or personal experience is `` 1000000000000000 in range ( 1000000000000001 ) so! In a nutshell, Jinja can pass actual values to the rotation,... To vote in EU decisions or do they have to follow a government line ; s write DataFrame! `` in a HTML template, in Python 3 in a DataFrame an. ( dataframes ) and pass it 90 degrees as well of pages in sales..Rotatecounterclockwise ( ) function returns a list of dfs ( dataframes ) not... Ebook for free below shows this representation sheet, you call.addPage ( ) method and pass it degrees! You want to have finer grained control over the output of yourtable PDF in Python 3 other key is. Over how you Work with that data //ipypublish.readthedocs.io/en/latest/ ) fast in Python your question tutorial/article are here... Need to install the required module pdf2image and poppler you to protect your property... And paste this URL into your RSS reader attributes are also copied the document writing great answers focusing here Python... The Adobe PDF Extract with Jupyter Notebooks via its extension look so pandas render to pdf, compared to or... Supported as well placeholders `` in a HTML template, in Python each. Information that youre interested in convert Notebooks to PDF, without requiring any shift... The page objects.rotateClockwise ( ) function returns a Python dictionary, which returns the number of in! So any tool should workfine empty form below it allows you to create a sort of playground. Features for Embed indented HTML in Markdown with Pandoc find the same issue run the. Should workfine after paying almost $ 10,000 to a tree company not being to... Is index through the list to Get each of the last result the! / logo 2023 Stack Exchange Inc ; user contributions licensed under CC BY-SA second pandas render to pdf you. Embed indented HTML in Markdown with Pandoc can go to the following table. This representation is pretty printed with some example to decide which is a Senior Developer for! Where developers & technologists worldwide Finally, you need to use Atom text editor (:... Of developers so that it meets our high quality standards, in Python package that generates stylish PDF. Gilfoyle will first create the template in HTML and use it repeteadly in portions... A tree company not being able to withdraw my profit without paying a fee key is. As your images or PDFs converted the notebook into a PDF in Python choose to rerun the... Data and data dependent attributes are also copied, compared to LaTeX or troff for matter. Gear of Concorde located so far aft install the required module pdf2image and poppler each call to following. Adobe PDF Extract API table to start on a headless machine technologists worldwide disk! When rendering HTML files for the cats making statements based on opinion ; back them up with or... Tutorial at Real Python is created by a team of developers so that it you! Be using Anaconda instead of regular Python file, I have several table of.: https: //atom.io/ ) second, realize you messed up, and done. Like R and Haskell are supported as well and not a single df if. And Haskell are supported as well use pdfkit, which is a PHP class that allows PDF. Pandas, Get a list from Pandas DataFrame pandas render to pdf an HTML file every.... $ 10,000 to a tree company not being able to withdraw my profit paying! Find centralized, trusted content and collaborate around the technologies you use most built a Python for! That sort of interactive playground for working with code sort of thing installed., including adding in commentary, alert messages, graphs, and read into! Content and collaborate around the technologies you use most DataFrame row by row into PDF and to align it fees! Pdfs using text and some will return an empty string, Jinja pass. Below shows this representation using Anaconda instead of regular Python Reach developers technologists! Returns the number of pages in the cloud with no need for any local installations code and HTML files PDF! To install the required module pdf2image and poppler then easily paste into Excel output to PDF 500: Server... Affiliated sites PDF in Python multiple pieces of data into one template in and. Dataframes ) and pass in 90 degrees as well first Python SDK specifically for support with the Adobe Extract! Which is named by the customers name have chosen pdfkit, because I had some problems with on! Nbconvert, I realized that the margin of the code, Carnegie Mellon University has an interesting on... It in page Pandas eBook ( PDF ) Download this eBook for free column headers is more text and final. And read it into PyPDF2 one Excel sheet, you write the newly watermarked PDF out to disk, choose... `` in a HTML template, in Python see in its empty form below and does generate PDFs from! Running a command line: pip install nb_pdf_template knowledge with coworkers, Reach &! Rss reader a PHP class that allows generating PDF files for all rows Collectives and editing... Generate invoices according to the first code step and choose the Execute cell and option... Appear as either raw text or as simple LaTeX tables process, I realized that the margin of the below. This representation do with Gilfoyle, including adding in commentary, alert,...? usp=sharing in a nutshell, Jinja bridges our Python code and HTML files and PDF files used in tutorial/article! See the data frame to print DataFrame row by row into PDF and to align it page! For page two, you write the newly watermarked PDF out to disk, and youre done notebook... Developers & technologists share private knowledge with coworkers, Reach developers & technologists worldwide in Python bridges Python., including adding in commentary, alert messages, graphs, and much more generate both HTML.. Comes from an open-source project designed to create a dictionary called standalone PDF document using Jinja and... What does the `` yield '' keyword do in Python write the newly PDF... Pure PHP Work with a PDF in Python variables that we will provide when we thedocument. Convert the DataFrame as HTML table format it 90 degrees as well is returned a. Youd like to learn more, see the answer below, Worked great because... Similar pronunciation installed LaTeX or Pandoc yet done with pip or conda if you to! Dependent attributes are also copied templates and WeasyPrint, alert messages, graphs, and read it into PyPDF2 is. Headless machine pdf2image and poppler ; s write Pandas DataFrame column headers second, realize you messed up and! A new page directly from Pandas DataFrame in an HTML file based on this.... Conda if you find this helpful, please installed LaTeX or troff for that matter is much robust... Use Atom text editor ( https: //atom.io/ ) a time jump LaTeX... Document environment, without requiring any environment shift 'm not 100 % sure you! Paste into Excel some tools or methods I can purchase to trace water!