<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ビジネス | 便利ツールのお部屋</title>
	<atom:link href="https://joho-taisaku.com/tools/category/business/feed/" rel="self" type="application/rss+xml" />
	<link>https://joho-taisaku.com/tools</link>
	<description>情報試験対策室より</description>
	<lastBuildDate>Sun, 26 Apr 2026 13:00:59 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>Word・Excel・PowerPointファイルから画像ファイルを抽出するツール</title>
		<link>https://joho-taisaku.com/tools/office-media/</link>
		
		<dc:creator><![CDATA[hikaruinbiz@gmail.com]]></dc:creator>
		<pubDate>Tue, 20 Jan 2026 11:16:15 +0000</pubDate>
				<category><![CDATA[ビジネス]]></category>
		<guid isPermaLink="false">https://joho-taisaku.com/tools/?p=253</guid>

					<description><![CDATA[ワード・エクセル・パワーポイントのファイルから、埋め込みメディア（画像・音声・動画など）を抽出しまとめてZip形式でダウンロードします。 Officeファイル メディア抽出 クリックして Office ファイルを選択（. [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>ワード・エクセル・パワーポイントのファイルから、埋め込みメディア（画像・音声・動画など）を抽出しまとめてZip形式でダウンロードします。</p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<div class="pptx-notes-wrap">
  <h3 class="pptx-title">Officeファイル メディア抽出</h3>
  <br>
  <form id="ppt-media-form" enctype="multipart/form-data" class="pptx-form">
    <label class="pptx-file">
      <input type="file" name="office" accept=".pptx,.pptm,.docx,.docm,.xlsx,.xlsm" required />
      <span class="pptx-file-label">クリックして Office ファイルを選択（.docx/.docm/.xlsx/.xlsm/.pptx/.pptm）</span>
    </label>

    <button type="submit" id="ppt-media-submit" class="pptx-btn primary">
      <span class="btn-text">抽出して ZIP をダウンロード</span>
      <span class="btn-spinner" aria-hidden="true"></span>
    </button>

    <div id="ppt-media-error" class="pptx-error" style="display:none;"></div>
  </form>

  <div id="ppt-media-output" class="pptx-output" style="display:none;">
    <div class="pptx-output-toolbar">
      <h4 class="pptx-output-title">抽出完了</h4>
      <div class="pptx-actions">
        <a id="ppt-media-download" class="pptx-btn" download>ZIPを再ダウンロード</a>
      </div>
    </div>
    <div id="ppt-media-message" class="pptx-pre" style="max-height:none;"></div>
  </div>
</div>

<style>
  /* ====== Modern, clean look (no external CSS required) ====== */
  :root {
    --bg: #ffffff;
    --card: #ffffff;
    --muted: #6b7280;
    --border: #e5e7eb;
    --ring: #3b82f6;
    --text: #111827;
    --mono: ui-monospace, Menlo, Consolas, monospace;
    --radius: 14px;
    --shadow: 0 10px 25px rgba(0,0,0,.06);
  }
  .pptx-notes-wrap {
    max-width: 920px;
    margin: 2rem auto;
    padding: 1.25rem;
    background: var(--card);
    border: 1px solid var(--border);
    border-radius: var(--radius);
    box-shadow: var(--shadow);
  }
  .pptx-title {
    margin: 0 0 .25rem;
    font-size: clamp(1.2rem, 2vw, 1.5rem);
    letter-spacing: .02em;
  }
  .pptx-help{
    margin: 0 0 1rem;
    color: var(--muted);
    line-height: 1.5;
    font-size: .95rem;
  }
  .pptx-form {
    display: grid;
    grid-template-columns: 1fr auto;
    gap: .75rem 1rem;
    align-items: center;
  }
  @media (max-width: 640px) {
    .pptx-form { grid-template-columns: 1fr; }
  }

  /* File input */
  .pptx-file {
    position: relative;
    display: inline-flex;
    align-items: center;
    gap: .6rem;
    border: 1px dashed var(--border);
    padding: .75rem 1rem;
    border-radius: 12px;
    transition: border-color .2s ease, background .2s ease;
    cursor: pointer;
  }
  .pptx-file:hover { border-color: #cbd5e1; background: #f9fafb; }
  .pptx-file input[type="file"] { display: none; }
  .pptx-file-label { color: var(--muted); }

  /* Buttons */
  .pptx-btn {
    appearance: none; -webkit-appearance: none;
    display: inline-flex; align-items: center; justify-content: center;
    gap: .5rem;
    border: 1px solid var(--border);
    background: #f8fafc;
    color: var(--text);
    border-radius: 12px;
    padding: .65rem 1rem;
    font-weight: 600;
    transition: transform .06s ease, box-shadow .2s ease, background .2s ease, border-color .2s ease;
    text-decoration: none;
    cursor: pointer;
    box-shadow: 0 2px 0 rgba(0,0,0,.04);
    white-space: nowrap;
  }
  .pptx-btn:hover { background: #f1f5f9; border-color: #dbeafe; }
  .pptx-btn:active { transform: translateY(1px); }
  .pptx-btn.primary {
    background: #2563eb; color: #fff; border-color: #1d4ed8;
  }
  .pptx-btn.primary:hover { background: #1d4ed8; }
  .pptx-btn.primary:disabled { opacity: .65; cursor: not-allowed; }

  /* Submit spinner */
  #ppt-media-submit { position: relative; }
  #ppt-media-submit .btn-spinner {
    width: 1em; height: 1em; border-radius: 999px;
    border: 2px solid rgba(255,255,255,.45);
    border-top-color: #fff;
    display: none;
    animation: pptx-spin .8s linear infinite;
  }
  #ppt-media-submit.loading .btn-text { opacity: .75; }
  #ppt-media-submit.loading .btn-spinner { display: inline-block; }
  @keyframes pptx-spin { to { transform: rotate(360deg); } }

  .pptx-error {
    grid-column: 1 / -1;
    color: #b91c1c;
    background: #fef2f2;
    border: 1px solid #fecaca;
    padding: .6rem .8rem;
    border-radius: 10px;
  }

  .pptx-output { margin-top: 1rem; }
  .pptx-output-toolbar {
    display: flex; align-items: center; justify-content: space-between;
    gap: 1rem; margin-bottom: .5rem;
  }
  .pptx-output-title { margin: .25rem 0; font-size: 1.05rem; }
  .pptx-actions { display: inline-flex; gap: .5rem; flex-wrap: wrap; }

  .pptx-pre {
    white-space: pre-wrap;
    font-family: var(--mono);
    background: #ffffff;
    color: #000000;
    padding: 1rem;
    border-radius: 12px;
    max-height: 55vh;
    overflow: auto;
    border: 1px solid #d1d5db;
  }

  /* Focus ring */
  .pptx-file, .pptx-btn {
    outline: none;
  }
  .pptx-file:focus-within,
  .pptx-btn:focus-visible {
    box-shadow: 0 0 0 4px rgba(59,130,246,.25);
    border-color: var(--ring);
  }
</style>

<script>
(function(){
  const $  = (s) => document.querySelector(s);

  const form = $('#ppt-media-form');
  const out  = $('#ppt-media-output');
  const msg  = $('#ppt-media-message');
  const err  = $('#ppt-media-error');
  const aDl  = $('#ppt-media-download');
  const btnSubmit = $('#ppt-media-submit');
  const fileInput = form.querySelector('input[type=file]');
  const fileLabel = form.querySelector('.pptx-file-label');

  const ALLOWED_EXT = ['pptx','pptm','docx','docm','xlsx','xlsm'];
  const MAX_BYTES = 100 * 1024 * 1024; // 100MB（既存と合わせ）

  function getExt(name){
    const m = String(name || '').toLowerCase().match(/\.([a-z0-9]+)$/);
    return m ? m[1] : '';
  }
  function humanBytes(n){
    const units = ['B','KB','MB','GB'];
    let v = Number(n || 0);
    let i = 0;
    while (v >= 1024 && i < units.length - 1){ v /= 1024; i++; }
    return `${v.toFixed(i === 0 ? 0 : 1)} ${units[i]}`;
  }
  function filenameFromContentDisposition(cd){
    if (!cd) return '';
    // RFC 5987 (filename*=UTF-8'') と通常 filename= の両対応をざっくり
    const m5987 = cd.match(/filename\*\s*=\s*UTF-8''([^;]+)/i);
    if (m5987 && m5987[1]) {
      try { return decodeURIComponent(m5987[1].replace(/\"/g,'')); } catch(_) {}
      return m5987[1].replace(/\"/g,'');
    }
    const m = cd.match(/filename\s*=\s*\"?([^\";]+)\"?/i);
    return m && m[1] ? m[1] : '';
  }
  function makeDefaultZipName(original){
    const base = String(original || 'media').replace(/\.[^.]+$/,'');
    return `${base}_media.zip`;
  }

  // ファイル名をラベルに表示
  fileInput.addEventListener('change', () => {
    fileLabel.textContent = (fileInput.files[0]?.name) || 'クリックして Office ファイルを選択';
  });

  form.addEventListener('submit', async (e) => {
    e.preventDefault();
    err.style.display = 'none';
    out.style.display = 'none';

    const file = fileInput.files[0];
    if (!file) { err.textContent = 'ファイルを選択してください。'; err.style.display = 'block'; return; }

    const ext = getExt(file.name);
    if (!ALLOWED_EXT.includes(ext)) {
      err.textContent = '対応形式は .pptx/.pptm/.docx/.docm/.xlsx/.xlsm です（.ppt/.doc/.xls は非対応）。';
      err.style.display = 'block';
      return;
    }
    if (file.size > MAX_BYTES) {
      err.textContent = `ファイルサイズが上限を超えています。現在: ${humanBytes(file.size)}`;
      err.style.display = 'block';
      return;
    }

    const fd = new FormData();
    fd.append('office', file);

    const nonceMeta = document.querySelector('meta[name="ppt-media-extracter-nonce"]');
    const nonce = nonceMeta ? nonceMeta.getAttribute('content') : '';

    const apiUrlMeta = document.querySelector('meta[name="ppt-media-extracter-api-url"]');
    const apiUrl = apiUrlMeta ? apiUrlMeta.getAttribute('content') : '';

    if (!apiUrl) {
      err.textContent = 'ページを再読み込みしてください（API URL を取得できません）。';
      err.style.display = 'block';
      return;
    }

    // UIロック
    btnSubmit.disabled = true;
    btnSubmit.classList.add('loading');

    try {
      const res = await fetch(apiUrl, {
        method: 'POST',
        headers: { 'X-Ppt-Media-Extracter-Nonce': nonce },
        body: fd,
        credentials: 'same-origin'
      });

      const ct = (res.headers.get('content-type') || '').toLowerCase();

      // 成功: zip バイナリ
      if (res.ok && (ct.includes('application/zip') || ct.includes('application/octet-stream'))) {
        const blob = await res.blob();
        if (!blob || blob.size === 0) throw new Error('ZIP が空でした。埋め込みメディアが無い可能性があります。');

        const url = URL.createObjectURL(blob);
        const filename = filenameFromContentDisposition(res.headers.get('content-disposition')) || makeDefaultZipName(file.name);

        aDl.href = url;
        aDl.download = filename;
        msg.textContent = `抽出完了：${filename}（${humanBytes(blob.size)}）`;
        out.style.display = 'block';

        // UX: ボタンを押したら即ダウンロード
        aDl.click();
        return;
      }

      // 失敗: JSON かテキスト
      let message = '抽出に失敗しました。';
      if (ct.includes('application/json')) {
        try {
          const data = await res.json();
          if (data && data.message) message = String(data.message);
        } catch(_){ }
      } else {
        try {
          const text = await res.text();
          if (text) message = text;
        } catch(_){ }
      }
      throw new Error(message);

    } catch (e2) {
      err.textContent = (e2 && e2.message) ? e2.message : '通信エラーが発生しました。';
      err.style.display = 'block';
    } finally {
      btnSubmit.disabled = false;
      btnSubmit.classList.remove('loading');
    }
  });
})();
</script>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">使い方</h3>



<ul class="wp-block-list">
<li>「クリックしてOfficeファイルを選択」を押し、ファイルを選択します。</li>



<li>「抽出してZIPをダウンロード」を押すと処理が行われ、完了次第Zipがダウンロードされます。</li>



<li>処理完了後、「ZIPを再ダウンロード」を押すと、もう一度Zipファイルをダウンロードできます。</li>
</ul>



<h3 class="wp-block-heading">注意点</h3>



<ul class="wp-block-list">
<li>100MB以上のファイルは受け付けません。動画ファイルなどが含まれている場合は分割・動画のみ削除などしてからご利用ください。</li>



<li>受け付けるファイル形式は、.docx/.docm/.xlsx/.xlsm/.pptx/.pptmです。他の形式の場合は、変換してからご利用ください。</li>



<li>エラーメッセージが表示された場合は、アクセスが集中していることがあります。時間を置いてからご利用ください。</li>
</ul>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">関連ページ</h3>



<p><a href="https://joho-taisaku.com/tools/ppt-note/">パワーポイントPPTXファイルからノートを抽出するツール</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>パワーポイントPPTXファイルからノートを抽出するツール</title>
		<link>https://joho-taisaku.com/tools/ppt-note/</link>
		
		<dc:creator><![CDATA[hikaruinbiz@gmail.com]]></dc:creator>
		<pubDate>Mon, 22 Sep 2025 19:18:48 +0000</pubDate>
				<category><![CDATA[ビジネス]]></category>
		<guid isPermaLink="false">https://joho-taisaku.com/tools/?p=185</guid>

					<description><![CDATA[パワーポイントのファイル（.pptx）から、全ページのノートを抽出しまとめてテキストで表示します。 結果はクリップボードにコピーするか、テキストファイルとしてダウンロードできます。 パワーポイントの「配布資料を作成」機能 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>パワーポイントのファイル（.pptx）から、全ページのノートを抽出しまとめてテキストで表示します。</p>



<p>結果はクリップボードにコピーするか、テキストファイルとしてダウンロードできます。</p>



<p>パワーポイントの「配布資料を作成」機能でもノートを抜き出したwordファイルを作成できますが、途中で止まることも多く、ノートのテキストだけを抜き出すツールが欲しくて作成しました。</p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<div class="pptx-notes-wrap">
  <h3 class="pptx-title">PPTX ノート抽出</h3>

  <form id="pptx-notes-form" enctype="multipart/form-data" class="pptx-form">
    <label class="pptx-file">
      <input type="file" name="pptx" accept=".pptx" required />
      <span class="pptx-file-label">クリックして.pptxを選択</span>
    </label>

    <label class="pptx-check">
      <input type="checkbox" id="show-headers" checked />
      <span>スライド番号を表示</span>
    </label>

    <button type="submit" id="pptx-submit" class="pptx-btn primary">
      <span class="btn-text">抽出する</span>
      <span class="btn-spinner" aria-hidden="true"></span>
    </button>

    <div id="pptx-notes-error" class="pptx-error" style="display:none;"></div>
  </form>

  <div id="pptx-notes-output" class="pptx-output" style="display:none;">
    <div class="pptx-output-toolbar">
      <h4 class="pptx-output-title">抽出結果</h4>
      <div class="pptx-actions">
        <a id="pptx-notes-download" download="notes.txt" class="pptx-btn">テキストをダウンロード</a>
        <button id="pptx-notes-copy" type="button" class="pptx-btn">クリップボードにコピー</button>
      </div>
    </div>
    <pre id="pptx-notes-result" class="pptx-pre"></pre>
  </div>
</div>

<style>
  /* ====== Modern, clean look (no external CSS required) ====== */
  :root {
    --bg: #ffffff;
    --card: #ffffff;
    --muted: #6b7280;
    --border: #d5d7db;
    --ring: #3b82f6;
    --text: #010817;
    --mono: ui-monospace, Menlo, Consolas, monospace;
    --radius: 14px;
    --shadow: 0 10px 25px rgba(0,0,0,.06);
  }
  .pptx-notes-wrap {
    max-width: 920px;
    margin: 2rem auto;
    padding: 1.25rem;
    background: var(--card);
    border: 1px solid var(--border);
    border-radius: var(--radius);
    box-shadow: var(--shadow);
  }
  .pptx-title {
    margin: 0 0 1rem;
    font-size: clamp(1.2rem, 2vw, 1.5rem);
    letter-spacing: .02em;
  }
  .pptx-form {
    display: grid;
    grid-template-columns: 1fr auto;
    gap: .75rem 1rem;
    align-items: center;
  }
  @media (max-width: 640px) {
    .pptx-form { grid-template-columns: 1fr; }
  }

  /* File input */
  .pptx-file {
    position: relative;
    display: inline-flex;
    align-items: center;
    gap: .6rem;
    border: 1px dashed var(--border);
    padding: 1.75rem 1rem;
    border-radius: 12px;
    transition: border-color .2s ease, background .2s ease;
    cursor: pointer;
  }
  .pptx-file:hover { border-color: #cbd5e1; background: #f9fafb; }
  .pptx-file input[type="file"] { display: none; }
  .pptx-file-label { color: var(--muted); }

  /* Checkbox */
  .pptx-check {
    justify-self: start;
    display: inline-flex;
    align-items: center;
    gap: .5rem;
    color: var(--muted);
    user-select: none;
  }
  .pptx-check input { transform: scale(1.1); }

  /* Buttons */
  .pptx-btn {
    appearance: none; -webkit-appearance: none;
    display: inline-flex; align-items: center; justify-content: center;
    gap: .5rem;
    border: 1px solid var(--border);
    background: #f8fafc;
    color: var(--text);
    border-radius: 12px;
    padding: .65rem 1rem;
    font-weight: 600;
    transition: transform .06s ease, box-shadow .2s ease, background .2s ease, border-color .2s ease;
    text-decoration: none;
    cursor: pointer;
    box-shadow: 0 2px 0 rgba(0,0,0,.04);
    white-space: nowrap;
  }
  .pptx-btn:hover { background: #f1f5f9; border-color: #dbeafe; }
  .pptx-btn:active { transform: translateY(1px); }
  .pptx-btn.primary {
    background: #2563eb; color: #fff; border-color: #1d4ed8;
  }
  .pptx-btn.primary:hover { background: #1d4ed8; }
  .pptx-btn.primary:disabled { opacity: .65; cursor: not-allowed; }
  .pptx-btn.secondary {
    background: #111827; color: #fff; border-color: #0f172a;
  }
  .pptx-btn.secondary:hover { background: #0b1222; }

  /* Submit spinner */
  #pptx-submit { position: relative; }
  #pptx-submit .btn-spinner {
    width: 1em; height: 1em; border-radius: 999px;
    border: 2px solid rgba(255,255,255,.45);
    border-top-color: #fff;
    display: none;
    animation: pptx-spin .8s linear infinite;
  }
  #pptx-submit.loading .btn-text { opacity: .75; }
  #pptx-submit.loading .btn-spinner { display: inline-block; }
  @keyframes pptx-spin { to { transform: rotate(360deg); } }

  .pptx-error {
    grid-column: 1 / -1;
    color: #b91c1c;
    background: #fef2f2;
    border: 1px solid #fecaca;
    padding: .6rem .8rem;
    border-radius: 10px;
  }

  .pptx-output { margin-top: 1rem; }
  .pptx-output-toolbar {
    display: flex; align-items: center; justify-content: space-between;
    gap: 1rem; margin-bottom: .5rem;
  }
  .pptx-output-title { margin: .25rem 0; font-size: 1.05rem; }
  .pptx-actions { display: inline-flex; gap: .5rem; flex-wrap: wrap; }

  .pptx-pre {
    white-space: pre-wrap;
    font-family: var(--mono);
    background: #ffffff;   /* 白地 */
    color: #000000;        /* 黒文字 */
    padding: 1rem;
    border-radius: 12px;
    max-height: 55vh;
    overflow: auto;
    border: 1px solid #d1d5db;
  }

  /* Focus ring */
  .pptx-file, .pptx-btn, .pptx-check input {
    outline: none;
  }
  .pptx-file:focus-within,
  .pptx-btn:focus-visible,
  .pptx-check input:focus-visible {
    box-shadow: 0 0 0 4px rgba(59,130,246,.25);
    border-color: var(--ring);
  }
</style>

<script>
(function(){
  const $  = (s) => document.querySelector(s);
  const form = $('#pptx-notes-form');
  const out  = $('#pptx-notes-output');
  const pre  = $('#pptx-notes-result');
  const err  = $('#pptx-notes-error');
  const aDl  = $('#pptx-notes-download');
  const btnCopy = $('#pptx-notes-copy');
  const cb   = $('#show-headers');
  const btnSubmit = $('#pptx-submit');
  const fileInput = form.querySelector('input[type=file]');
  const fileLabel = form.querySelector('.pptx-file-label');

  // ファイル名をラベルに表示
  fileInput.addEventListener('change', () => {
    fileLabel.textContent = (fileInput.files[0]?.name) || '.pptx を選択';
  });

  // 抽出時のチェック状態だけ反映し、ヘッダー行だけ削除（改行は維持）
  function renderForDownload(rawText, showHeaders) {
    let processed = rawText;
    const headerRe = /^\s*===\s*Slide\s+\d+\s*===\s*$/gmi;

    if (!showHeaders) {
      processed = processed.replace(headerRe, '');
    }

    // 本文の有無は「ヘッダーを除いたテキスト」で判定
    const contentOnly = processed.replace(headerRe, '').trim();
    const displayText = contentOnly === '' ? '（ノートが存在しませんでした。）' : processed;

    pre.textContent = displayText;

    // ダウンロード用Blob
    const blob = new Blob([processed], {type: 'text/plain;charset=utf-8'});
    const url = URL.createObjectURL(blob);
    aDl.href = url;
  }

  async function copyToClipboard(text) {
    try {
      await navigator.clipboard.writeText(text);
      btnCopy.classList.add('ok');
      btnCopy.textContent = 'コピーしました';
      setTimeout(() => {
        btnCopy.classList.remove('ok');
        btnCopy.textContent = 'クリップボードにコピー';
      }, 1500);
    } catch(e) {
      // 失敗時は選択→execCommandのフォールバック（サポート外環境向け）
      const ta = document.createElement('textarea');
      ta.value = text;
      ta.style.position = 'fixed';
      ta.style.opacity = '0';
      document.body.appendChild(ta);
      ta.select();
      try { document.execCommand('copy'); } catch(_){}
      document.body.removeChild(ta);
    }
  }

  btnCopy.addEventListener('click', () => {
    const txt = pre.textContent || '';
    if (!txt) return;
    copyToClipboard(txt);
  });

  form.addEventListener('submit', async (e) => {
    e.preventDefault();
    err.style.display = 'none';
    out.style.display = 'none';

    const file = fileInput.files[0];
    if (!file) { err.textContent = 'ファイルを選択してください。'; err.style.display = 'block'; return; }
    if (!file.name.toLowerCase().endsWith('.pptx')) {
      err.textContent = '.pptx ファイルのみ対応です。'; err.style.display = 'block'; return;
    }
    if (file.size > 20 * 1024 * 1024) {
      err.textContent = 'ファイルサイズが上限(20MB)を超えています。'; err.style.display = 'block'; return;
    }

    // 抽出時点のチェック状態（この後のトグルは無視）
    const showHeadersNow = cb.checked;

    const fd = new FormData();
    fd.append('pptx', file);

    const nonceMeta = document.querySelector('meta[name="pptx-notes-nonce"]');
    const nonce = nonceMeta ? nonceMeta.getAttribute('content') : '';

    const apiUrlMeta = document.querySelector('meta[name="pptx-notes-api-url"]');
    const apiUrl = apiUrlMeta ? apiUrlMeta.getAttribute('content') : '';

    if (!apiUrl) {
      // エラー処理（URLが取得できなかった場合）
      err.textContent = 'ページを再読み込みしてください。';
      err.style.display = 'block';
      // UIロックを解除して終了
      btnSubmit.disabled = false;
      btnSubmit.classList.remove('loading');
      return; 
    }

    // UIロック
    btnSubmit.disabled = true;
    btnSubmit.classList.add('loading');

    try {
      // サブディレクトリWP（例: https://example.com/tools/）
      const res = await fetch(apiUrl, { 
        method: 'POST',
        headers: { 'X-Pptx-Notes-Nonce': nonce },
        body: fd,
        credentials: 'same-origin'
      });
      const data = await res.json();
      if (!res.ok || !data || !data.ok) {
        throw new Error((data && data.message) || '抽出に失敗しました');
      }

      renderForDownload(data.text || '', showHeadersNow);
      out.style.display = 'block';
    } catch (e2) {
      err.textContent = e2.message || '通信エラーが発生しました';
      err.style.display = 'block';
    } finally {
      btnSubmit.disabled = false;
      btnSubmit.classList.remove('loading');
    }
  });
})();
</script>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">使い方</h3>



<ul class="wp-block-list">
<li>「クリックして.pptxを選択」を押し、ファイルを選択します。</li>



<li>「抽出する」を押すと処理が行われます。</li>



<li>「スライド番号を表示」のチェックを外すと、ノートの内容のみ表示します。</li>
</ul>



<h3 class="wp-block-heading">注意点</h3>



<ul class="wp-block-list">
<li>セキュリティの観点から、pptxファイル以外は受け付けません。他の形式の場合は、変換してからご利用ください。</li>



<li>「Too many requests」と表示された場合は、アクセスが集中しています。時間を置いてからご利用ください。</li>
</ul>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">関連ページ</h3>



<p><a href="https://joho-taisaku.com/tools/office-media/">Word・Excel・PowerPointファイルから画像ファイルを抽出するツール</a></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
