{"id":31068426,"url":"https://github.com/robertfmath/create-intro-cards","last_synced_at":"2026-05-02T23:42:16.940Z","repository":{"id":280057505,"uuid":"940870607","full_name":"robertfmath/create-intro-cards","owner":"robertfmath","description":"A Python package that converts a dataset of individuals' names, photos, and custom attributes into a PDF of “intro cards” that describe each individual—all with a single function call.","archived":false,"fork":false,"pushed_at":"2025-03-14T03:37:21.000Z","size":19220,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-09-05T14:57:38.730Z","etag":null,"topics":["automation","graphics","jupyter-notebook","matplotlib","pandas","pdf","pdf-generation","python"],"latest_commit_sha":null,"homepage":"https://robertfmath.github.io/create-intro-cards/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/robertfmath.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-03-01T00:29:40.000Z","updated_at":"2025-03-17T18:45:43.000Z","dependencies_parsed_at":"2025-03-08T01:20:36.315Z","dependency_job_id":null,"html_url":"https://github.com/robertfmath/create-intro-cards","commit_stats":null,"previous_names":["robertfmath/create-intro-cards"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/robertfmath/create-intro-cards","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertfmath%2Fcreate-intro-cards","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertfmath%2Fcreate-intro-cards/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertfmath%2Fcreate-intro-cards/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertfmath%2Fcreate-intro-cards/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/robertfmath","download_url":"https://codeload.github.com/robertfmath/create-intro-cards/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertfmath%2Fcreate-intro-cards/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":275320689,"owners_count":25443953,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-15T02:00:09.272Z","response_time":75,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["automation","graphics","jupyter-notebook","matplotlib","pandas","pdf","pdf-generation","python"],"created_at":"2025-09-15T21:10:12.926Z","updated_at":"2025-09-15T21:10:14.861Z","avatar_url":"https://github.com/robertfmath.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ![logo](https://github.com/robertfmath/create-intro-cards/blob/main/docs/source/_static/images/logo_create-intro-cards.svg?raw=true)\n\n\u003cdiv align=\"center\"\u003e\n\n[![CI Status](https://github.com/robertfmath/create-intro-cards/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/robertfmath/create-intro-cards/actions/workflows/ci.yml)\n[![PyPI Latest Release](https://img.shields.io/pypi/v/create-intro-cards.svg)](https://pypi.org/project/create-intro-cards/)\n[![License](https://img.shields.io/badge/License-BSD_3--Clause-f72d23.svg)](https://github.com/robertfmath/create-intro-cards/blob/main/LICENSE.txt)\n[![Documentation](https://img.shields.io/badge/Documentation-e3e300)](https://robertfmath.github.io/create-intro-cards)\n\n\u003c/div\u003e\n\n`create-intro-cards` is a Python package that converts a dataset of individuals' names, photos, and custom attributes into a PDF of “intro cards” that describe each individual—all with a single function call. Each intro card displays a person's name, a photo, and a series of attributes based on custom columns in the dataset.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/robertfmath/create-intro-cards/blob/main/docs/source/_static/images/example_output_page.png?raw=true\" alt=\"An example of one page of output in the PDF\" style=\"max-width: 100%; height: auto;\"\u003e\n\u003c/p\u003e\n\nThe input is a Pandas DataFrame, where rows represent individuals and columns their attributes. Columns containing individuals' first names, last names, and paths to photos are required, but the content (and number) of other columns can be freely customized.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/robertfmath/create-intro-cards/blob/main/docs/source/_static/images/example_people_data.png?raw=true\" alt=\"An example of the structure of the input Pandas DataFrame\" style=\"max-width: 100%; height: auto;\"\u003e\n\u003c/p\u003e\n\nThese custom columns are used to generate a series of \"column name: attribute value\" pairings (e.g., \"Hometown: New York, NY\") for each individual, which appear below their name on their intro card. If an individual doesn't have a value listed for any custom column, that column's \"column name: attribute value\" pairing is omitted from their card.\n\nThe generated PDF contains all individuals' intro cards, arranged four per page. It's a simple way to transform a dataset of individuals' attributes\u0026mdash;collected from sources such as surveys\u0026mdash;into a fun, easily shareable visual summary.\n\n## Dependencies\n\n- NumPy\n- Pandas\n- Matplotlib\n- Pillow\n- ipykernel\n\nFor a full list of dependencies\u0026mdash;both direct and transitive\u0026mdash;please refer to the provided `requirements.txt` file. The `requirements-dev.txt` file provides additional dependencies for development\u0026mdash;namely Ruff, docformatter, Sphinx, and pypdf.\n\n## Installation\n\nWith Python 3.11+ installed, run:\n\n```bash\npip install create-intro-cards\n```\n\n## Usage\n\nThe entry point of the package is the function `make_pdf`, which generates a PDF containing intro cards for all the individuals in the input Pandas DataFrame. The function is passed this DataFrame; the names of the columns in the DataFrame that house first names, last names, and paths to individuals' photos; a path to a default photo to use in the event an individual doesn't have a photo path listed; and a path to the directory in which to store the output.\n\n```python\nfrom create_intro_cards import make_pdf\nimport pandas as pd\n\npeople_data = pd.read_csv(\"path/to/people/data.csv\")\n\nmake_pdf(\n    people_data,\n    \"First Name\",\n    \"Last Name\",\n    \"Photo Path\",\n    \"path/to/default/photo.png\",\n    \"path/to/output/dir\"\n)\n```\n\nThe output directory will contain the PDF, PNG images of each page of the PDF, and a log file indicating the names and photo availability statuses of all individuals who had an intro card created. The entire process typically takes only a few minutes or less, depending on the number of individuals, number of custom attributes, photo sizes, and hardware.\n\n`make_pdf` also provides a host of optional keyword arguments to tweak the default layout of the intro cards, from font sizes and text placement to photo boundaries and more.\n\n```python\nmake_pdf(\n    people_data,\n    \"First Name\",\n    \"Last Name\",\n    \"Photo Path\",\n    \"path/to/default/photo.png\",\n    \"path/to/output/dir\",\n    figure_size=(20, 10),\n    name_x_coord=0.40,\n    desc_font_size=14,\n    photo_axes_bounds=(0.01, 0.02, 0.2, 0.92)\n)\n```\n\nTo see how the different keyword arguments affect the appearance of the intro cards, a utility function called `make_pdf_preview` is provided. This function, which must be run in a Jupyter environment, displays a mock-up of the first page of the PDF that would otherwise be created if `make_pdf` were run with the same arguments (minus `path_to_output_dir`). Because it processes only a subset of the dataset, it runs significantly faster than `make_pdf` and is ideal for prototyping.\n\n```python\nmake_pdf_preview(\n    people_data,\n    \"First Name\",\n    \"Last Name\",\n    \"Photo Path\",\n    \"path/to/default/photo.png\",\n    figure_size=(20, 10),\n    name_x_coord=0.40,\n    desc_font_size=14,\n    photo_axes_bounds=(0.01, 0.02, 0.2, 0.92)\n)\n```\n\n## Documentation\n\nFor full documentation, please see [here](https://robertfmath.github.io/create-intro-cards).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frobertfmath%2Fcreate-intro-cards","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frobertfmath%2Fcreate-intro-cards","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frobertfmath%2Fcreate-intro-cards/lists"}