{"id":39589807,"url":"https://github.com/jurczewski/private-pdf-converter","last_synced_at":"2026-07-04T15:00:36.403Z","repository":{"id":225417517,"uuid":"758886110","full_name":"jurczewski/private-pdf-converter","owner":"jurczewski","description":"Private PDF Converter is a simple, secure offline tool for quickly turning your image files (like PNGs) into a single PDF - no internet required. Your files stay private on your device.","archived":false,"fork":false,"pushed_at":"2026-07-04T13:39:00.000Z","size":249,"stargazers_count":27,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-07-04T14:14:16.719Z","etag":null,"topics":["100commitow","100commits","cli","cocona","dotnet","dotnet-tool","merge-pdf","merge-pdf-images","pdf","pdf-converter","pdf-encryptor","pdf-merge","privacy","privacy-protection","private","split-pdf","tool","watermark"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jurczewski.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"buy_me_a_coffee":"jurczewski","custom":["paypal.me/BJurczewski"]}},"created_at":"2024-02-17T11:19:21.000Z","updated_at":"2026-07-04T13:23:16.000Z","dependencies_parsed_at":"2024-04-01T19:31:28.600Z","dependency_job_id":"b2d8755a-a009-43d1-a7d9-66ea21fd3bbf","html_url":"https://github.com/jurczewski/private-pdf-converter","commit_stats":null,"previous_names":["jurczewski/private-pdf-converter"],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/jurczewski/private-pdf-converter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jurczewski%2Fprivate-pdf-converter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jurczewski%2Fprivate-pdf-converter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jurczewski%2Fprivate-pdf-converter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jurczewski%2Fprivate-pdf-converter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jurczewski","download_url":"https://codeload.github.com/jurczewski/private-pdf-converter/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jurczewski%2Fprivate-pdf-converter/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35125718,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-04T02:00:05.987Z","response_time":113,"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":["100commitow","100commits","cli","cocona","dotnet","dotnet-tool","merge-pdf","merge-pdf-images","pdf","pdf-converter","pdf-encryptor","pdf-merge","privacy","privacy-protection","private","split-pdf","tool","watermark"],"created_at":"2026-01-18T07:42:49.983Z","updated_at":"2026-07-04T15:00:36.398Z","avatar_url":"https://github.com/jurczewski.png","language":"C#","funding_links":["https://buymeacoffee.com/jurczewski","paypal.me/BJurczewski","https://www.buymeacoffee.com/jurczewski"],"categories":[],"sub_categories":[],"readme":"# 🔎 PrivatePdfConverter\n\n[![Build](https://img.shields.io/github/actions/workflow/status/jurczewski/private-pdf-converter/build.yaml?branch=master)](https://github.com/jurczewski/private-pdf-converter/actions/workflows/build.yaml)\n[![NuGet version (PrivatePdfConverter)](https://img.shields.io/nuget/v/PrivatePdfConverter.svg)](https://www.nuget.org/packages/PrivatePdfConverter/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)\n[![Quality Gate](https://sonarcloud.io/api/project_badges/measure?project=jurczewski_private-pdf-converter\u0026metric=alert_status)](https://sonarcloud.io/summary/new_code?id=jurczewski_private-pdf-converter)\n[![Linkedin](https://img.shields.io/badge/Linkedin-0882bd?logo=linkedin)](https://www.linkedin.com/in/jurczewski/)\n[![100 - Commitów](https://img.shields.io/badge/100-Commitów-2ea44f)](https://100commitow.pl/)\n\n[![Buy Me a Coffee](https://img.shields.io/badge/Buy_Me_A_Coffee-FFDD00?style=for-the-badge\u0026logo=buy-me-a-coffee\u0026logoColor=black)](https://www.buymeacoffee.com/jurczewski)\n\n###### ⭐ - The star motivates me a lot\n\n---\n\n![Logo](https://raw.githubusercontent.com/jurczewski/private-pdf-converter/master/assets/logo-200x200.jpeg)\n\n## ✒️ Description\n\nPrivate PDF Converter is a secure, offline tool that quickly converts image files (like PNGs) into PDFs without needing an internet connection - keeping your data private on your device.\n\nIt supports converting single images or entire directories into single PDF files. You can also merge multiple PDFs from a folder into one file, add password encryption for security, and watermark PDFs with a logo image adjustable by size, position, and opacity. The terminal interface is simple and efficient, making complex tasks easy to handle with just a single command.\n\nCheck the roadmap below for upcoming features like PDF splitting.\n\n## 🎬 Real Life Scenario\n\n- You receive an addendum from work on paper and scan it into separate files.\n- You don't want to send your personal data to the cloud, nor do you want to install something big.\n\n**The solution is this CLI program** - simply enter a command along with the path to the folder containing the scans, and after a moment, you'll have the **combined images in a single PDF**.\n\nIn three words:\n\n### ✨ **Small, offline, and convenient!**\n\n## ⚡ Install\n\n### Option 1: .NET Tool (Recommended)\n\nJust type to install:\n\n```ps1\ndotnet tool install --global PrivatePdfConverter\n```\n\n### Option 2: Standalone Executable\n\nDownload the latest release for your platform from the [Releases page](https://github.com/jurczewski/private-pdf-converter/releases/latest):\n\n- Windows (x64/ARM64): `PrivatePdfConverter-win-x64.exe` or `PrivatePdfConverter-win-arm64.exe`\n- Linux (x64/ARM64): `PrivatePdfConverter-linux-x64` or `PrivatePdfConverter-linux-arm64`\n- macOS (x64/ARM64): `PrivatePdfConverter-osx-x64` or `PrivatePdfConverter-osx-arm64`\n\n## 💻 Usage\n\n**For .NET Tool (Option 1)** - use `ppc` command:\n\n```ps1\nppc dir --path \"D:\\dir-with-images\"\n```\n\n**For Standalone Executable (Option 2)** - use `.\\executable-name` in terminal:\n\n```ps1\n.\\PrivatePdfConverter-win-x64.exe dir --path \"D:\\dir-with-images\"\n```\n\nCheck version:\n\n```ps1\nppc --version\n```\n\nExample of logo command:\n\n```ps1\nppc logo --path \"D:\\1.pdf\" --logo-path \"D:\\logo.png\" --position \"bottom-left\" --scale 25 --opacity 50 --output \"newpdf\"\n```\n\n## 📐 Arguments\n\n| Argument  | Description                                                     | Options                          | Optional options                                                                                                          |\n|-----------|-----------------------------------------------------------------|----------------------------------|---------------------------------------------------------------------------------------------------------------------------|\n| `dir`     | Converts all images inside a directory to a single PDF file.    | `path` - path to directory       | `output` - PDF output name                                                                                                |\n|           | See below supported file extensions.                            |                                  |                                                                                                                           |\n| `img`     | Converts a single image to a single PDF file.                   | `path` - path to image           | `output` - PDF output name                                                                                                |\n|           | See below supported file extensions.                            |                                  |                                                                                                                           |\n| `merge`   | Merges all PDF files inside a directory into a single PDF file. | `path` - path to directory       | `output` - PDF output name                                                                                                |\n| `encrypt` | Encrypts PDF with a password.                                   | `path` - path to a PDF file      | `output` - PDF output name                                                                                                |\n|           |                                                                 | `password` - encryption password |                                                                                                                           |\n| `logo`    | Add image (logo) as a watermark to every page of PDF.           | `path` - path to a PDF file      | `output` - PDF output name                                                                                                |\n|           |                                                                 | `logo-path` - path to logo image | `scale` - Specifies the scale of the image in percentage (e.g., 25 for 25%, 150 for 150%). Default value: 100.            |\n|           |                                                                 |                                  | `opacity` - Specifies the opacity of the image in percentage (e.g., 25 for 25%, 0 for 0% - invisible) Default value: 100. |\n|           |                                                                 |                                  | `position` - Positions of logo. One of four values are accepted: `top-left`, `top-right`, `bottom-left`, `bottom-right`.  |\n| `ext`     | Lists all valid image extensions.                               |                                  |                                                                                                                           |\n\nFor all commands, default export .pdf file name is `output.pdf`.\n\n### 📌 Supported file extensions\n\nType `ext` argument to list all the valid image extensions:\n\n- .jpg\n- .jpeg\n- .bmp\n- .gif\n- .png\n- .tif\n- .tiff\n- .webp\n\n## 🗺️ Features roadmap\n\n- [x] convert dir to pdf (`dir`)\n- [x] create a PDF file from a single image (`img`)\n- [x] multiple image extensions support\n- [x] merge pdf (`merge`)\n- [x] encrypt PDF with password (`encrypt`)\n- [x] list all valid image extensions (`ext`)\n- [x] add watermark/logo to your PDF (`logo`)\n- [x] auto-detect output filename from source file\n- [ ] split PDF (`split`)\n- [ ] convert PDF to multiple images (`???`)\n- [ ] better TUI (menu)\n- [ ] set default export dir\n\n## 🎯 Others\n\n- [x] readme\n- [x] features roadmap\n- [x] editorconfig\n- [x] logging\n- [x] license\n- [x] pipeline\n- [x] better readme\n- [x] cool dynamic labels (version, build, license, buymecoffe)\n- [x] integration tests\n- [x] manual CD pipeline for NuGet releases\n- [x] exe release\n- [ ] winget/chocolatey\n\n## 🏅 Competition 100commitow\n\nThe project is part of the competition [100 commitow](https://100commitow.pl).\n\n## ⌨️ Development\n\nIf you want to contribute, please take a look at the [Roadmap](#️-features-roadmap) or propose your own ideas.\n\nPlease create a **Pull Request** with a solution if you are eager to help. Keep in mind the structure of a solution. If you are going to create a new command, make sure to do it in the [Commands](./src/PrivatePdfConverter/Commands/) directory.\n\n### Local\n\nBuild and run using [.NET 10.0](https://dotnet.microsoft.com/en-us/download):\n\n```ps1\ndotnet build\n```\n\n```ps1\n.\\PrivatePdfConverter.exe dir --path \"D:\\dir-with-images\"\n```\n\n### 🔗 Dependencies\n\nBased on CLI framework [ConsoleAppFramework](https://github.com/Cysharp/ConsoleAppFramework). Zero external dependencies, zero reflection, high performance and fastest startup time.\n\n### 📈 Sonar statistics\n\n[![Quality Gate](https://sonarcloud.io/api/project_badges/measure?project=jurczewski_private-pdf-converter\u0026metric=alert_status)](https://sonarcloud.io/summary/new_code?id=jurczewski_private-pdf-converter)\n[![Bugs](https://sonarcloud.io/api/project_badges/measure?project=jurczewski_private-pdf-converter\u0026metric=bugs)](https://sonarcloud.io/summary/new_code?id=jurczewski_private-pdf-converter)\n[![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=jurczewski_private-pdf-converter\u0026metric=code_smells)](https://sonarcloud.io/summary/new_code?id=jurczewski_private-pdf-converter)\n[![Duplicated Lines (%)](https://sonarcloud.io/api/project_badges/measure?project=jurczewski_private-pdf-converter\u0026metric=duplicated_lines_density)](https://sonarcloud.io/summary/new_code?id=jurczewski_private-pdf-converter)\n[![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=jurczewski_private-pdf-converter\u0026metric=ncloc)](https://sonarcloud.io/summary/new_code?id=jurczewski_private-pdf-converter)\n[![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=jurczewski_private-pdf-converter\u0026metric=reliability_rating)](https://sonarcloud.io/summary/new_code?id=jurczewski_private-pdf-converter)\n[![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=jurczewski_private-pdf-converter\u0026metric=security_rating)](https://sonarcloud.io/summary/new_code?id=jurczewski_private-pdf-converter)\n[![Technical Debt](https://sonarcloud.io/api/project_badges/measure?project=jurczewski_private-pdf-converter\u0026metric=sqale_index)](https://sonarcloud.io/summary/new_code?id=jurczewski_private-pdf-converter)\n[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=jurczewski_private-pdf-converter\u0026metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=jurczewski_private-pdf-converter)\n[![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=jurczewski_private-pdf-converter\u0026metric=vulnerabilities)](https://sonarcloud.io/summary/new_code?id=jurczewski_private-pdf-converter)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjurczewski%2Fprivate-pdf-converter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjurczewski%2Fprivate-pdf-converter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjurczewski%2Fprivate-pdf-converter/lists"}