{"id":20982117,"url":"https://github.com/fenphoenix/reasonablertf","last_synced_at":"2026-02-02T06:09:57.078Z","repository":{"id":239506247,"uuid":"799710843","full_name":"FenPhoenix/ReasonableRTF","owner":"FenPhoenix","description":"Convert RTF to plain text 100x faster than RichTextBox.","archived":false,"fork":false,"pushed_at":"2024-07-07T05:59:40.000Z","size":30885,"stargazers_count":3,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-27T15:03:58.861Z","etag":null,"topics":["rich-text","rich-text-convertor","rich-text-format","richtext","richtextbox","richtextformat","richtextparse","rtf","rtf-converter","rtf-documents","rtf-files","rtf-to-text"],"latest_commit_sha":null,"homepage":"","language":"Rich Text Format","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/FenPhoenix.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"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}},"created_at":"2024-05-12T23:46:46.000Z","updated_at":"2025-04-28T11:12:45.000Z","dependencies_parsed_at":"2024-07-07T06:55:33.245Z","dependency_job_id":null,"html_url":"https://github.com/FenPhoenix/ReasonableRTF","commit_stats":null,"previous_names":["fenphoenix/reasonablertf"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/FenPhoenix/ReasonableRTF","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FenPhoenix%2FReasonableRTF","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FenPhoenix%2FReasonableRTF/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FenPhoenix%2FReasonableRTF/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FenPhoenix%2FReasonableRTF/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/FenPhoenix","download_url":"https://codeload.github.com/FenPhoenix/ReasonableRTF/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FenPhoenix%2FReasonableRTF/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29006774,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-02T04:25:24.522Z","status":"ssl_error","status_checked_at":"2026-02-02T04:24:51.069Z","response_time":58,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["rich-text","rich-text-convertor","rich-text-format","richtext","richtextbox","richtextformat","richtextparse","rtf","rtf-converter","rtf-documents","rtf-files","rtf-to-text"],"created_at":"2024-11-19T05:44:30.837Z","updated_at":"2026-02-02T06:09:57.053Z","avatar_url":"https://github.com/FenPhoenix.png","language":"Rich Text Format","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ReasonableRTF: Parsing gigabytes (sometimes) of RTF per second\n\nSo you're using C# and you want to convert some RTF to text. The solution is easy: You reach for the WinForms RichTextBox. Load your RTF in, access the Text property, and presto, it's all there. Mostly. Except smiley faces become the letter J. And sometimes non-ASCII text becomes gibberish even though old versions used to display it fine. And it's really, really slow. Also it [leaks native memory](https://github.com/FenPhoenix/ReasonableRTF/blob/a8077dc484e8568a4aec5115320dc7c0babeae4f/ReasonableRTF_TestApp/Data/RTF_Test_Set_Full/TDP20AC_An_Enigmatic_Treasure___TDP20AC_An_Enigmatic_Treasure_With_A_Recondite_Discovery.rtf).\n\nYou try the WPF version. Wait, did that one file take _twenty-five seconds_ to load just because it had a 240x180 image in it?!\n\nForget it! You need something better. You need...\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://github.com/FenPhoenix/AngelLoader/blob/master/docs/images/reasonable_rtf/perf_bar_charts3.png\" /\u003e\u003c/p\u003e\n\n... the converter that's consistently over a hundred times faster than RichTextBox. 1.48 megs a second? That's unreasonable. 214 megs a second is slightly less unreasonable! That's like step 2½ out of 8 in *[Context is Everything](https://vimeo.com/644068002)*!\n\n## Features\n\n- Wingdings 1, 2 and 3, Webdings, Symbol, and Zapf Dingbats all converted to equivalent Unicode characters.  \n- Non-ASCII text correctly converted where RichTextBox can't.  \n- Got huge files with tons of images? No problem. We blaze past image data so fast it may as well not exist.  \n\n## Benchmarks\n\n```\n\nBenchmarkDotNet v0.13.12, Windows 10 (10.0.19045.3448/22H2/2022Update)\nAMD Ryzen 9 3950X, 1 CPU, 32 logical and 16 physical cores\n.NET SDK 8.0.204\n  [Host]     : .NET 8.0.4 (8.0.424.16909), X64 RyuJIT AVX2\n  DefaultJob : .NET 8.0.4 (8.0.424.16909), X64 RyuJIT AVX2\n\n\n```\n| Method                   | Mean        | Error    | StdDev   | Performance |\n|------------------------- |------------:|---------:|---------:|-------------|\n| RichTextBox_FullSet      | 5,556.20 ms | 8.693 ms | 8.132 ms | 1x          |\n| ReasonableRTF_FullSet    |    42.31 ms | 0.188 ms | 0.176 ms | 131x        |\n| RichTextBox_NoImageSet   | 2,389.84 ms | 3.342 ms | 3.126 ms | 1x          |\n| ReasonableRTF_NoImageSet |    16.52 ms | 0.023 ms | 0.019 ms | 145x        |\n\n## Supported\n\n- All basic plain text, hex-encoded chars, Unicode-encoded chars\n- Symbol fonts (the abovementioned ones) converted to Unicode equivalents\n- Characters specified as \"SYMBOL\" field instructions\n- Undocumented use of the \\langN keyword to [specify character encoding](https://therealfenphoenix.wordpress.com/2024/01/05/rtf-character-encoding-who-needs-a-spec-anyway/) - old versions of RichTextBox used to support this\n\n## Partially supported\n\n- Tables: Cells and rows have spaces between them, but not much functionality beyond that.\n- Lists: Numbers and bullets show up (that's better than RichTextBox most of the time), but indentation usually doesn't.\n\n## Not currently supported\n\n- Footnotes\n- \"HYPERLINK\" field instruction value\n- Math objects\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffenphoenix%2Freasonablertf","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffenphoenix%2Freasonablertf","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffenphoenix%2Freasonablertf/lists"}