PageSourceSearch

https://katat.me/blog/wuko/pdf-tips-tricks

html katat.me collected 2026-10-09 22:08:04 UTC 11,441 bytes, 106 lines download raw bytes

1<!doctype html>
2<html lang="en">
3<head>
4<title>Clear barriers for insights with PDF</title>
5<meta name="viewport" content="width=device-width,initial-scale=1">
6<script async type="module">import mermaid from"https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.esm.min.mjs"</script>
vendor: 1 bytes, line 6
6
7<script async src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.25.0/prism.min.js" integrity="sha512-hpZ5pDCF2bRCweL5WoA0/N1elet1KYL5mx3LP555Eg/0ZguaHawxNvEjF6O3rufAChs16HVNhEc6blF/rZoowQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
vendor: 1 bytes, line 7
7
8<script async src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.25.0/plugins/autoloader/prism-autoloader.min.js" integrity="sha512-sv0slik/5O0JIPdLBCR2A3XDg/1U3WuDEheZfI/DI5n8Yqc3h5kjrnr46FGBNiUAJF7rE4LHKwQ/SoSLRKAxEA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
vendor: 1 bytes, line 8
8
9<script async src="https://cdn.jsdelivr.net/npm/[email protected]/dist/umd/lucide.min.js"></script>
vendor: 1 bytes, line 9
9
10<script>window.addEventListener("load",(()=>{document.querySelectorAll(".callout").forEach((e=>{const t=getComputedStyle(e).getPropertyValue("--callout-icon"),l=t&&t.trim().replace(/^lucide-/,"");if(l){const t=e.querySelector(".callout-title");if(t){const e=document.createElement("div"),c=document.createElement("i");e.appendChild(c),c.setAttribute("icon-name",l),e.setAttribute("class","callout-icon"),t.insertBefore(e,t.firstChild)}}})),lucide.createIcons(),Array.from(document.querySelectorAll(".callout.is-collapsible")).forEach((e=>{e.querySelector(".callout-title").addEventListener("click",(t=>{e.classList.contains("is-collapsed")?e.classList.remove("is-collapsed"):e.classList.add("is-collapsed")}))}))}))</script>
vendor: 1 bytes, line 10
10
11<script async src="https://fastly.jsdelivr.net/npm/[email protected]/dist/force-graph.min.js"></script>
vendor: 1 bytes, line 11
11
12<script async src="https://fastly.jsdelivr.net/npm/@alpinejs/[email protected]/dist/cdn.min.js"></script>
vendor: 1 bytes, line 12
12
13<script src="https://fastly.jsdelivr.net/npm/[email protected]/dist/cdn.min.js" async></script>
13
14<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.25.0/themes/prism-okaidia.min.css" integrity="sha512-mIs9kKbaw6JZFfSuo+MovjU+Ntggfoj8RwAmJbVXQ5mkAX5LlgETQEweFPI18humSPHymTb5iikEOKWF7I8ncQ==" crossorigin="anonymous" referrerpolicy="no-referrer" async>
15<script src="https://fastly.jsdelivr.net/npm/[email protected]/dist/fetch.umd.min.js" crossorigin="anonymous" referrerpolicy="no-referrer" async></script>
15
16<link href="/styles/digital-garden-base.css" rel="stylesheet">
17<link href="/styles/obsidian-base.css" rel="stylesheet">
18<link href="/styles/_theme.0daa9905.css" rel="stylesheet">
19<link href="/styles/custom-style.css" rel="stylesheet">
20<link rel="icon" href="/favicon.ico" sizes="any">
21<link rel="icon" href="/favicon.svg" type="image/svg+xml">
22<link rel="apple-touch-icon" href="/apple-touch-icon.png">
23<link rel="manifest" href="/manifest.webmanifest">
24<meta name="description" content="a simple workaround to get insights from restricted contents">
25<meta name="og:description" content="a simple workaround to get insights from restricted contents">
26<meta name="og:title" content="Clear barriers for insights with PDF">
27<style></style>
28</head>
29<body class="theme-light markdown-preview-view markdown-rendered markdown-preview-section">
30<nav class="navbar">
31<div class="navbar-inner">
32<ul>
33<li><a href="/">blog</a></li>
34<li><a href="/blog/hi">me</a></li>
35</ul>
36</div>
37</nav>
38<main class="content cm-s-obsidian">
39<header>
40<h1 data-note-icon="">Clear barriers for insights with PDF</h1>
41<div class="header-meta">
42<div class="header-tags">
43</div>
44<div class="timestamps"><div><i icon-name="calendar-plus"></i> <span class="human-date" data-date="2023-09-24T00:00:00"></span></div></div></div>
45</header>
46<p>For both web pages and PDF files, there may be restrictions set by their hosts to prevent bots from accessing them. Since <a href="mailto:[email protected]" target="_blank" class="external-link">[email protected]</a> retrieves the content you provide via its URL, it might not be able to fetch the content in the same manner as you can through a web browser.</p>
47<p>Fortunately, there are some simple workarounds for this accessibility issue, thanks to the PDF feature. Here are a couple of common scenarios and its workaround.</p>
48<h3 id="private-content" tabindex="-1">Private Content</h3>
49<p>There may be certain web pages you wish to use with <a href="mailto:[email protected]" target="_blank" class="external-link">[email protected]</a>. However, due to the host's restrictions, <a href="http://wuko.ai" target="_blank" class="external-link">wuko.ai</a> can't fetch their content directly from the public internet.</p>
50<h3 id="bot-access-control" tabindex="-1">Bot Access Control</h3>
51<p>Some websites utilize measures, such as CAPTCHA, to verify that the visitor is human. <a href="http://wuko.ai" target="_blank" class="external-link">wuko.ai</a> will not be able to retrieve content from these types of websites.</p>
52<h3 id="other-cases" tabindex="-1">Other Cases</h3>
53<p>There may be situations where the URL you provided does not produce the same content when <a href="http://wuko.ai" target="_blank" class="external-link">wuko.ai</a> attempts to fetch it.</p>
54<h3 id="workaround" tabindex="-1">Workaround</h3>
55<p>Follow the steps below to circumvent these issues:</p>
56<ol>
57<li>If dealing with a web page, print it as a PDF and download. If it's already a PDF, simply download it.</li>
58<li>Upload the PDF file to public file hosting services like <a href="https://tmpfiles.org/" target="_blank" class="external-link">https://tmpfiles.org/</a>, then copy the download link once it's uploaded.</li>
59<li>Send the PDF download link to <a href="mailto:[email protected]" target="_blank" class="external-link">[email protected]</a>.</li>
60</ol>
61<p>The crux of this solution is the 2nd step. You need to ensure that the download link generated is publicly accessible to bots, allowing <a href="http://wuko.ai" target="_blank" class="external-link">wuko.ai</a> to fetch its content.</p>
62</main>
63<aside>
64<div class="sidebar">
65<div class="sidebar-container">
66<div class="toc">
67<div class="toc-title-container">
68<div class="toc-title">
69On this page
70</div>
71</div>
72<div class="toc-container">
73<nav class="toc">
74<ol>
75<li><a href="#private-content">Private Content</a>
76</li>
77<li><a href="#bot-access-control">Bot Access Control</a>
78</li>
79<li><a href="#other-cases">Other Cases</a>
80</li>
81<li><a href="#workaround">Workaround</a>
82</li>
83</ol>
84</nav>
85</div>
86</div>
87</div>
88</div>
89</aside>
90<style>#tooltip-wrapper{background:var(--background-primary);padding:1em;border-radius:4px;overflow:hidden;position:fixed;width:80%;max-width:400px;height:auto;max-height:300px;font-size:.8em;box-shadow:0 5px 10px rgba(0,0,0,.1);opacity:0;transition:opacity .1s;
90unicode-bidi:plaintext;overflow-y:scroll;z-index:10}#tooltip-wrapper:after{content:"";position:absolute;z-index:1;bottom:0;left:0;pointer-events:none;width:100%;unicode-bidi:plaintext;height:75px}</style>
91<div style="opacity:0;display:none" id="tooltip-wrapper">
92<div id="tooltip-content">
93</div>
94</div>
95<iframe style="display:none;height:0;width:0" id="link-preview-iframe" src="">
96</iframe>
97<script>var opacityTimeout,contentTimeout,transitionDurationMs=100,iframe=document.getElementById("link-preview-iframe"),tooltipWrapper=document.getElementById("tooltip-wrapper"),tooltipContent=document.getElementById("tooltip-content"),linkHistories={};function hideTooltip(){opacityTimeout=setTimeout((function(){tooltipWrapper.style.opacity=0,contentTimeout=setTimeout((function(){tooltipContent.innerHTML="",tooltipWrapper.style.display="none"}),transitionDurationMs+1)}),transitionDurationMs)}function showTooltip(t){var e=t.target,o=e.getClientRects()[e.getClientRects().length-1],i=window.pageYOffset||document.documentElement.scrollTop,n=t.target.getAttribute("href");if(-1===n.indexOf("http")||-1!==n.indexOf(window.location.host)){let t=n.split("#")[0];linkHistories[t]?(tooltipContent.innerHTML=linkHistories[t],tooltipWrapper.style.display="block",setTimeout((function(){if(tooltipWrapper.style.opacity=1,-1!=n.indexOf("#")){let t=n.split("#")[1];const e=tooltipWrapper.querySelector(`[id='${t}']`);e.classList.add("referred"),e.scrollIntoView({behavior:"smooth"},!0)}else tooltipWrapper.scroll(0,0)}),1)):(iframe.src=t,iframe.onload=function(){tooltipContentHtml="",tooltipContentHtml+='<div style="font-weight: bold; unicode-bidi: plaintext;">'+iframe.contentWindow.document.querySelector("h1").innerHTML+"</div>",tooltipContentHtml+=iframe.contentWindow.document.querySelector(".content").innerHTML,tooltipContent.innerHTML=tooltipContentHtml,linkHistories[t]=tooltipContentHtml,tooltipWrapper.style.display="block",tooltipWrapper.scrollTop=0,setTimeout((function(){if(tooltipWrapper.style.opacity=1,-1!=n.indexOf("#")){let t=n.split("#")[1];const e=tooltipWrapper.querySelector(`[id='${t}']`);e.classList.add("referred"),console.log(e),e.scrollIntoView({behavior:"smooth"},!0)}else tooltipWrapper.scroll(0,0)}),1)}),tooltipWrapper.style.left=o.left-tooltipWrapper.offsetWidth/2+o.width/2+"px",window.innerHeight-o.top<tooltipWrapper.offsetHeight?tooltipWrapper.style.top=o.top+i-tooltipWrapper.offsetHeight-10+"px":window.innerHeight-o.top>tooltipWrapper.offsetHeight&&(tooltipWrapper.style.top=o.top+i+35+"px"),o.left+o.width/2<tooltipWrapper.offsetWidth/2?tooltipWrapper.style.left="10px":document.body.clientWidth-o.left-o.width/2<tooltipWrapper.offsetWidth/2&&(tooltipWrapper.style.left=document.body.clientWidth-tooltipWrapper.offsetWidth-20+"px")}}function setupListeners(t){t.addEventListener("mouseleave",(function(t){hideTooltip()})),tooltipWrapper.addEventListener("mouseleave",(function(t){hideTooltip()})),t.addEventListener("mouseenter",(function(t){clearTimeout(opacityTimeout),clearTimeout(contentTimeout),showTooltip(t)})),tooltipWrapper.addEventListener("mouseenter",(function(t){clearTimeout(opacityTimeout),clearTimeout(contentTimeout)}))}window.addEventListener("load",(function(t){document.querySelectorAll(".internal-link").forEach(setupListeners),document.querySelectorAll(".backlink-card a").forEach(setupListeners)}))</script>
vendor: 1 bytes, line 97
97
98<script>window.location.hash&&document.getElementById(window.location.hash.slice(1)).classList.add("referred"),window.addEventListener("hashchange",(e=>{const t=e.oldURL.split("#");t[1]&&document.getElementById(t[1]).classList.remove("referred");const n=e.newURL.split("#");n[1]&&document.getElementById(n[1]).classList.add("referred")}),!1);const url_parts=window.location.href.split("#"),url=url_parts[0],referrence=url_parts[1];document.querySelectorAll(".cm-s-obsidian > *[id]").forEach((function(e){e.ondblclick=function(e){const t=url+"#"+e.target.id;navigator.clipboard.writeText(t)}}))</script>
vendor: 1 bytes, line 98
98
99<script src="https://fastly.jsdelivr.net/npm/[email protected]/build/global/luxon.min.js"></script>
vendor: 1 bytes, line 99
99
100<script defer="defer">TIMESTAMP_FORMAT="MMM dd, yyyy",document.querySelectorAll(".human-date").forEach((function(e){date=e.getAttribute("data-date")||e.innerText,parsed_date=luxon.DateTime.fromISO(date),null!=parsed_date.invalid&&(parsed_date=luxon.DateTime.fromSQL(date)),null!=parsed_date.invalid&&(parsed_date=luxon.DateTime.fromHTML(date)),e.innerHTML=parsed_date.toFormat(TIMESTAMP_FORMAT)}))</script>
vendor: 1 bytes, line 100
100
101<script defer="defer" src="/_vercel/insights/script.js"></script>
vendor: 1 bytes, line 101
101
102<script defer="defer" src="/_vercel/speed-insights/script.js"></script>
vendor: 1 bytes, line 102
102
103<script src="https://hypothes.is/embed.js" async></script>
vendor: 1 bytes, line 103
103
104<script>lucide.createIcons({attrs:{class:["svg-icon"]}})</script>
104
105</body>
106</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.