{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Блоги: заметки с тегом pdf",
    "_rss_description": "Автоматически собираемая лента заметок, написанных в блогах на Эгее",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": false,
    "_itunes_explicit": "no",
    "home_page_url": "https:\/\/blogengine.me\/blogs\/tags\/pdf\/",
    "feed_url": "https:\/\/blogengine.me\/blogs\/tags\/pdf\/json\/",
    "icon": false,
    "authors": [
        {
            "name": "Илья Бирман",
            "url": "https:\/\/blogengine.me\/blogs\/",
            "avatar": false
        }
    ],
    "items": [
        {
            "id": "136253",
            "url": "https:\/\/bolknote.ru\/all\/tekst-v-pdf\/",
            "title": "Текст в PDF",
            "content_html": "<p>Попалась задача — преобразовать огромный (полтора миллиона строк) тестовый файл в кодировке <i>UTF-8<\/i> в <i>PDF<\/i>. Не ожидал с ней каких-то сложностей, но оказалось, что это не так-то просто.<\/p>\n<p>Проблемы две — объём текста и кодировка. Графические утилиты на таком объёме умирают, а с кодировкой <i>UTF<\/i>, как оказалось, работают далеко не все утилиты командной строки.<\/p>\n<p>Перебрал несколько, с задачей справилась только утилита <a href=\"https:\/\/github.com\/dov\/paps\"><tt>paps<\/tt><\/a>. Хочу себе это записать, чтобы не пришлось заниматься перебором, если в будущем столкнусь с такой же задачей.<\/p>\n<p>Ещё в моей задаче первый лист должен быть пустым и на каждом листе должен быть номер страницы. В результате строка запуска выглядит так:<\/p>\n<pre class=\"e2-text-code\"><code class=\"bash\">paps --footer --footer-center={page_idx} &lt;(printf \\\\f;cat listing.txt) -o listing.pdf<\/code><\/pre><p>Небольшое примечание: при помощи <tt>printf<\/tt> я вставляю текстовый символ разрыва страницы (<tt>\\f<\/tt>), чтобы первая страница оказалась пустой.<\/p>\n",
            "date_published": "2025-06-09T20:53:48+05:00",
            "date_modified": "2025-06-09T20:53:34+05:00",
            "tags": [
                "pdf",
                "программирование"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Mon, 09 Jun 2025 20:53:48 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "136253",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "133656",
            "url": "https:\/\/bolknote.ru\/all\/doompdf\/",
            "title": "DoomPDF",
            "content_html": "<p>Четверть века назад я <a href=\"https:\/\/bolknote.ru\/all\/2912\/\">писал<\/a> о «Думе», запущенном на фотоаппарате. Тогда меня это очень удивило и восхитило. Но с тех пор много времени утекло, «Дум» на чём только не запускали и это удивляло всё меньше. Не помню когда в последний раз, пробегая глазами подобную новость, я думал хотя бы «надо же».<\/p>\n<p>Но <a href=\"https:\/\/github.com\/ading2210\/doompdf\">«Дум», запущенный внутри <i>PDF<\/i>-файла<\/a>, меня чертовски удивил! Не то, чтобы я не знал, что это возможно — в конце-концов, <i>PDF<\/i> сам по себе программный файл (там внутри язык программирования <a href=\"https:\/\/bolknote.ru\/all\/99-butylok-postscript\/\"><i>PostScript<\/i><\/a>), но я как-то даже и не думал о такой возможности.<\/p>\n<p>Вы попробуйте, работает даже внутри браузера!<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/bolknote.ru\/pictures\/2025.01.14@2x.jpg\" width=\"1000\" height=\"804\" alt=\"\" \/>\n<\/div>\n<p>Правда, в данном случае <i>PostScript<\/i> почти не использовался. Всё дело в том, что внутри <i>PDF<\/i> есть возможность использовать ещё и <i>JavaScript<\/i>. Причём, в случае <i>Adobe Acrobat<\/i>, доступны, например, такие, сомнительные для <i>PDF<\/i> возможности, как 3Д-графика или <i>HTTP<\/i>-запросы.<\/p>\n<p>В просмотрщиках <i>PDF<\/i> современных браузеров поддержка <i>JavaScript<\/i> тоже есть, правда она сильно ограничена по функционалу. Тем не менее, для запуска «Дума» хватило и этого.<\/p>\n<p>Чтобы запустить «Дум» внутри <i>PDF<\/i>, использовался старый <i>Emscripten<\/i>, который компилирует код на Си в <tt>asm.js<\/tt> (это такое подмножество <i>JavaScript<\/i>), вместо более привычного <i>WebAssembly<\/i>. Но этого недостаточно — нужно было придумать, как принимать ввод с клавиатуры и отображать графику. Это оказалось не таким уж и простым. К счастью, в браузерах <i>PDF<\/i>-движки поддерживают текстовые поля и кнопки, что и было использовано для ввода.<\/p>\n<p>С графикой возникли следующие проблемы. Речь идет о разрешении 320×200 пикселей, что означает, что если бы использовались обычные текстовые поля для каждого пикселя, пришлось бы обновлять тысячи полей на каждый кадр. В общем, так бы вы никогда не поиграли в «Дум». Вместо этого автор решил использовать одно текстовое поле на каждую строку экрана и обновлять их с помощью <i>ASCII<\/i>-символов. Простой, но довольно эффективный способ, который дает в итоге монохромную картинку с шестью цветами. Конечно, такой способ тоже не даёт плавного рендера картинки, но играть всё равно довольно комфортно!<\/p>\n",
            "date_published": "2025-01-14T11:00:38+05:00",
            "date_modified": "2025-01-14T11:28:36+05:00",
            "tags": [
                "javascript",
                "pdf"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Tue, 14 Jan 2025 11:00:38 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "133656",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        }
    ],
    "_e2_version": 4079,
    "_e2_ua_string": "Aegea 11.0 (v4079e)"
}