{"id":14048,"date":"2026-05-22T11:32:50","date_gmt":"2026-05-22T02:32:50","guid":{"rendered":"https:\/\/rakkokeyword.com\/techo\/?p=14048"},"modified":"2026-05-22T11:32:50","modified_gmt":"2026-05-22T02:32:50","slug":"tool-pdf-trim","status":"publish","type":"post","link":"https:\/\/rakkokeyword.com\/techo\/tool-pdf-trim\/","title":{"rendered":"PDF\u30c8\u30ea\u30df\u30f3\u30b0\u30c4\u30fc\u30eb"},"content":{"rendered":"\n<div id=\"pdftrim_app\">\n    <div id=\"pdftrim_upload_area\">\n        <p>\u3053\u3053\u306bPDF\u30d5\u30a1\u30a4\u30eb\u3092\u30c9\u30e9\u30c3\u30b0\uff06\u30c9\u30ed\u30c3\u30d7<\/p>\n        <p>\u307e\u305f\u306f<\/p>\n        <button id=\"pdftrim_select_btn\" type=\"button\">\u30d5\u30a1\u30a4\u30eb\u3092\u9078\u629e<\/button>\n        <input type=\"file\" id=\"pdftrim_file_input\" accept=\"application\/pdf\" style=\"display: none;\">\n        <p id=\"pdftrim_error_msg\" style=\"color: red; display: none;\"><\/p>\n    <\/div>\n\n    <div id=\"pdftrim_workspace\" style=\"display: none;\">\n        <div id=\"pdftrim_controls\">\n            \n            <div class=\"pdftrim_control_row pdftrim_filename_container\">\n                <span id=\"pdftrim_filename_display\"><\/span>\n                <button id=\"pdftrim_reselect_btn\" type=\"button\">\u5225\u306ePDF\u3092\u9078\u629e<\/button>\n            <\/div>\n\n            <div class=\"pdftrim_control_row pdftrim_settings_row\">\n                <div class=\"pdftrim_control_group pdftrim_zoom_group\">\n                    <p><strong>\u30ba\u30fc\u30e0\u8abf\u6574<\/strong><\/p>\n                    <div class=\"pdftrim_zoom_ui\">\n                        <input type=\"range\" id=\"pdftrim_zoom_slider\" min=\"0.5\" max=\"2.0\" step=\"0.1\" value=\"1.0\">\n                        <span id=\"pdftrim_zoom_val\">100%<\/span>\n                    <\/div>\n                <\/div>\n                \n                <div class=\"pdftrim_control_divider\"><\/div>\n                \n                <div class=\"pdftrim_control_group pdftrim_target_group\">\n                    <p><strong>\u30c8\u30ea\u30df\u30f3\u30b0\u5bfe\u8c61\u30da\u30fc\u30b8<\/strong><\/p>\n                    <label class=\"pdftrim_radio_label\"><input type=\"radio\" name=\"pdftrim_target\" value=\"all\" checked> \u5168\u30da\u30fc\u30b8\u306b\u9069\u7528<\/label><br>\n                    <label class=\"pdftrim_radio_label\" id=\"pdftrim_label_current\"><input type=\"radio\" name=\"pdftrim_target\" value=\"current\"> \u3053\u306e\u30da\u30fc\u30b8\u306e\u307f\uff08\u73fe\u5728\u306e\u30da\u30fc\u30b8\uff09<\/label>\n                    \n                    <p class=\"pdftrim_note\">\u203b \u300c\u3053\u306e\u30da\u30fc\u30b8\u306e\u307f\u300d\u306f<br>\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u6642\u306b\u73fe\u5728\u30da\u30fc\u30b8\u3060\u3051\u3078\u9069\u7528\u3055\u308c\u307e\u3059<\/p>\n                <\/div>\n            <\/div>\n\n            <div class=\"pdftrim_control_row pdftrim_reset_wrapper\">\n                <button id=\"pdftrim_reset_btn\" type=\"button\">\u21ba \u67a0\u3092\u30ea\u30bb\u30c3\u30c8<\/button>\n            <\/div>\n            \n        <\/div>\n\n        <div id=\"pdftrim_pagination_container\">\n            <button id=\"pdftrim_prev_page_btn\" type=\"button\" disabled>\uff1c \u524d\u3078<\/button>\n            <span id=\"pdftrim_page_indicator\">1 \/ 1<\/span>\n            <button id=\"pdftrim_next_page_btn\" type=\"button\" disabled>\u6b21\u3078 \uff1e<\/button>\n        <\/div>\n\n        <div id=\"pdftrim_preview_container\">\n            <div id=\"pdftrim_preview_wrapper\">\n                <canvas id=\"pdftrim_canvas\"><\/canvas>\n                \n                <div id=\"pdftrim_overlay_top\" class=\"pdftrim_overlay\"><\/div>\n                <div id=\"pdftrim_overlay_bottom\" class=\"pdftrim_overlay\"><\/div>\n                <div id=\"pdftrim_overlay_left\" class=\"pdftrim_overlay\"><\/div>\n                <div id=\"pdftrim_overlay_right\" class=\"pdftrim_overlay\"><\/div>\n\n                <div id=\"pdftrim_bounding_box\">\n                    <div class=\"pdftrim_handle pdftrim_nw\"><\/div>\n                    <div class=\"pdftrim_handle pdftrim_n\"><\/div>\n                    <div class=\"pdftrim_handle pdftrim_ne\"><\/div>\n                    <div class=\"pdftrim_handle pdftrim_w\"><\/div>\n                    <div class=\"pdftrim_handle pdftrim_e\"><\/div>\n                    <div class=\"pdftrim_handle pdftrim_sw\"><\/div>\n                    <div class=\"pdftrim_handle pdftrim_s\"><\/div>\n                    <div class=\"pdftrim_handle pdftrim_se\"><\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n\n        <div id=\"pdftrim_action_area\">\n            <button id=\"pdftrim_download_btn\" type=\"button\">\u2b07 \u30c8\u30ea\u30df\u30f3\u30b0\u3057\u3066\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9<\/button>\n        <\/div>\n    <\/div>\n<\/div>\n\n<style>\n\/* \u30c4\u30fc\u30eb\u5168\u4f53\uff08border\u306a\u3057\u3001width100%\u3001\u767d\u9ed2\u57fa\u8abf\uff09 *\/\n#pdftrim_app {\n    width: 100%;\n    font-family: sans-serif;\n    color: #333;\n    box-sizing: border-box;\n    padding-bottom: 60px;\n}\n\n#pdftrim_app * {\n    box-sizing: border-box;\n}\n\n\/* \u30d5\u30a1\u30a4\u30eb\u3092\u9078\u629e\u30dc\u30bf\u30f3\u306e\u8272 *\/\n#pdftrim_select_btn {\n    background-color: #13284B;\n    color: #fff;\n}\n\n#pdftrim_upload_area {\n    background-color: #f9f9f9;\n    border: 2px dashed #ccc;\n    text-align: center;\n    padding: 40px 20px;\n    margin-bottom: 20px;\n    transition: background-color 0.3s;\n}\n\n#pdftrim_upload_area.dragover {\n    background-color: #e0e0e0;\n}\n\n\/* \u64cd\u4f5c\u30d1\u30cd\u30eb\u5168\u4f53 *\/\n#pdftrim_controls {\n    display: flex;\n    flex-direction: column;\n    background-color: #f1f1f1;\n    padding: 24px;\n    margin-bottom: 16px;\n    border-radius: 8px;\n}\n\n.pdftrim_control_row {\n    display: flex;\n    width: 100%;\n}\n\n\/* \u30d5\u30a1\u30a4\u30eb\u540d\u8868\u793a\u30ab\u30fc\u30c9\u7528\u306e\u6a2a\u4e26\u3073\u30b3\u30f3\u30c6\u30ca *\/\n.pdftrim_filename_container {\n    background: #fff;\n    border: 1px solid #ddd;\n    padding: 10px 16px;\n    border-radius: 6px;\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    gap: 15px;\n    width: 100%;\n    margin: 0 0 24px 0;\n    box-shadow: 0 1px 3px rgba(0,0,0,0.05);\n}\n\n#pdftrim_filename_display {\n    font-size: 14px;\n    font-weight: bold;\n    color: #13284B;\n    margin: 0;\n    word-break: break-all;\n    flex-grow: 1;\n    min-width: 0;\n}\n\n\/* \u5225\u306ePDF\u3092\u9078\u629e\u30dc\u30bf\u30f3 *\/\n#pdftrim_reselect_btn {\n    background: #f7f7f7;\n    color: #444;\n    border: 1px solid #bbb;\n    height: 32px;\n    font-size: 12px;\n    padding: 0 12px;\n    border-radius: 5px;\n    font-weight: normal;\n    white-space: nowrap;\n    flex-shrink: 0;\n}\n\n#pdftrim_reselect_btn:hover {\n    background: #efefef;\n    opacity: 1;\n}\n\n\/* \u5de6\u53f3\u30ab\u30e9\u30e0\u6bd4\u7387 *\/\n.pdftrim_settings_row {\n    display: grid;\n    grid-template-columns: 0.8fr 1px 1.2fr;\n    gap: 40px;\n    align-items: start;\n    width: 100%;\n}\n\n.pdftrim_control_divider {\n    width: 1px;\n    background: #d8d8d8;\n    min-height: 90px;\n    margin: 0 auto;\n}\n\n.pdftrim_control_group {\n    min-width: 0;\n}\n\n\/* \u30ba\u30fc\u30e0\u5074\u3092\u53f3\u5bc4\u305b *\/\n.pdftrim_settings_row .pdftrim_control_group:first-child {\n    display: flex;\n    flex-direction: column;\n    align-items: flex-end;\n}\n\n.pdftrim_settings_row .pdftrim_control_group:first-child p {\n    width: 220px;\n}\n\n.pdftrim_control_group p {\n    margin: 0 0 10px 0;\n    font-size: 15px;\n}\n\n\/* \u88dc\u8db3\u8aac\u660e\u3092\u8584\u304f\u5c0f\u3055\u304f *\/\n.pdftrim_note {\n    font-size: 11px !important;\n    color: #888;\n    line-height: 1.5;\n    margin: 6px 0 0 0 !important;\n    max-width: 260px;\n}\n\n.pdftrim_zoom_ui {\n    width: 100%;\n    max-width: 220px;\n    display: flex;\n    align-items: center;\n    gap: 12px;\n}\n\n#pdftrim_zoom_slider {\n    flex-grow: 1;\n}\n\n.pdftrim_radio_label {\n    display: inline-block;\n    margin-bottom: 8px;\n    cursor: pointer;\n    transition: color 0.2s;\n}\n\n\/* \u73fe\u5728\u306e\u30da\u30fc\u30b8\u9078\u629e\u6642\u306e\u30e9\u30d9\u30eb\u88c5\u98fe *\/\n.pdftrim_mode_current_active {\n    color: #ff9800;\n    font-weight: bold;\n}\n\n\/* \u30dc\u30bf\u30f3\u57fa\u672c\u30b9\u30bf\u30a4\u30eb *\/\nbutton {\n    cursor: pointer;\n    transition: background-color 0.2s, color 0.2s, opacity 0.2s;\n    border: none;\n    padding: 0 20px;\n    height: 40px;\n    font-size: 16px;\n    border-radius: 4px;\n}\n\nbutton:hover {\n    opacity: 0.85;\n}\n\nbutton:disabled {\n    background-color: #666 !important;\n    color: #fff !important;\n    border-color: #666 !important;\n    cursor: not-allowed;\n}\n\n\/* \u30ea\u30bb\u30c3\u30c8\u30dc\u30bf\u30f3 *\/\n.pdftrim_reset_wrapper {\n    display: flex;\n    justify-content: center;\n    margin-top: 18px; \/* \u88dc\u8db3\u8aac\u660e\u3068\u306e\u9593\u306b\u547c\u5438\u611f\u3092\u6301\u305f\u305b\u308b *\/\n    width: 100%;\n}\n\n#pdftrim_reset_btn {\n    background: #eaf2ff;\n    border: 1px solid #8fb1e3;\n    color: #13284B;\n    height: 38px;\n    min-width: 150px;\n    font-size: 13px;\n    padding: 0 18px;\n    border-radius: 6px;\n    font-weight: 600;\n}\n\n#pdftrim_reset_btn:hover {\n    background: #dce9ff;\n    opacity: 1;\n}\n\n\/* \u30da\u30fc\u30b8\u5207\u308a\u66ff\u3048UI *\/\n#pdftrim_pagination_container {\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    gap: 15px;\n    margin-top: 28px;\n    margin-bottom: 16px;\n}\n\n#pdftrim_page_indicator {\n    font-size: 16px;\n    font-weight: bold;\n    color: #13284B;\n    min-width: 60px;\n    text-align: center;\n}\n\n#pdftrim_prev_page_btn, #pdftrim_next_page_btn {\n    background: #fff;\n    color: #13284B;\n    border: 1px solid #13284B;\n    height: 36px;\n    font-size: 14px;\n    padding: 0 16px;\n    border-radius: 6px;\n    font-weight: bold;\n}\n\n#pdftrim_prev_page_btn:not(:disabled):hover, #pdftrim_next_page_btn:not(:disabled):hover {\n    background: #eef4ff;\n}\n\n#pdftrim_prev_page_btn:disabled, #pdftrim_next_page_btn:disabled {\n    background-color: #f5f5f5 !important;\n    color: #aaa !important;\n    border-color: #ddd !important;\n    cursor: not-allowed;\n}\n\n\/* \u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u30dc\u30bf\u30f3 *\/\n#pdftrim_action_area {\n    text-align: center;\n    margin-top: 24px;\n    margin-bottom: 24px;\n    display: flex;\n    justify-content: center;\n}\n\n#pdftrim_download_btn {\n    background: #13284B;\n    color: #fff;\n    border: none;\n    height: 52px;\n    min-width: 320px;\n    font-size: 17px;\n    font-weight: bold;\n    border-radius: 8px;\n    box-shadow: 0 4px 6px rgba(19, 40, 75, 0.2);\n}\n\n#pdftrim_download_btn:hover {\n    opacity: 0.85;\n}\n\n\/* \u30d7\u30ec\u30d3\u30e5\u30fc\u30a8\u30ea\u30a2\u95a2\u9023 *\/\n#pdftrim_preview_container {\n    overflow: auto;\n    background-color: #e6e6e6;\n    padding: 24px;\n    display: flex;\n    justify-content: center;\n    align-items: flex-start;\n}\n\n#pdftrim_preview_wrapper {\n    position: relative;\n    box-shadow: 0 4px 12px rgba(0,0,0,0.15);\n    background-color: #fff;\n    transform-origin: top left;\n}\n\n#pdftrim_canvas {\n    display: block;\n}\n\n\/* \u67a0\u5916\u6697\u8ee2\u7528\u30aa\u30fc\u30d0\u30fc\u30ec\u30a4 *\/\n.pdftrim_overlay {\n    position: absolute;\n    background: rgba(0, 0, 0, 0.28);\n    pointer-events: none;\n    z-index: 1;\n}\n\n#pdftrim_bounding_box {\n    position: absolute;\n    border: 2px solid #13284B;\n    background-color: transparent; \n    cursor: move;\n    top: 2.5%; left: 2.5%; width: 95%; height: 95%;\n    z-index: 2;\n}\n\n.pdftrim_handle {\n    position: absolute;\n    width: 12px; height: 12px;\n    background-color: #13284B;\n    border: 1px solid #fff;\n    z-index: 3;\n}\n\n\/* \u9650\u5b9a\u9069\u7528\u30e2\u30fc\u30c9\uff08\u30aa\u30ec\u30f3\u30b8\u7cfb\uff09\u6642\u306e\u67a0\u30fb\u30cf\u30f3\u30c9\u30eb\u8272\u5909\u66f4 *\/\n#pdftrim_bounding_box.pdftrim_mode_current {\n    border-color: #ff9800;\n}\n#pdftrim_bounding_box.pdftrim_mode_current .pdftrim_handle {\n    background-color: #ff9800;\n}\n\n\/* \u56db\u9685\u3068\u8fba\u30cf\u30f3\u30c9\u30eb\u306eCSS *\/\n.pdftrim_nw { top: -6px; left: -6px; cursor: nwse-resize; }\n.pdftrim_ne { top: -6px; right: -6px; cursor: nesw-resize; }\n.pdftrim_sw { bottom: -6px; left: -6px; cursor: nesw-resize; }\n.pdftrim_se { bottom: -6px; right: -6px; cursor: nwse-resize; }\n.pdftrim_n { top: -6px; left: 50%; transform: translateX(-50%); cursor: ns-resize; }\n.pdftrim_s { bottom: -6px; left: 50%; transform: translateX(-50%); cursor: ns-resize; }\n.pdftrim_w { left: -6px; top: 50%; transform: translateY(-50%); cursor: ew-resize; }\n.pdftrim_e { right: -6px; top: 50%; transform: translateY(-50%); cursor: ew-resize; }\n\n\/* \u30b9\u30de\u30db\u8868\u793a\u5bfe\u5fdc *\/\n@media (max-width: 600px) {\n    .pdftrim_settings_row {\n        grid-template-columns: 1fr;\n        gap: 20px;\n    }\n    \n    .pdftrim_settings_row .pdftrim_control_group:first-child {\n        align-items: flex-start;\n    }\n    \n    .pdftrim_settings_row .pdftrim_control_group:first-child p {\n        width: 100%;\n    }\n\n    .pdftrim_control_divider {\n        width: 100%;\n        height: 1px;\n        min-height: 1px;\n        margin: 0;\n    }\n\n    #pdftrim_download_btn {\n        min-width: 100%;\n        width: 100%;\n    }\n}\n<\/style>\n\n<script src=\"https:\/\/media-api.qcdgv19414.rakkoserver.net\/lib\/pdf.min.js\"><\/script>\n<script src=\"https:\/\/media-api.qcdgv19414.rakkoserver.net\/lib\/pdf-lib.min.js\"><\/script>\n<script>\ndocument.addEventListener('DOMContentLoaded', () => {\n    \/\/ pdf.js \u306e worker \u8a2d\u5b9a\n    pdfjsLib.GlobalWorkerOptions.workerSrc = 'https:\/\/media-api.qcdgv19414.rakkoserver.net\/lib\/pdf.worker.min.js';\n\n    \/\/ UI Elements\n    const elUploadArea = document.getElementById('pdftrim_upload_area');\n    const elFileInput = document.getElementById('pdftrim_file_input');\n    const elSelectBtn = document.getElementById('pdftrim_select_btn');\n    const elReselectBtn = document.getElementById('pdftrim_reselect_btn');\n    const elErrorMsg = document.getElementById('pdftrim_error_msg');\n    const elWorkspace = document.getElementById('pdftrim_workspace');\n    \n    const elCanvas = document.getElementById('pdftrim_canvas');\n    const ctx = elCanvas.getContext('2d');\n    const elWrapper = document.getElementById('pdftrim_preview_wrapper');\n    const elBox = document.getElementById('pdftrim_bounding_box');\n    \n    const elZoomSlider = document.getElementById('pdftrim_zoom_slider');\n    const elZoomVal = document.getElementById('pdftrim_zoom_val');\n    const elDownloadBtn = document.getElementById('pdftrim_download_btn');\n    const elResetBtn = document.getElementById('pdftrim_reset_btn');\n    const elFilenameDisplay = document.getElementById('pdftrim_filename_display');\n    const elLabelCurrent = document.getElementById('pdftrim_label_current'); \n\n    \/\/ Pagination Elements\n    const elPrevPageBtn = document.getElementById('pdftrim_prev_page_btn');\n    const elNextPageBtn = document.getElementById('pdftrim_next_page_btn');\n    const elPageIndicator = document.getElementById('pdftrim_page_indicator');\n\n    \/\/ Overlay Elements\n    const elOverlayTop = document.getElementById('pdftrim_overlay_top');\n    const elOverlayBottom = document.getElementById('pdftrim_overlay_bottom');\n    const elOverlayLeft = document.getElementById('pdftrim_overlay_left');\n    const elOverlayRight = document.getElementById('pdftrim_overlay_right');\n\n    let currentPdfData = null;\n    let originalFilename = \"document.pdf\";\n    let pdfDoc = null;\n    let currentScale = 1.0;\n    \n    \/\/ \u30da\u30fc\u30b8\u30cd\u30fc\u30b7\u30e7\u30f3\u7528\u5909\u6570\n    let currentPageNum = 1;\n    let totalPageCount = 1;\n\n    let isProcessingDownload = false;\n\n    \/\/ \u30aa\u30fc\u30d0\u30fc\u30ec\u30a4\u9818\u57df\u306e\u518d\u8a08\u7b97\n    function updateOverlay() {\n        const wrapperW = elWrapper.offsetWidth;\n        const wrapperH = elWrapper.offsetHeight;\n        const boxL = elBox.offsetLeft;\n        const boxT = elBox.offsetTop;\n        const boxW = elBox.offsetWidth;\n        const boxH = elBox.offsetHeight;\n\n        elOverlayTop.style.cssText = `top: 0; left: 0; width: 100%; height: ${boxT}px;`;\n        elOverlayBottom.style.cssText = `top: ${boxT + boxH}px; left: 0; width: 100%; height: ${wrapperH - (boxT + boxH)}px;`;\n        elOverlayLeft.style.cssText = `top: ${boxT}px; left: 0; width: ${boxL}px; height: ${boxH}px;`;\n        elOverlayRight.style.cssText = `top: ${boxT}px; left: ${boxL + boxW}px; width: ${wrapperW - (boxL + boxW)}px; height: ${boxH}px;`;\n    }\n\n    \/\/ \u30da\u30fc\u30b8\u30cd\u30fc\u30b7\u30e7\u30f3UI\u306e\u66f4\u65b0\n    function updatePaginationUI() {\n        elPageIndicator.textContent = `${currentPageNum} \/ ${totalPageCount}`;\n        elPrevPageBtn.disabled = currentPageNum <= 1;\n        elNextPageBtn.disabled = currentPageNum >= totalPageCount;\n    }\n\n    \/\/ \u30d5\u30a1\u30a4\u30eb\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u5236\u5fa1\n    elSelectBtn.addEventListener('click', () => elFileInput.click());\n    elReselectBtn.addEventListener('click', () => elFileInput.click());\n    \n    elFileInput.addEventListener('change', (e) => {\n        if(e.target.files.length > 0) handleFile(e.target.files[0]);\n    });\n\n    elUploadArea.addEventListener('dragover', (e) => {\n        e.preventDefault();\n        elUploadArea.classList.add('dragover');\n    });\n\n    elUploadArea.addEventListener('dragleave', () => {\n        elUploadArea.classList.remove('dragover');\n    });\n\n    elUploadArea.addEventListener('drop', (e) => {\n        e.preventDefault();\n        elUploadArea.classList.remove('dragover');\n        if(e.dataTransfer.files.length > 0) handleFile(e.dataTransfer.files[0]);\n    });\n\n    \/\/ \u30d5\u30a1\u30a4\u30eb\u691c\u8a3c\u3068\u8aad\u307f\u8fbc\u307f\n    function handleFile(file) {\n        elErrorMsg.style.display = 'none';\n        \n        if (file.type !== 'application\/pdf') {\n            showError(\"PDF\u30d5\u30a1\u30a4\u30eb\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002\");\n            elFileInput.value = ''; \n            return;\n        }\n        if (file.size > 50 * 1024 * 1024) { \n            showError(\"\u30d5\u30a1\u30a4\u30eb\u30b5\u30a4\u30ba\u306f50MB\u4ee5\u4e0b\u306b\u3057\u3066\u304f\u3060\u3055\u3044\u3002\");\n            elFileInput.value = '';\n            return;\n        }\n\n        originalFilename = file.name;\n        elFilenameDisplay.textContent = '\ud83d\udcc4 ' + originalFilename; \n        \n        const reader = new FileReader();\n        reader.onload = function(e) {\n            currentPdfData = new Uint8Array(e.target.result);\n            \n            \/\/ \u518d\u9078\u629e\u6642\u306e\u521d\u671f\u5316\n            currentScale = 1.0;\n            elZoomSlider.value = 1.0;\n            elZoomVal.textContent = '100%';\n            elBox.style.top = '2.5%';\n            elBox.style.left = '2.5%';\n            elBox.style.width = '95%';\n            elBox.style.height = '95%';\n            \n            \/\/ \u30e9\u30b8\u30aa\u30dc\u30bf\u30f3\u3068\u67a0\u8272\u30fb\u30e9\u30d9\u30eb\u8272\u306e\u521d\u671f\u5316\n            document.querySelector('input[name=\"pdftrim_target\"]').checked = true;\n            elBox.classList.remove('pdftrim_mode_current');\n            elLabelCurrent.classList.remove('pdftrim_mode_current_active');\n\n            currentPageNum = 1;\n\n            loadPdfPreview(currentPdfData);\n        };\n        reader.readAsArrayBuffer(file);\n        \n        elFileInput.value = '';\n    }\n\n    function showError(msg) {\n        elErrorMsg.textContent = msg; \n        elErrorMsg.style.display = 'block';\n    }\n\n    \/\/ PDF\u30d7\u30ec\u30d3\u30e5\u30fc\uff08pdf.js\uff09\n    async function loadPdfPreview(data) {\n        try {\n            pdfDoc = await pdfjsLib.getDocument({ data: data }).promise;\n            \n            totalPageCount = pdfDoc.numPages;\n            updatePaginationUI();\n\n            await renderPage(currentPageNum);\n            elUploadArea.style.display = 'none';\n            elWorkspace.style.display = 'block';\n            updateOverlay(); \n        } catch (error) {\n            showError(\"PDF\u306e\u8aad\u307f\u8fbc\u307f\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002\");\n        }\n    }\n\n    async function renderPage(pageNum) {\n        const page = await pdfDoc.getPage(pageNum);\n        const viewport = page.getViewport({ scale: currentScale });\n        \n        elCanvas.width = viewport.width;\n        elCanvas.height = viewport.height;\n        elWrapper.style.width = viewport.width + 'px';\n        elWrapper.style.height = viewport.height + 'px';\n\n        const renderContext = {\n            canvasContext: ctx,\n            viewport: viewport\n        };\n        await page.render(renderContext).promise;\n        updateOverlay(); \n    }\n\n    \/\/ \u30e9\u30b8\u30aa\u30dc\u30bf\u30f3\u306e\u5909\u66f4\u76e3\u8996\uff08\u67a0\u8272\u3068\u30e9\u30d9\u30eb\u88c5\u98fe\u306e\u5207\u308a\u66ff\u3048\uff09\n    const radioTargets = document.querySelectorAll('input[name=\"pdftrim_target\"]');\n    radioTargets.forEach(radio => {\n        radio.addEventListener('change', (e) => {\n            if (e.target.value === 'current') {\n                elBox.classList.add('pdftrim_mode_current');\n                elLabelCurrent.classList.add('pdftrim_mode_current_active');\n            } else {\n                elBox.classList.remove('pdftrim_mode_current');\n                elLabelCurrent.classList.remove('pdftrim_mode_current_active');\n            }\n        });\n    });\n\n    \/\/ \u30ba\u30fc\u30e0\u5236\u5fa1\n    elZoomSlider.addEventListener('input', (e) => {\n        currentScale = parseFloat(e.target.value);\n        elZoomVal.textContent = Math.round(currentScale * 100) + '%';\n        renderPage(currentPageNum);\n    });\n\n    \/\/ \u30da\u30fc\u30b8\u30cd\u30fc\u30b7\u30e7\u30f3\u5236\u5fa1\n    elPrevPageBtn.addEventListener('click', () => {\n        if (currentPageNum > 1) {\n            currentPageNum--;\n            renderPage(currentPageNum);\n            updatePaginationUI();\n        }\n    });\n\n    elNextPageBtn.addEventListener('click', () => {\n        if (currentPageNum < totalPageCount) {\n            currentPageNum++;\n            renderPage(currentPageNum);\n            updatePaginationUI();\n        }\n    });\n\n    \/\/ \u30c8\u30ea\u30df\u30f3\u30b0\u67a0\u30ea\u30bb\u30c3\u30c8\u30dc\u30bf\u30f3\u5236\u5fa1\n    elResetBtn.addEventListener('click', () => {\n        elBox.style.top = '2.5%';\n        elBox.style.left = '2.5%';\n        elBox.style.width = '95%';\n        elBox.style.height = '95%';\n        requestAnimationFrame(() => {\n            updateOverlay();\n        });\n    });\n\n    \/\/ \u30d0\u30a6\u30f3\u30c7\u30a3\u30f3\u30b0\u30dc\u30c3\u30af\u30b9\u64cd\u4f5c\uff08\u30c9\u30e9\u30c3\u30b0\uff06\u30ea\u30b5\u30a4\u30ba\uff09\n    let isDragging = false;\n    let isResizing = false;\n    let resizeHandle = null;\n    let startX, startY, startLeft, startTop, startWidth, startHeight;\n\n    const getPointer = (e) => {\n        if(e.touches && e.touches.length > 0) return e.touches[0];\n        return e;\n    };\n\n    const onStart = (e) => {\n        const ptr = getPointer(e);\n        startX = ptr.clientX;\n        startY = ptr.clientY;\n        startLeft = elBox.offsetLeft;\n        startTop = elBox.offsetTop;\n        startWidth = elBox.offsetWidth;\n        startHeight = elBox.offsetHeight;\n\n        if (e.target.classList.contains('pdftrim_handle')) {\n            isResizing = true;\n            if (e.target.classList.contains('pdftrim_nw')) resizeHandle = 'nw';\n            if (e.target.classList.contains('pdftrim_ne')) resizeHandle = 'ne';\n            if (e.target.classList.contains('pdftrim_sw')) resizeHandle = 'sw';\n            if (e.target.classList.contains('pdftrim_se')) resizeHandle = 'se';\n            if (e.target.classList.contains('pdftrim_n')) resizeHandle = 'n';\n            if (e.target.classList.contains('pdftrim_s')) resizeHandle = 's';\n            if (e.target.classList.contains('pdftrim_w')) resizeHandle = 'w';\n            if (e.target.classList.contains('pdftrim_e')) resizeHandle = 'e';\n        } else if (e.target === elBox) {\n            isDragging = true;\n        }\n        \n        if(isDragging || isResizing) {\n            e.preventDefault();\n        }\n    };\n\n    const onMove = (e) => {\n        if (!isDragging && !isResizing) return;\n        const ptr = getPointer(e);\n        const dx = ptr.clientX - startX;\n        const dy = ptr.clientY - startY;\n\n        let newLeft = startLeft;\n        let newTop = startTop;\n        let newWidth = startWidth;\n        let newHeight = startHeight;\n\n        const wrapperWidth = elWrapper.offsetWidth;\n        const wrapperHeight = elWrapper.offsetHeight;\n\n        if (isDragging) {\n            newLeft += dx;\n            newTop += dy;\n            \n            if (newLeft < 0) newLeft = 0;\n            if (newTop < 0) newTop = 0;\n            if (newLeft + startWidth > wrapperWidth) newLeft = wrapperWidth - startWidth;\n            if (newTop + startHeight > wrapperHeight) newTop = wrapperHeight - startHeight;\n            \n            newWidth = startWidth;\n            newHeight = startHeight;\n            \n        } else if (isResizing) {\n            if (resizeHandle.includes('n')) { \n                newTop += dy; \n                newHeight -= dy; \n                if (newTop < 0) {\n                    newHeight += newTop; \n                    newTop = 0;\n                }\n            }\n            if (resizeHandle.includes('s')) { \n                newHeight += dy; \n                if (startTop + newHeight > wrapperHeight) {\n                    newHeight = wrapperHeight - startTop;\n                }\n            }\n            if (resizeHandle.includes('w')) { \n                newLeft += dx; \n                newWidth -= dx; \n                if (newLeft < 0) {\n                    newWidth += newLeft; \n                    newLeft = 0;\n                }\n            }\n            if (resizeHandle.includes('e')) { \n                newWidth += dx; \n                if (startLeft + newWidth > wrapperWidth) {\n                    newWidth = wrapperWidth - startLeft;\n                }\n            }\n\n            if (newWidth < 50) {\n                newWidth = 50;\n                if (resizeHandle.includes('w')) newLeft = startLeft + startWidth - 50;\n            }\n            if (newHeight < 50) {\n                newHeight = 50;\n                if (resizeHandle.includes('n')) newTop = startTop + startHeight - 50;\n            }\n        }\n\n        elBox.style.left = (newLeft \/ wrapperWidth * 100) + '%';\n        elBox.style.top = (newTop \/ wrapperHeight * 100) + '%';\n        elBox.style.width = (newWidth \/ wrapperWidth * 100) + '%';\n        elBox.style.height = (newHeight \/ wrapperHeight * 100) + '%';\n\n        updateOverlay();\n    };\n\n    const onEnd = () => {\n        isDragging = false;\n        isResizing = false;\n        resizeHandle = null;\n    };\n\n    elBox.addEventListener('mousedown', onStart);\n    document.addEventListener('mousemove', onMove);\n    document.addEventListener('mouseup', onEnd);\n    \n    elBox.addEventListener('touchstart', onStart, {passive: false});\n    document.addEventListener('touchmove', onMove, {passive: false});\n    document.addEventListener('touchend', onEnd);\n\n    \/\/ \u30c8\u30ea\u30df\u30f3\u30b0\u51e6\u7406\uff06\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\uff08pdf-lib\uff09\n    elDownloadBtn.addEventListener('click', async () => {\n        if (isProcessingDownload) return;\n        isProcessingDownload = true;\n\n        elDownloadBtn.disabled = true;\n        elDownloadBtn.textContent = '\u51e6\u7406\u4e2d...';\n        elResetBtn.disabled = true;\n\n        try {\n            const wrapperW = elWrapper.offsetWidth;\n            const wrapperH = elWrapper.offsetHeight;\n            const rx = elBox.offsetLeft \/ wrapperW;\n            const ry = elBox.offsetTop \/ wrapperH;\n            const rw = elBox.offsetWidth \/ wrapperW;\n            const rh = elBox.offsetHeight \/ wrapperH;\n\n            const { PDFDocument } = PDFLib;\n            const pdf = await PDFDocument.load(currentPdfData);\n            \n            const targetOpt = document.querySelector('input[name=\"pdftrim_target\"]:checked').value;\n            const pages = pdf.getPages();\n\n            pages.forEach((page, index) => {\n                if (targetOpt === 'current' && index !== currentPageNum - 1) return;\n\n                const size = page.getSize();\n                const cropX = size.width * rx;\n                const cropW = size.width * rw;\n                const cropH = size.height * rh;\n                const cropY = size.height - (size.height * ry) - cropH;\n\n                page.setCropBox(cropX, cropY, cropW, cropH);\n            });\n\n            const pdfBytes = await pdf.save();\n            \n            const blob = new Blob([pdfBytes], { type: \"application\/pdf\" });\n            const link = document.createElement('a');\n            link.href = URL.createObjectURL(blob);\n            link.download = \"trimmed_\" + originalFilename;\n            link.click();\n            URL.revokeObjectURL(link.href);\n\n        } catch (error) {\n            alert(\"\u30c8\u30ea\u30df\u30f3\u30b0\u51e6\u7406\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\");\n        } finally {\n            setTimeout(() => {\n                elDownloadBtn.disabled = false;\n                elDownloadBtn.textContent = '\u30c8\u30ea\u30df\u30f3\u30b0\u3057\u3066\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9';\n                elResetBtn.disabled = false;\n                isProcessingDownload = false;\n            }, 1000);\n        }\n    });\n});\n<\/script>\n\n\n\n<p>\u30f3\u30b9\u30c8\u30fc\u30eb\u4e0d\u8981\u3067\u3001PDF\u30d5\u30a1\u30a4\u30eb\u306e\u4e0d\u8981\u306a\u4f59\u767d\u524a\u9664\u3084\u4e00\u90e8\u306e\u5207\u308a\u629c\u304d\u304c\u30d6\u30e9\u30a6\u30b6\u4e0a\u3067\u7c21\u5358\u306b\u3067\u304d\u308b\u7121\u6599\u30c4\u30fc\u30eb\u3067\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-0\">\u3053\u306e\u30c4\u30fc\u30eb\u3067\u3067\u304d\u308b\u3053\u3068<\/h2>\n\n\n\n<p>\u30fbPDF\u306e\u81ea\u7531\u306a\u30c8\u30ea\u30df\u30f3\u30b0\uff08\u5207\u308a\u629c\u304d\uff09 \u30fb\u5168\u30da\u30fc\u30b8\u3078\u306e\u4e00\u62ec\u9069\u7528\u3001\u307e\u305f\u306f\u7279\u5b9a\u306e1\u30da\u30fc\u30b8\u306e\u307f\u3078\u306e\u9069\u7528 \u30fb\u62e1\u5927\u30fb\u7e2e\u5c0f\u30ba\u30fc\u30e0\u3092\u5229\u7528\u3057\u305f\u7d30\u304b\u306a\u7bc4\u56f2\u6307\u5b9a \u30fb\u30b5\u30fc\u30d0\u30fc\u306b\u30c7\u30fc\u30bf\u3092\u9001\u4fe1\u3057\u306a\u3044\u3001\u304a\u4f7f\u3044\u306e\u30d6\u30e9\u30a6\u30b6\u5185\u3067\u306e\u5b89\u5168\u306a\u30c7\u30fc\u30bf\u51e6\u7406<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-1\">\u30c4\u30fc\u30eb\u306e\u4f7f\u3044\u65b9<\/h2>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>\u753b\u9762\u4e0a\u306e\u70b9\u7dda\u30a8\u30ea\u30a2\u306b\u3001\u30c8\u30ea\u30df\u30f3\u30b0\u3057\u305f\u3044PDF\u30d5\u30a1\u30a4\u30eb\u3092\u30c9\u30e9\u30c3\u30b0\uff06\u30c9\u30ed\u30c3\u30d7\u3059\u308b\u304b\u3001\u300c\u30d5\u30a1\u30a4\u30eb\u3092\u9078\u629e\u300d\u30dc\u30bf\u30f3\u304b\u3089\u8aad\u307f\u8fbc\u307f\u307e\u3059\uff08\u30d5\u30a1\u30a4\u30eb\u30b5\u30a4\u30ba\u306e\u4e0a\u9650\u306f50MB\u3067\u3059\uff09\u3002<\/li>\n\n\n\n<li>\u30d7\u30ec\u30d3\u30e5\u30fc\u753b\u9762\u304c\u8868\u793a\u3055\u308c\u305f\u3089\u3001\u9752\u3044\u67a0\u306e\u56db\u9685\u3084\u8fba\u3092\u30c9\u30e9\u30c3\u30b0\u3057\u3066\u3001\u5207\u308a\u629c\u304d\u305f\u3044\u7bc4\u56f2\u3092\u6307\u5b9a\u3057\u307e\u3059\u3002\u7d30\u304b\u3044\u90e8\u5206\u306f\u300c\u30ba\u30fc\u30e0\u8abf\u6574\u300d\u30b9\u30e9\u30a4\u30c0\u30fc\u3092\u4f7f\u3046\u3068\u4fbf\u5229\u3067\u3059\u3002<\/li>\n\n\n\n<li>\u300c\u30c8\u30ea\u30df\u30f3\u30b0\u5bfe\u8c61\u30da\u30fc\u30b8\u300d\u304b\u3089\u3001\u300c\u5168\u30da\u30fc\u30b8\u306b\u9069\u7528\u300d\u3059\u308b\u304b\u300c\u3053\u306e\u30da\u30fc\u30b8\u306e\u307f\u300d\u306b\u9069\u7528\u3059\u308b\u304b\u3092\u9078\u629e\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u300c\u30c8\u30ea\u30df\u30f3\u30b0\u3057\u3066\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u300d\u30dc\u30bf\u30f3\u3092\u30af\u30ea\u30c3\u30af\u3059\u308b\u3068\u3001\u6307\u5b9a\u3057\u305f\u7bc4\u56f2\u3067\u5207\u308a\u629c\u304b\u308c\u305fPDF\u30d5\u30a1\u30a4\u30eb\u304c\u30d1\u30bd\u30b3\u30f3\u3084\u30b9\u30de\u30fc\u30c8\u30d5\u30a9\u30f3\u306b\u4fdd\u5b58\u3055\u308c\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-2\">\u3053\u306e\u30c4\u30fc\u30eb\u3067\u53d6\u5f97\u30fb\u51fa\u529b\u3059\u308b\u60c5\u5831\u306e\u57fa\u790e\u77e5\u8b58<\/h2>\n\n\n\n<p>PDF\u306e\u30c8\u30ea\u30df\u30f3\u30b0\uff08\u30af\u30ed\u30c3\u30d7\u6a5f\u80fd\uff09\u3068\u306f\u3001\u30c7\u30fc\u30bf\u305d\u306e\u3082\u306e\u3092\u524a\u9664\u3059\u308b\u306e\u3067\u306f\u306a\u304f\u3001\u300cPDF\u3092\u958b\u3044\u305f\u3068\u304d\u306b\u8868\u793a\u3055\u308c\u308b\u9818\u57df\uff08CropBox\uff09\u300d\u3092\u5909\u66f4\u3057\u3066\u4e0d\u8981\u306a\u90e8\u5206\u3092\u96a0\u3059\u51e6\u7406\u306e\u3053\u3068\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u305d\u306e\u305f\u3081\u3001\u4f59\u767d\u3092\u5927\u304d\u304f\u5207\u308a\u843d\u3068\u3057\u305f\u3068\u3057\u3066\u3082\u3001PDF\u306e\u30d5\u30a1\u30a4\u30eb\u30b5\u30a4\u30ba\u81ea\u4f53\u304c\u5287\u7684\u306b\u8efd\u304f\u306a\u308b\u308f\u3051\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002\u4e3b\u306b\u300c\u753b\u9762\u3067\u306e\u898b\u3084\u3059\u3055\u300d\u3084\u300c\u5370\u5237\u6642\u306e\u30ec\u30a4\u30a2\u30a6\u30c8\u8abf\u6574\u300d\u3092\u76ee\u7684\u3068\u3057\u305f\u51e6\u7406\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-3\">\u3053\u306e\u30c4\u30fc\u30eb\u304c\u5f79\u7acb\u3064\u306e\u306f\u3069\u3093\u306a\u3068\u304d\uff1f<\/h2>\n\n\n\n<p>\u30fb\u30b9\u30ad\u30e3\u30f3\u3057\u305f\u7d19\u8cc7\u6599\u306e\u7aef\u306b\u3042\u308b\u3001\u9ed2\u3044\u5f71\u3084\u4e0d\u8981\u306a\u4f59\u767d\u3092\u7dba\u9e97\u306b\u6d88\u3057\u305f\u3044\u3068\u304d \u30fb\u30b9\u30de\u30fc\u30c8\u30d5\u30a9\u30f3\u3084\u30bf\u30d6\u30ec\u30c3\u30c8\u3067\u8ad6\u6587\u30fb\u96fb\u5b50\u66f8\u7c4d\u3092\u8aad\u3080\u305f\u3081\u306b\u3001\u4f59\u767d\u3092\u524a\u3063\u3066\u6587\u5b57\u3092\u5927\u304d\u304f\u8868\u793a\u3055\u305b\u305f\u3044\u3068\u304d \u30fb\u30a4\u30d9\u30f3\u30c8\u306e\u30c1\u30b1\u30c3\u30c8\u3084\u30c1\u30e9\u30b7\u306ePDF\u304b\u3089\u3001\u5fc5\u8981\u306a\u60c5\u5831\u304c\u66f8\u304b\u308c\u305f\u4e00\u90e8\u306e\u30a8\u30ea\u30a2\u3060\u3051\u3092\u5207\u308a\u53d6\u3063\u3066\u76f8\u624b\u306b\u5171\u6709\u3057\u305f\u3044\u3068\u304d \u30fb\u6a5f\u5bc6\u60c5\u5831\u3092\u542b\u3080PDF\u3092\u6271\u3046\u305f\u3081\u3001\u5916\u90e8\u306e\u30b5\u30fc\u30d0\u30fc\u306b\u30d5\u30a1\u30a4\u30eb\u3092\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u305b\u305a\u3001\u81ea\u5206\u306e\u7aef\u672b\u5185\u3060\u3051\u3067\u5b89\u5168\u306b\u51e6\u7406\u3092\u5b8c\u7d50\u3055\u305b\u305f\u3044\u3068\u304d<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-4\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3068\u30d7\u30e9\u30a4\u30d0\u30b7\u30fc\u306b\u3064\u3044\u3066<\/h2>\n\n\n\n<p>\u5f53\u30c4\u30fc\u30eb\u306f\u3001\u8aad\u307f\u8fbc\u3093\u3060PDF\u30d5\u30a1\u30a4\u30eb\u306e\u30c8\u30ea\u30df\u30f3\u30b0\u51e6\u7406\u3092\u3059\u3079\u3066\u30e6\u30fc\u30b6\u30fc\u306e\u30d6\u30e9\u30a6\u30b6\u5185\uff08\u3054\u4f7f\u7528\u306e\u30d1\u30bd\u30b3\u30f3\u3084\u30b9\u30de\u30fc\u30c8\u30d5\u30a9\u30f3\u306e\u5185\u90e8\uff09\u3067\u884c\u3044\u307e\u3059\u3002\u30d5\u30a1\u30a4\u30eb\u304c\u5916\u90e8\u306e\u30b5\u30fc\u30d0\u30fc\u306b\u9001\u4fe1\u3055\u308c\u305f\u308a\u3001\u4fdd\u5b58\u3055\u308c\u305f\u308a\u3059\u308b\u3053\u3068\u306f\u4e00\u5207\u3042\u308a\u307e\u305b\u3093\u306e\u3067\u3001\u6a5f\u5bc6\u8cc7\u6599\u3084\u500b\u4eba\u60c5\u5831\u304c\u542b\u307e\u308c\u308bPDF\u3067\u3082\u5b89\u5fc3\u3057\u3066\u3054\u5229\u7528\u3044\u305f\u3060\u3051\u307e\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u3053\u3053\u306bPDF\u30d5\u30a1\u30a4\u30eb\u3092\u30c9\u30e9\u30c3\u30b0\uff06\u30c9\u30ed\u30c3\u30d7 \u307e\u305f\u306f \u30d5\u30a1\u30a4\u30eb\u3092\u9078\u629e \u5225\u306ePDF\u3092\u9078\u629e \u30ba\u30fc\u30e0\u8abf\u6574 100% \u30c8\u30ea\u30df\u30f3\u30b0\u5bfe\u8c61\u30da\u30fc\u30b8 \u5168\u30da\u30fc\u30b8\u306b\u9069\u7528 \u3053\u306e\u30da\u30fc\u30b8\u306e\u307f\uff08\u73fe\u5728\u306e\u30da\u30fc\u30b8\uff09 \u203b \u300c\u3053\u306e\u30da\u30fc\u30b8\u306e\u307f\u300d\u306f\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u6642\u306b\u73fe\u5728 &#8230; <\/p>\n","protected":false},"author":4,"featured_media":14139,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[63,13],"tags":[],"class_list":{"0":"post-14048","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-pdf","8":"category-tool","9":"entry"},"_links":{"self":[{"href":"https:\/\/rakkokeyword.com\/techo\/wp-json\/wp\/v2\/posts\/14048","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rakkokeyword.com\/techo\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rakkokeyword.com\/techo\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rakkokeyword.com\/techo\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/rakkokeyword.com\/techo\/wp-json\/wp\/v2\/comments?post=14048"}],"version-history":[{"count":39,"href":"https:\/\/rakkokeyword.com\/techo\/wp-json\/wp\/v2\/posts\/14048\/revisions"}],"predecessor-version":[{"id":14137,"href":"https:\/\/rakkokeyword.com\/techo\/wp-json\/wp\/v2\/posts\/14048\/revisions\/14137"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rakkokeyword.com\/techo\/wp-json\/wp\/v2\/media\/14139"}],"wp:attachment":[{"href":"https:\/\/rakkokeyword.com\/techo\/wp-json\/wp\/v2\/media?parent=14048"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rakkokeyword.com\/techo\/wp-json\/wp\/v2\/categories?post=14048"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rakkokeyword.com\/techo\/wp-json\/wp\/v2\/tags?post=14048"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}