tag:crieit.net,2005:https://crieit.net/tags/PDF/feed 「PDF」の記事 - Crieit Crieitでタグ「PDF」に投稿された最近の記事 2022-04-29T23:58:08+09:00 https://crieit.net/tags/PDF/feed tag:crieit.net,2005:PublicArticle/18180 2022-04-29T23:58:08+09:00 2022-04-29T23:58:08+09:00 https://crieit.net/posts/mojibake-pdf-20220501 PDF からテキストをコピペしたときに稀に見られる潰れた文字のメモ <p>あるとき、エディタ上で「入」の文字が化けてしまって困ったので原因を探ったのでメモしておきます。</p> <h2 id="経緯"><a href="#%E7%B5%8C%E7%B7%AF">経緯</a></h2> <p>エディタ上でファイル名をコピペしたら「入」の文字が化けてしまいました。エクスプローラ上で見ると一見普通の「入」の文字のように見えたのですが……。</p> <p><a href="https://crieit.now.sh/upload_images/872413ab26ee95ba2c1f3249702a580f626bfc86aeb9e.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/872413ab26ee95ba2c1f3249702a580f626bfc86aeb9e.jpg?mw=700" alt="左が文字化けした入、右が手入力した入" /></a></p> <p>メモ帳に貼り付けたところ、明らかに様子がおかしいことに気付きました。</p> <p>左が文字化けした「入」、右が手入力した「入」です。</p> <p>何故か今回文字化けした「入」は半分くらいに潰れていますね……。字形が異なるということは、もちろん、文字コードも別です。ユニコードで見ると左が <code>\u2F0A</code> 、右が <code>\u5165</code> です。</p> <p>何でしょうこれ……。</p> <h2 id="調査"><a href="#%E8%AA%BF%E6%9F%BB">調査</a></h2> <p>調べてみると、他にもこうした文字があることが分かりました。</p> <pre><code>⼊入 ⼈人 ⻄西 ⾃自 ⾞車 ⼒力 ⼿手 ⾮非 ⼤大 ⼯工 </code></pre> <p>今回採集した例が上述。</p> <p><a href="https://crieit.now.sh/upload_images/a676d153f7a87ba4255ed1b6400ec489626bfc9218be3.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/a676d153f7a87ba4255ed1b6400ec489626bfc9218be3.jpg?mw=700" alt="半分潰れたような文字の採集結果" /></a></p> <p>メモ帳で見るといずれも半分くらいの大きさに潰れています。エクスプローラで見るとほとんど違いが分からないのですが、先述の通り文字コードが別なのでファイル名はしっかり別物と認識されます。</p> <p>そのため、同じファイル名が複数あるように見えるというなかなか<del>面白い</del>困った状況に陥ります。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://logmi.jp/tech/articles/324366">PDFをコピペするとなぜ“文字化け”が起きてしまうのか 変換テーブル“ToUnicode CMap”が原因だった - ログミーTech</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://logmi.jp/tech/articles/324412">PDFに文字化けを起こさせない対策法 もらったファイルは正規化で、作成ツールは対応済みを使え - ログミーTech</a></li> </ul> <p>さらに調べた結果、原因が判明しました。原因は PDF でした。</p> <ul> <li>PDFの中のテキストは文字コードとは別の固有の番号で文字を出力しているが、Unicodeのような文字コードとは互換性はない</li> <li>一応文字コードとPDF固有の番号の変換テーブルはある</li> <li>が、この変換テーブルがない PDF が存在する</li> <li>そうした場合、昇順で文字を参照するが本来の文字ではなく部首に当たる文字が先にヒットしてしまう</li> <li>この部首に当たる文字が先の半分潰れたような文字の正体</li> <li>結果、コピペ等 PDF の中からテキストを抜く際に本来の文字ではなく、部首に当たる文字が抜き出される。その文字は通常の文字ではないため、一部の環境では化ける</li> </ul> <p>ざっくり言うとこんな感じの原因の模様。確かに、今回のケースでも PDF の中から見出しのテキストをコピペしてファイル名にしていました。その際に先の条件に当てはまり、通常の <code>入</code> ではなく、 <code>⼊</code> を混入させてしまった、ということのようです。</p> <p>原因が分かれば納得ですが、なんと面倒な……。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://logmi.jp/tech/articles/324366">PDFをコピペするとなぜ“文字化け”が起きてしまうのか 変換テーブル“ToUnicode CMap”が原因だった - ログミーTech</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://logmi.jp/tech/articles/324412">PDFに文字化けを起こさせない対策法 もらったファイルは正規化で、作成ツールは対応済みを使え - ログミーTech</a></li> </ul> <h3 id="(余談)"><a href="#%28%E4%BD%99%E8%AB%87%29">(余談)</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/libraplanet/items/68a3e6b4a3942c83db50">「文字コードを自動判別する」と言う幻想を打ち砕く👊 - Qiita</a></li> </ul> <p>今回の件とは別件ですが、まあ文字コードがらみは厄介ですよね、というお話。</p> arm-band tag:crieit.net,2005:PublicArticle/18027 2022-02-10T18:35:16+09:00 2022-02-10T18:35:16+09:00 https://crieit.net/posts/Pass-IMANET-CMA-Exam-Questions-to-Get-Certification-2022 Pass IMANET CMA Exam Questions to Get Certification [2022] <p><span style="display:block; color:#3d79c7; background:#F2EF12; border: 0.5px solid #AED6F1 ; border-left: 3px solid #3498DB; padding: .6em; border-radius: 6px;"><span style="font-family:Times New Roman,Times,serif;">CMA Actual Questions With Correct Answers For Guaranteed Quick IMANET Exam Preparation</span></span></p> <p style="text-align:justify">It is indispensable to have Certified Management Accountant CMA real questions from a dependable brand to crack the Certified Management Accountant CMA examination on the first try. Fortunately, Dumpskey offers accurate CMA real exam questions that have strong chances to come in the final CMA exam. Dumpskey's team of specialists keeps the Certified Management Accountant CMA actual questions and answers up to date according to the Certified Management Accountant CMA real certification test content. CMA updated dumps provided by Dumpskey give an CMA real exam circumstances. Other Certified Management Accountant CMA practice exam learning sources are expensive, so cost-effective and authentic <a target="_blank" rel="nofollow noopener" href="https://www.dumpskey.com/imanet/cma-braindumps">CMA Exam Questions</a> from Dumpskey will save you valuable money and time. CMA study guides and instructor-led Certified Management Accountant CMA exam dumps training are not affordable for every CMA test student. Furthermore, these CMA practice questions preparation resources are not useful for a quick Certified Management Accountant CMA certification exam preparation. All of these CMA practice test preparation problems can be solved by using Certified Management Accountant CMA updated dumps. You can prepare quickly with CMA valid questions and this Certified Management Accountant CMA test preparation material comes in CMA Dumps PDF, desktop Certified Management Accountant CMA practice test software, and web-based CMA practice exam. Check out features of all formats.</p> <p style="text-align:justify"> <a target="_blank" rel="nofollow noopener" href="https://www.dumpskey.com/imanet/cma-braindumps"><img width="100%" src="https://i.imgur.com/B8Tm9PP.jpg" alt="Banner"/></a></p> <p><span style="display:block; color:#3d79c7; background:#F2EF12; border: 0.5px solid #AED6F1 ; border-left: 3px solid #3498DB; padding: .6em; border-radius: 6px;"><span style="font-family:Times New Roman,Times,serif;">Best Features of IMANET CMA Desktop-Based Practice Test Software:</span></span></p> <p style="text-align:justify">Certified Management Accountant CMA practice questions in the self-assessment software are quite similar to those in the CMA actual certification exam. You can make your CMA practice exam according to the CMA exam questions types you want to see in the mock exam and the Certified Management Accountant CMA test time you want to set. Because the Certified Management Accountant CMA self-assessment practice exam software can easily record previous and new CMA practice test attempts, you can see how each Certified Management Accountant CMA test attempt develops and improves. The <a target="_blank" rel="nofollow noopener" href="https://www.dumpskey.com/imanet/imanet-cma-practice-questions"> CMA Practice Questions</a> are updated regularly based on new CMA certification test content.</p> <p><span style="display:block; color:#3d79c7; background:#F2EF12; border: 0.5px solid #AED6F1 ; border-left: 3px solid #3498DB; padding: .6em; border-radius: 6px;"><span style="font-family:Times New Roman,Times,serif;">Web-Based IMANET CMA Self-Assessment Test – Supported By All Popular Browsers:</span></span></p> <p style="text-align:justify">You won't need to install Certified Management Accountant CMA preparation evaluation software because you'll be able to take the CMA web-based practice exam via browser. Safari, Opera, Chrome, Firefox, and Internet Explorer are examples of popular browsers that run the web-based CMA practice test. Any plugin will not be required to attempt the Certified Management Accountant CMA web-based practice exam. All the functionalities of the CMA windows-based self-evaluation software are present in the browser-based CMA practice test. All operating systems can be used to take the CMA browser-based practice exam.</p> <p><span style="display:block; color:#3d79c7; background:#F2EF12; border: 0.5px solid #AED6F1 ; border-left: 3px solid #3498DB; padding: .6em; border-radius: 6px;"><span style="font-family:Times New Roman,Times,serif;">Use IMANET CMA Exam Questions for Fast Preparation:</span></span></p> <p style="text-align:justify">With the Certified Management Accountant CMA dumps PDF, you can study with Certified Management Accountant CMA actual exam questions from smartphones, tablets, and laptops. Since the CMA dumps PDF works on smart devices, therefore, you easily utilize spare time for the CMA certification exam preparation. Moreover, <a target="_blank" rel="nofollow noopener" href="https://www.dumpskey.com/">DumpsKey</a> also provides up to three months of free Certified Management Accountant CMA real dumps updates if there is any tweak in the CMA exam questions syllabus.</p> <p><span style="display:block; color:#3d79c7; background:#F2EF12; border: 0.5px solid #AED6F1 ; border-left: 3px solid #3498DB; padding: .6em; border-radius: 6px;"><span style="font-size:20px;"><span style="font-family:Times New Roman,Times,serif;">Purchase IMANET CMA Dumps and Get 25% Discount - Use Coupon Code: </span><span new="" roman="" style="background-color: rgb(0, 0, 0); font-family: " times="">SAVE25</span></span></span></p> <p><span style="display:block; color:#3d79c7; background:#F2EF12; border: 0.5px solid #AED6F1 ; border-left: 3px solid #3498DB; padding: .6em; border-radius: 6px;">Visit For More Information: <a target="_blank" rel="nofollow noopener" href="https://www.dumpskey.com/imanet/cma-braindumps">https://www.dumpskey.com/imanet/cma-braindumps</a></span></p> <p style="text-align: center;"><a target="_blank" rel="nofollow noopener" href="https://www.dumpskey.com/imanet/imanet-cma-dumps-pdf"><img width="100%" src="https://i.imgur.com/2uyJiGV.jpg" alt="Banner"/></a></p> <p><span style="display:block; color:#3d79c7; background:#F2EF12; border: 0.5px solid #AED6F1 ; border-left: 3px solid #3498DB; padding: .6em; border-radius: 6px;"><span style="font-family:Times New Roman,Times,serif;">Dumpskey CMA Questions – Regularly Updated According to the Original IMANET Test Content:</span></span></p> <p style="text-align:justify"> CMA exam dumps for the <a target="_blank" rel="nofollow noopener" href="https://www.dumpskey.com/how-to-pass-imanet-certification-exam">IMANET Certification Exam</a> preparation material come with up to three months of free updates. Plus, you can test features of Certified Management Accountant CMA exam questions by trying a free demo. Since these formats are based on the current CMA practice test content, therefore, you can easily crack the CMA exam questions without worries. But if you fail in the Certified Management Accountant CMA exam dumps, we will refund you according to terms and conditions.</p> <p style="text-align:justify">Best of Luck!!!</p> Brenda_Swift tag:crieit.net,2005:PublicArticle/18024 2022-02-10T18:20:03+09:00 2022-02-10T18:22:23+09:00 https://crieit.net/posts/Updated-100-Actual-Exin-CLOUDF-Exam-Questions-2022 Updated 100% Actual Exin CLOUDF Exam Questions [2022] <p><span style="display:block; color:#3d79c7; background:#F2EF12; border: 0.5px solid #AED6F1 ; border-left: 3px solid #3498DB; padding: .6em; border-radius: 6px;"><span style="font-family:Times New Roman,Times,serif;">CLOUDF Actual Questions With Correct Answers For Guaranteed Quick Exin Exam Preparation</span></span></p> <p style="text-align:justify">It is indispensable to have EXIN Cloud Computing Foundation CLOUDF real questions from a dependable brand to crack the EXIN Cloud Computing Foundation CLOUDF examination on the first try. Fortunately, Dumpskey offers accurate CLOUDF real exam questions that have strong chances to come in the final EXIN Cloud Computing Foundation CLOUDF exam. Dumpskey's team of specialists keeps the EXIN Cloud Computing Foundation CLOUDF actual questions and answers up to date according to the EXIN Cloud Computing Foundation CLOUDF real certification test content. CLOUDF updated dumps provided by Dumpskey give an EXIN Cloud Computing Foundation CLOUDF real exam circumstances. Other EXIN Cloud Computing Foundation CLOUDF practice exam learning sources are expensive, so cost-effective and authentic <a target="_blank" rel="nofollow noopener" href="https://www.dumpskey.com/exin/cloudf-braindumps">CLOUDF Exam Questions</a> from Dumpskey will save you valuable money and time. CLOUDF study guides and instructor-led EXIN Cloud Computing Foundation CLOUDF exam dumps training are not affordable for every CLOUDF test student. Furthermore, these CLOUDF practice questions preparation resources are not useful for a quick EXIN Cloud Computing Foundation CLOUDF certification exam preparation. All of these EXIN Cloud Computing Foundation CLOUDF practice test preparation problems can be solved by using EXIN Cloud Computing Foundation CLOUDF updated dumps. You can prepare quickly with CLOUDF valid questions and this EXIN Cloud Computing Foundation CLOUDF test preparation material comes in EXIN Cloud Computing Foundation CLOUDF Dumps PDF, desktop EXIN Cloud Computing Foundation CLOUDF practice test software, and web-based CLOUDF practice exam. Check out features of all formats.</p> <p style="text-align: center;"><a target="_blank" rel="nofollow noopener" href="https://www.dumpskey.com/exin/cloudf-braindumps"><img width="100%" src="https://i.imgur.com/B8Tm9PP.jpg" alt="Banner"/></a></p> <p><span style="display:block; color:#3d79c7; background:#F2EF12; border: 0.5px solid #AED6F1 ; border-left: 3px solid #3498DB; padding: .6em; border-radius: 6px;"><span style="font-family:Times New Roman,Times,serif;">Best Features of Exin CLOUDF Desktop-Based Practice Test Software:</span></span></p> <p style="text-align:justify">EXIN Cloud Computing Foundation CLOUDF practice questions in the self-assessment software are quite similar to those in the CLOUDF actual certification exam. You can make your CLOUDF practice exam according to the CLOUDF exam questions types you want to see in the mock exam and the EXIN Cloud Computing Foundation CLOUDF test time you want to set. Because the EXIN Cloud Computing Foundation CLOUDF self-assessment practice exam software can easily record previous and new EXIN Cloud Computing Foundation CLOUDF practice test attempts, you can see how each EXIN Cloud Computing Foundation CLOUDF test attempt develops and improves. The <a target="_blank" rel="nofollow noopener" href="https://www.dumpskey.com/exin/exin-cloudf-practice-questions"> CLOUDF Practice Questions</a> are updated regularly based on new EXIN Cloud Computing Foundation CLOUDF certification test content.</p> <p><span style="display:block; color:#3d79c7; background:#F2EF12; border: 0.5px solid #AED6F1 ; border-left: 3px solid #3498DB; padding: .6em; border-radius: 6px;"><span style="font-family:Times New Roman,Times,serif;">Web-Based Exin CLOUDF Self-Assessment Test – Supported By All Popular Browsers:</span></span></p> <p style="text-align:justify">You won't need to install EXIN Cloud Computing Foundation CLOUDF preparation evaluation software because you'll be able to take the CLOUDF web-based practice exam via browser. Safari, Opera, Chrome, Firefox, and Internet Explorer are examples of popular browsers that run the web-based CLOUDF practice test. Any plugin will not be required to attempt the EXIN Cloud Computing Foundation CLOUDF web-based practice exam. All the functionalities of the CLOUDF windows-based self-evaluation software are present in the browser-based EXIN Cloud Computing Foundation CLOUDF practice test. All operating systems can be used to take the CLOUDF browser-based practice exam.</p> <p><span style="display:block; color:#3d79c7; background:#F2EF12; border: 0.5px solid #AED6F1 ; border-left: 3px solid #3498DB; padding: .6em; border-radius: 6px;"><span style="font-family:Times New Roman,Times,serif;">Use Exin CLOUDF Exam Questions for Fast Preparation:</span></span></p> <p style="text-align:justify">With the EXIN Cloud Computing Foundation CLOUDF dumps PDF, you can study with EXIN Cloud Computing Foundation CLOUDF actual exam questions from smartphones, tablets, and laptops. Since the CLOUDF dumps PDF works on smart devices, therefore, you easily utilize spare time for the EXIN Cloud Computing Foundation CLOUDF certification exam preparation. Moreover, <a target="_blank" rel="nofollow noopener" href="https://www.dumpskey.com/">DumpsKey</a> also provides up to three months of free EXIN Cloud Computing Foundation CLOUDF real dumps updates if there is any tweak in the CLOUDF exam questions syllabus.</p> <p><span style="display:block; color:#3d79c7; background:#F2EF12; border: 0.5px solid #AED6F1 ; border-left: 3px solid #3498DB; padding: .6em; border-radius: 6px;"><span style="font-size:20px;"><span style="font-family:Times New Roman,Times,serif;">Purchase Exin CLOUDF Dumps and Get 25% Discount - Use Coupon Code: </span><span new="" roman="" style="background-color: rgb(0, 0, 0); font-family: " times="">SAVE25</span></span></span></p> <p><span style="display:block; color:#3d79c7; background:#F2EF12; border: 0.5px solid #AED6F1 ; border-left: 3px solid #3498DB; padding: .6em; border-radius: 6px;">Visit For More Information: <a target="_blank" rel="nofollow noopener" href="https://www.dumpskey.com/exin/cloudf-braindumps">https://www.dumpskey.com/exin/cloudf-braindumps</a></span></p> <p style="text-align: center;"><a target="_blank" rel="nofollow noopener" href="https://www.dumpskey.com/exin/exin-cloudf-dumps-pdf"><img width="100%" src="https://i.imgur.com/2uyJiGV.jpg" alt="Banner"/></a></p> <p><span style="display:block; color:#3d79c7; background:#F2EF12; border: 0.5px solid #AED6F1 ; border-left: 3px solid #3498DB; padding: .6em; border-radius: 6px;"><span style="font-family:Times New Roman,Times,serif;">Dumpskey CLOUDF Questions – Regularly Updated According to the Original Exin Test Content:</span></span></p> <p style="text-align:justify"> CLOUDF exam dumps for the <a target="_blank" rel="nofollow noopener" href="https://www.dumpskey.com/how-to-pass-exin-certification-exam">Exin Certification Exam</a> preparation material come with up to three months of free updates. Plus, you can test features of EXIN Cloud Computing Foundation CLOUDF exam questions by trying a free demo. Since these formats are based on the current CLOUDF practice test content, therefore, you can easily crack the CLOUDF exam questions without worries. But if you fail in the EXIN Cloud Computing Foundation CLOUDF exam dumps, we will refund you according to terms and conditions.</p> <p style="text-align:justify">Best of Luck!!!</p> Brenda_Swift tag:crieit.net,2005:PublicArticle/16561 2021-01-07T22:16:40+09:00 2021-01-07T22:25:06+09:00 https://crieit.net/posts/markdown-pdf-not-decorated-code-20210107 markdown-pdf でログ等の装飾をなくす <p>Markdown で書いたドキュメントを PDF に変換する際には <a target="_blank" rel="nofollow noopener" href="https://www.npmjs.com/package/markdown-pdf">markdown-pdf</a> を利用しています。</p> <p>通常プログラムのコード等ではシンタックスハイライトで見やすくなるはずの装飾が、ログではかえって逆効果の場合があります。そうした場合に装飾を削るための Tips をメモしておきます。</p> <h2 id="経緯"><a href="#%E7%B5%8C%E7%B7%AF">経緯</a></h2> <p><code>markdown-pdf</code> はコードの装飾に highlight.js を利用しているようですが、これがかえって逆効果のことも。</p> <p>例えば、以下のようなログがあったとします。</p> <pre><code>[DDD mmm dd hh:ii:ss.mmmmmm yyyy] [mpm_event:notice] [pid 27078:tid 000000000000000] AH00493: SIGUSR1 received. Doing graceful restart AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 192.0.2.1. Set the 'ServerName' directive globally to suppress this message [DDD mmm dd hh:ii:ss.mmmmmm yyyy] [lbmethod_heartbeat:notice] [pid 27078:tid 000000000000000] AH02282: No slotmem from mod_heartmonitor [DDD mmm dd hh:ii:ss.mmmmmm yyyy] [mpm_event:notice] [pid 27078:tid 000000000000000] AH00489: Apache/X.X.XX (centos) OpenSSL/Y.Y.YY configured -- resuming normal operations [DDD mmm dd hh:ii:ss.mmmmmm yyyy] [core:notice] [pid 27078:tid 000000000000000] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND' </code></pre> <p>これを以下のような Markdown として記述して <code>markdown-pdf</code> にかけます。</p> <pre><code>``` [DDD mmm dd hh:ii:ss.mmmmmm yyyy] [mpm_event:notice] [pid 27078:tid 000000000000000] AH00493: SIGUSR1 received. Doing graceful restart AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 192.0.2.1. Set the 'ServerName' directive globally to suppress this message [DDD mmm dd hh:ii:ss.mmmmmm yyyy] [lbmethod_heartbeat:notice] [pid 27078:tid 000000000000000] AH02282: No slotmem from mod_heartmonitor [DDD mmm dd hh:ii:ss.mmmmmm yyyy] [mpm_event:notice] [pid 27078:tid 000000000000000] AH00489: Apache/X.X.XX (centos) OpenSSL/Y.Y.YY configured -- resuming normal operations [DDD mmm dd hh:ii:ss.mmmmmm yyyy] [core:notice] [pid 27078:tid 000000000000000] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND' ``` </code></pre> <p>すると……</p> <p><a href="https://crieit.now.sh/upload_images/58f73ce903f626c8a032a095694660775ff709799e832.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/58f73ce903f626c8a032a095694660775ff709799e832.jpg?mw=700" alt="言語指定しない場合の pre code の表示" /></a></p> <p>文字色が変わったり、数字は緑色になっていたりします。このくらいのログならば良いのですが、もっと長いものや、別のフォーマットのログだと次の <code>bash</code> 指定した際のログのように意図しない場所で文字サイズが変わってしまったりするので、非常に見づらくなってしまうケースもありました。</p> <pre><code>```bash [DDD mmm dd hh:ii:ss.mmmmmm yyyy] [mpm_event:notice] [pid 27078:tid 000000000000000] AH00493: SIGUSR1 received. Doing graceful restart AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 192.0.2.1. Set the 'ServerName' directive globally to suppress this message [DDD mmm dd hh:ii:ss.mmmmmm yyyy] [lbmethod_heartbeat:notice] [pid 27078:tid 000000000000000] AH02282: No slotmem from mod_heartmonitor [DDD mmm dd hh:ii:ss.mmmmmm yyyy] [mpm_event:notice] [pid 27078:tid 000000000000000] AH00489: Apache/X.X.XX (centos) OpenSSL/Y.Y.YY configured -- resuming normal operations [DDD mmm dd hh:ii:ss.mmmmmm yyyy] [core:notice] [pid 27078:tid 000000000000000] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND' ``` </code></pre> <p><a href="https://crieit.now.sh/upload_images/43998a2ff90278af2617710c9fdb79fc5ff709852e39c.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/43998a2ff90278af2617710c9fdb79fc5ff709852e39c.jpg?mw=700" alt="言語を bash に指定した場合の pre code の表示" /></a></p> <h2 id="対処"><a href="#%E5%AF%BE%E5%87%A6">対処</a></h2> <p>今回は自前 css と独自言語設定でこれらの装飾を外しました。</p> <pre><code>```plain [DDD mmm dd hh:ii:ss.mmmmmm yyyy] [mpm_event:notice] [pid 27078:tid 000000000000000] AH00493: SIGUSR1 received. Doing graceful restart AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 192.0.2.1. Set the 'ServerName' directive globally to suppress this message [DDD mmm dd hh:ii:ss.mmmmmm yyyy] [lbmethod_heartbeat:notice] [pid 27078:tid 000000000000000] AH02282: No slotmem from mod_heartmonitor [DDD mmm dd hh:ii:ss.mmmmmm yyyy] [mpm_event:notice] [pid 27078:tid 000000000000000] AH00489: Apache/X.X.XX (centos) OpenSSL/Y.Y.YY configured -- resuming normal operations [DDD mmm dd hh:ii:ss.mmmmmm yyyy] [core:notice] [pid 27078:tid 000000000000000] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND' ``` </code></pre> <p>言語指定に独自の <code>plain</code> を指定。</p> <pre><code class="css">pre { padding: .5rem; } pre code { margin: 0; padding: 0; white-space: pre; border: none; background: transparent; } pre[class*="language-plain"], code[class*="language-plain"], pre[class*="language-plain"] > *, code[class*="language-plain"] > * { color: #000 !important; font-size: 0.8rem !important; font-weight: normal !important; font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; } </code></pre> <p>ついでに Scss 版も。</p> <pre><code class="scss">pre { padding: .5rem; code { margin: 0; padding: 0; white-space: pre; border: none; background: transparent; } } pre[class*="language-plain"], code[class*="language-plain"] { &, & > * { color: #000 !important; font: { size: 0.8rem !important; weight: normal !important; family: Consolas, "Liberation Mono", Menlo, Courier, monospace; } } } </code></pre> <p>この css (仮に <code>./src/md/css/style.css</code> とします)を以下のように <code>markdown-pdf</code> に処理させます。</p> <pre><code class="javascript">const markdownpdf = require('markdown-pdf'); markdownpdf( { cssPath: './src/md/css/style.css', remarkable: { html: true, breaks: true } } ) .from('./src/md/hoge.md') .to('./dist/hoge.pdf'); </code></pre> <p>これで以下のような表示が得られました。</p> <p><a href="https://crieit.now.sh/upload_images/cf02155a443f9029f160cdce63bdb4cd5ff70992b3397.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/cf02155a443f9029f160cdce63bdb4cd5ff70992b3397.jpg?mw=700" alt="言語を plain (独自指定) に指定した場合の pre code の表示" /></a></p> <p>とりあえず読めるようにはなったかな、と。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://ja.stackoverflow.com/questions/55482/markdown-pdf%E3%82%92%E3%81%A4%E3%81%8B%E3%81%A3%E3%81%A6markdown%E3%82%92html%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%97%E3%81%9F%E9%9A%9B%E3%81%AE%E5%86%85%E5%AE%B9%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">vscode - markdown-pdfをつかってmarkdownをhtmlファイルに変換した際の内容について - スタック・オーバーフロー</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://logicalbeat.jp/blog/3769/">【ドキュメント】Markdownドキュメントのデザインをロジカルビート風にしてみた – 株式会社ロジカルビート</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/reona396/items/8ad9a4ca59f10257e073">VS CodeとMarkdownで書いた技術同人誌に導入したCSS組版 - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://h-s-hige.hateblo.jp/entry/20190405/1554467885">【Visual Studio Code】Markdown PDF のスタイル(CSS)を変える方法 - Nekonote</a></li> </ul> <h2 id="余談"><a href="#%E4%BD%99%E8%AB%87">余談</a></h2> <p>今回の対処をする際に久々に npm で <code>markdown-pdf</code> を確認したのですが、いくつかの依存パッケージが out of date になってしまっていますね……これはそもそも他の方法を考えなければならない気がします。というか未だに PhantomJS を使っているっぽい……?</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://dev.classmethod.jp/articles/md-to-pdf/">MarkdownをPDFに変換する「md-to-pdf」は痒いところに手が届く素敵ツール | Developers.IO</a></li> </ul> <p>検索したところ、 <code>md-to-pdf</code> が引っかかりました。アクティブそうなのでこちらに乗り換えるのも検討ですかね。</p> arm-band tag:crieit.net,2005:PublicArticle/16073 2020-09-26T18:32:22+09:00 2020-12-11T23:17:39+09:00 https://crieit.net/posts/PDF-Python [Python]PDFから特定の文字列を抽出&ページを画像として保存するツール <h2 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h2> <p>「<a target="_blank" rel="nofollow noopener" href="https://tonari-it.com/community-nonpro-semi/">ノンプロ研</a>」というコミュニティで開催されている講座で使用する目的で作りました。<br /> 毎回講座の資料が講師の方から共有してもらえるので、それを演習問題のページだけを抜き出して画像保存するツールです。</p> <p>PDF資料から特徴のあるページだけを抽出するような作業を行いたい場合は、抽出キーワードを変えると使えるかもしれません。</p> <p>ただどうも文字抽出が上手くできるかどうかは元のPDFファイルによるものが多く、必ずしもできる訳ではなさそうなので注意が必要です。</p> <h2 id="使い方"><a href="#%E4%BD%BF%E3%81%84%E6%96%B9">使い方</a></h2> <ul> <li>必要なライブラリのインストールをしておいてください(次の項目参照)。</li> <li>準備したい講座回数(<code>NO</code>)、資料PDFファイルの名(<code>FILES</code>)とフォルダパス(<code>PDF_DIRPATH</code>)、画像出力先フォルダのパス(<code>OUTPUT_DIRPATH</code>)をスクリプトに記入してください</li> <li>スクリプトを実行して少し待つと、該当する講座の資料から演習ページだけ画像の保存が行われます(pngファイル)</li> <li>同時に演習をテキストで抜き出したものがテキストファイルで保存されます</li> </ul> <p><a href="https://crieit.now.sh/upload_images/495dde582b6e0fa537533d7f10134da85f6efce5cdd8f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/495dde582b6e0fa537533d7f10134da85f6efce5cdd8f.png?mw=700" alt="image" /></a></p> <h2 id="使用しているPythonライブラリについて"><a href="#%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%81%84%E3%82%8BPython%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">使用しているPythonライブラリについて</a></h2> <ul> <li>PDFから文字列を抽出する<code>pdfminer.six</code></li> <li>PDFを画像保存する<code>pdf2image</code></li> </ul> <p>これらを使っています。<br /> また<code>pdf2image</code> を使うには、依存関係のある<code>pillow</code>と<code>Poppler</code>というライブラリも必要のようです。</p> <h2 id="スクリプトの解説"><a href="#%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%AE%E8%A7%A3%E8%AA%AC">スクリプトの解説</a></h2> <h3 id="(1)ライブラリのインポート"><a href="#%EF%BC%881%EF%BC%89%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88">(1)ライブラリのインポート</a></h3> <pre><code class="python">import pathlib import re from io import StringIO from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.converter import TextConverter from pdfminer.layout import LAParams from pdfminer.pdfpage import PDFPage import pdf2image </code></pre> <h3 id="(2)ユーザー入力項目"><a href="#%EF%BC%882%EF%BC%89%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E5%85%A5%E5%8A%9B%E9%A0%85%E7%9B%AE">(2)ユーザー入力項目</a></h3> <p>このツールを使用する前に、変換したいPDFファイルやディレクトリをユーザー自身で指定します。<br /> ユーザーが入力する部分は、グローバルな定数としてまとめてあります。<br /> (パス取得のスクリプトがまだやや冗長な気がしています)</p> <pre><code class="python"># ユーザー入力項目 # 準備したい講座回数・PDFファイル名をリストに記入 NO = 3 FILES = [ '20200923初心者講座Pythonコース-01.pdf', '20200930初心者講座Pythonコース-02.pdf', '20201007初心者講座Pythonコース-03.pdf', ] # 資料PDFファイルが保存されているフォルダのパスを記入 PDF_DIRPATH = pathlib.Path( '<pdfファイルのあるフォルダのパス>' ) PDF_FILEPATH = PDF_DIRPATH / FILES[NO-1] # 出力先フォルダのパス OUTPUT_DIRPATH = pathlib.Path( '<変換した画像を保存したいフォルダのパス>' ) # 抽出する文字列(正規表現:ここでは「演習○-○」) SEARCH_TEXT = r'演習\s*\d-\d+' </code></pre> <p>Python標準ライブラリの<code>pathlib</code>を使って、パスを記述しています。<br /> <code>pathlib.Path(<パス文字列>)</code>とすることで、Pathオブジェクトを作成しています。</p> <p>このPathオブジェクトを活用すると、パス同士を<code>/</code>記号を使って結合することができます。<br /> ちなみにこのスクリプトでは<code>PDF_DIRPATH</code>がPathオブジェクト・<code>PDF_DIRPATH</code>はstr型のオブジェクトですが、このように一方がPathオブジェクトなら、文字列が混ざっていても<code>/</code>でパスとして結合することもできるようですね。</p> <h4 id="(参考)pathlibモジュールとosモジュール"><a href="#%28%E5%8F%82%E8%80%83%29pathlib%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%A8os%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB">(参考)pathlibモジュールとosモジュール</a></h4> <p>どちらもPython標準ライブラリです。<br /> Python3.4以前ではファイルパス操作に<code>os.path</code>や<code>glob</code>モジュールを使っていたようですが、<br /> Python3.4で<code>pathlib</code>モジュールが追加されてからは、こちらを使う方がシンプルに書きやすくなったようです。</p> <h3 id="(3)正規表現にマッチするページとテキストを抽出する関数"><a href="#%EF%BC%883%EF%BC%89%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E3%81%AB%E3%83%9E%E3%83%83%E3%83%81%E3%81%99%E3%82%8B%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%A8%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E6%8A%BD%E5%87%BA%E3%81%99%E3%82%8B%E9%96%A2%E6%95%B0">(3)正規表現にマッチするページとテキストを抽出する関数</a></h3> <p>PDFファイルから、(2)で指定した「抽出する文字列」(ここでは演習問題)に該当するページを、ページ数とテキストとして抽出する関数を作ります。<br /> ここで画像からテキスト抽出できる<code>pdfminer.six</code>ライブラリを活用しています。</p> <p>長い関数ですが、戻り値としては<code>output_texts</code>変数で、これは「キーにページ番号、値に演習問題ナンバーとテキストが格納されたdict」となっています。</p> <pre><code class="python">def get_text_from_pdf(): """PDFファイルから演習問題に該当するテキストをページ数と共に抽出する関数 Returns: output_texts(dict): 演習問題一覧。ページ数をキーとして、演習ナンバーと本文が入った辞書 """ # pdfminerの設定 rsrcmgr = PDFResourceManager() codec = 'utf-8' laparams = LAParams() laparams.detext_vertical=True # PDFファイルを1ページずつ見て該当するかチェック output_texts = {} # 該当するページ数とテキストを格納するdict with open(PDF_FILEPATH, 'rb') as fp: for i, page in enumerate(PDFPage.get_pages(fp)): outfp = StringIO() device = TextConverter( rsrcmgr, outfp, codec=codec, laparams=laparams ) interpreter = PDFPageInterpreter(rsrcmgr, device) interpreter.process_page(page) extracted_text = outfp.getvalue() \ .replace('\u2028', '') \ .split('Copyright')[0] \ .rstrip() # ページ抽出:抽出条件(演習問題のページ)に該当すればTrue extracted_page = re.search(SEARCH_TEXT, extracted_text) # 演習問題のページ番号・演習番号・テキストを格納したdict作成 if extracted_page: output_texts[i+1] = (extracted_page.group(), extracted_text) return output_texts </code></pre> <p>処理としては<br /> 「PDFファイルを1ページずつ見ていって、<code>SEARCH_TEXT</code>に一致するページが出てきたら、ページ番号とテキストを変数<code>output_texts</code>に格納する」<br /> というような処理を行っています。</p> <h4 id="PDFMinerについて"><a href="#PDFMiner%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">PDFMinerについて</a></h4> <p>仕組みやスクリプトをを完璧に理解しきれていませんが、<a target="_blank" rel="nofollow noopener" href="https://qiita.com/wagahaiCAT/items/63489b6ec6c0c3559886">こちらの記事</a>を参考にさせていただきました。<br /> 出来上がったスクリプトでは、for文の外と中にそれぞれ設定項目を分けて記述しています(かえってわかりづらくしてしまっているかもしれません)。</p> <p>PDFファイルから文章を抽出する処理の流れは結構複雑で、そのまま抽出することはできないようです。<br /> PDFファイルからPDFParserを使ってPDFDocumentという形式に一旦変換して、そこからPDFInterpreter, PDFDeviceを使って翻訳し、テキストとして出力する、という流れかと思います。この後半の過程で、PDFResouceManagerにフォントやイメージなどのリソース情報を保管しています。<br /> (間違ってたらすみません)</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/mczkzk/items/894110558fb890c930b5">こちらの記事</a>に公式ドキュメントから引用された図解があるので、公式ドキュメントと合わせて参考にさせていただきました。</p> <h3 id="(4)抽出したページのテキストをファイルに保存する関数"><a href="#%EF%BC%884%EF%BC%89%E6%8A%BD%E5%87%BA%E3%81%97%E3%81%9F%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AE%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E4%BF%9D%E5%AD%98%E3%81%99%E3%82%8B%E9%96%A2%E6%95%B0">(4)抽出したページのテキストをファイルに保存する関数</a></h3> <p>(3)で作った<code>output_texts</code>をそのままテキストファイルに出力する関数です。<br /> ただdict型の変数をそのまま出力しているだけなので、かなり見づらいテキストファイルになっています。<br /> 整形して出力するようにしたいところ。</p> <pre><code class="python">def save_text(output_texts): """演習問題一覧をテキストファイル出力 Arg: output_texts(dict): 演習問題一覧。ページ数をキーとして、演習ナンバーと本文が入った辞書 """ output_text_path = OUTPUT_DIRPATH / f'0{NO}_ensyu.txt' with output_text_path.open('w') as f: print(output_texts, file=f) </code></pre> <p><code>print()</code>で<code>file</code>引数にここではテキストファイルのパスを指定することで、出力先をファイルに指定しています。</p> <h3 id="(5)抽出したページの画像を保存する関数"><a href="#%EF%BC%88%EF%BC%95%EF%BC%89%E6%8A%BD%E5%87%BA%E3%81%97%E3%81%9F%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AE%E7%94%BB%E5%83%8F%E3%82%92%E4%BF%9D%E5%AD%98%E3%81%99%E3%82%8B%E9%96%A2%E6%95%B0">(5)抽出したページの画像を保存する関数</a></h3> <p>PDFファイルを1ページずつ見ていって、抽出したいページだけを画像ファイルに保存する関数です。<br /> ここで<code>pdf2image</code>ライブラリを使用しています<br /> (3)で作った<code>output_texts</code>(dict型でした)に抽出したいページ数がキーとして入っているので、これを用いて抽出したいページかどうかを判定しています。</p> <pre><code class="python">def save_images(output_texts): """演習問題を画像ファイル出力 Arg: output_texts(dict): 演習問題一覧。ページ数をキーとして、演習ナンバーと本文が入った辞書 """ # - convert_from_path関数には1ページごとの画像のリストが入る # - mkidr(exist_ok=True)にすると上書きされるっぽい img_dirpath = OUTPUT_DIRPATH / f'0{NO}' pathlib.Path(img_dirpath).mkdir(exist_ok=True) images = pdf2image.convert_from_path(PDF_FILEPATH, size=1280) for i, image in enumerate(images): if i+1 in contents: filename = contents[i+1][0].replace(' ', '') image_filepath = img_dirpath / f'{filename}.png' image.save(image_filepath) </code></pre> <h4 id="pdf2imageについて"><a href="#pdf2image%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">pdf2imageについて</a></h4> <p>扱い方は簡単で、<code>pdf2image.convert_from_path()</code>の引数にPDFファイルパスを指定してやれば良さそうです。<br /> ここでは<code>size</code>引数でサイズを指定してみました。他の引数を使えば、pngファイルだけでなくjpgファイルなどファイル形式を指定することもできるようです。</p> <h3 id="(6)実行"><a href="#%EF%BC%88%EF%BC%96%EF%BC%89%E5%AE%9F%E8%A1%8C">(6)実行</a></h3> <p>以下で実行します。<br /> PDFファイルのページ数によっては、少し時間がかかってしまいます。</p> <pre><code class="python"># 実行 contents = get_text_from_pdf() save_text(contents) save_images(contents) </code></pre> <h2 id="参考にしたサイト"><a href="#%E5%8F%82%E8%80%83%E3%81%AB%E3%81%97%E3%81%9F%E3%82%B5%E3%82%A4%E3%83%88">参考にしたサイト</a></h2> <p>pdf2imageについて<br /> <a target="_blank" rel="nofollow noopener" href="https://qiita.com/kikuyan8540/items/35751c573de014df205b">PythonでPDFをまとめて画像に変換する - Qiita</a></p> <p>PDFMinerについて<br /> <a target="_blank" rel="nofollow noopener" href="https://qiita.com/wagahaiCAT/items/63489b6ec6c0c3559886">【Python】PDFの文章をページ毎にCSVに変換(2/24追記) - Qiita</a><br /> <a target="_blank" rel="nofollow noopener" href="https://qiita.com/mczkzk/items/894110558fb890c930b5">【PDFMiner】PDFからテキストの抽出 - Qiita</a></p> <h2 id="おわりに"><a href="#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</a></h2> <p>PDFを操作するのをやってみたくて、用途はないけど色々調べてたのが役に立ちました。<br /> 今回はシンプルなPDFファイルだったのでまだ良かったですが、複雑なレイアウトのPDFファイルを扱いたい場合はもっと泥臭い作業になるのかな…。</p> <p>ライブラリの使い方はあまり理解してないので、ちゃんと整理しておこうと思います。</p> <p>そして今回このツール制作を通じての課題。<br /> <strong>使い勝手が良くメンテナンス性の高いスクリプトにするにはどうすれば良いんだろう?</strong> というところに興味があります。<br /> サーバーにアップして誰でも使えるツールを作る…というのはちょっと難しく労力が大きいので、ローカルで実行すればすぐに使えるような形を意識してみました。</p> <p>ユーザーが入力するべきところ、変更の可能性があるところ(抽出する文字列)を定数としてグローバルスコープに書いているのですが、もっとスマートなやり方があるのかな、と思っています。<br /> 関数の使い方についても学んでいきたいです。</p> <h2 id="MEMO:スクリプト全文"><a href="#MEMO%3A%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E5%85%A8%E6%96%87">MEMO:スクリプト全文</a></h2> <p>スクリプト全文はこちらに載せました!<br /> <a target="_blank" rel="nofollow noopener" href="https://github.com/Massasquash/mytools/blob/master/20200925_pdf_to_pic/pdf_to_pic.py">mytools/pdf_to_pic.py at master · Massasquash/mytools · GitHub</a></p> Massa tag:crieit.net,2005:PublicArticle/16071 2020-09-25T02:54:21+09:00 2020-09-25T02:56:46+09:00 https://crieit.net/posts/Javascript-PDF JavascriptでPDFを作成するライブラリまとめと比較 <p><a href="https://crieit.now.sh/upload_images/72b6800e676458962e78520f80fde1905f6cdddc140c5.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/72b6800e676458962e78520f80fde1905f6cdddc140c5.png?mw=700" alt="image" /></a><br /> はじめまして。<br /> <a target="_blank" rel="nofollow noopener" href="https://labelmake.jp/">PDFの作成サービス</a>を個人で運用しており、数万ページのPDFを作成しており、<a target="_blank" rel="nofollow noopener" href="https://github.com/hand-dot/labelmake">JavascriptでのPDFの作成ライブラリ</a>を作ったりでそれなりに詳しくなってきたのでこの記事を作成しました。笑</p> <p>Javascriptで扱えるPDFのライブラリーはいくつかあります。しかし、実際どれを使えばいいのかわかりにくいので、それらを比較しながら紹介していきます。</p> <p>UMDモジュールとして提供されていて、近年のフロントエンド(TypeScript/Webpack/React/etc.)で扱いやすい?Nodeとブラウザーで動く?型はあるか?日本語フォントは使えるのか?という観点でも比較していきます。</p> <p><strong>この記事ではJavascriptで扱えるPDF作成ライブラリーで「どれを採用するか」ということで悩んでいる時に、用途に合ったライブラリを発見することができるようにします。</strong></p> <h2 id="PDFKit"><a href="#PDFKit">PDFKit</a></h2> <p><a href="https://crieit.now.sh/upload_images/287fd18c57a76a8f56e19136fce9d4bb5f6cda03acf7b.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/287fd18c57a76a8f56e19136fce9d4bb5f6cda03acf7b.png?mw=700" alt="image" /></a></p> <p><a target="_blank" rel="nofollow noopener" href="https://pdfkit.org/">公式サイト:https://pdfkit.org/</a></p> <p><strong>PDFKitはJavascriptでPDFを作成するライブラリの元祖的存在。</strong> フォントの埋め込みや画像の埋め込みもできます。開発が2012年から行われており古いですが、今でもメンテナンスが行われております。多少複雑ですがNodeだけでなく、 <a target="_blank" rel="nofollow noopener" href="https://github.com/foliojs/pdfkit#browser-usage">Webpackを利用してブラウザで動かすことも可能です。</a></p> <p>下記に紹介するライブラリでもPDFKitのラッパーとして作成されたものや、プログラムを参考にしているものもあり、フォントの埋め込みも含めてJavascriptでPDF作成を行うというパワープレーを最初に成し遂げたライブラリと言うだけあってすごいライブラリです。</p> <p>よくない点をあげるなら、高レベルのAPIを提供していないで操作に慣れるまでに一定の学習が必要です。最初はデザインがしづらく、記述が複雑になりがちです。</p> <div class="table-responsive"><table> <thead> <tr> <th>ポイント</th> <th>評価</th> </tr> </thead> <tbody> <tr> <td>Nodeとブラウザーで動く</td> <td>△(若干手間)</td> </tr> <tr> <td>型はあるか</td> <td>○(DefinitelyTyped)</td> </tr> <tr> <td>日本語フォントは使えるのか</td> <td>○(ブラウザで使う場合は要注意)</td> </tr> <tr> <td>使いやすさ</td> <td>△プログラムの手続きが複雑</td> </tr> </tbody> </table></div> <hr /> <h2 id="pdfmake"><a href="#pdfmake">pdfmake</a></h2> <p><a href="https://crieit.now.sh/upload_images/2647ea287bd70147a7e7f1bc0ef4fe4e5f6cda73ce101.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/2647ea287bd70147a7e7f1bc0ef4fe4e5f6cda73ce101.png?mw=700" alt="image" /></a></p> <p><a target="_blank" rel="nofollow noopener" href="http://pdfmake.org/">公式サイト:http://pdfmake.org/</a></p> <p><strong>上記で紹介したPDFKitのラッパーとして作成されたのがpdfmakeです。 PDFKitとの違いはPDFKitが命令的なプログラミング操作のAPIを提供しているのに対して、pdfmakeは宣言的でレイアウトによる計算をpdfmakeが行ってくれるためプログラムが比較的少なくなります。</strong></p> <p>PDFKitの改良版としてGithubでのスター数はpdfmakeの方が多く、Web上でも様々な使い方や例があり、人気のライブラリということがわかります。また、画像の埋め込みはもちろん、QRコード,SVGのレンダリングなどの機能もあります。</p> <p>実際にPDFkitと比較した時にその使いやすさから本サービスのlabelmake.jpも当初はpdfmakeを利用してPDFファイルを作成しておりました。</p> <p>しかし、</p> <ul> <li>独自フォントの作成し、利用する時にWebpack利用時にハマりどころがある</li> <li>独自フォントはbase64エンコードされたttfが利用できるが日本語フォントの場合に巨大になり、メモリを大量に消費する</li> </ul> <p>と言う点がネックになり、途中で後で紹介するpdf-libというものに切り替えています。</p> <p>Web上には様々な例があるため、トライアンドエラーを繰り返しながらなんとかなるとは思いますが、Webpackやtypescriptを使った最新のフロントエンドではハマりどころが多く、その手の記事が無かったりするので注意が必要です。 また、日本語フォントを利用する際は一度gitのrepositoryをクローンしてからフォント作成スクリプトを使ってビルドする必要があります。</p> <div class="table-responsive"><table> <thead> <tr> <th>ポイント</th> <th>評価</th> </tr> </thead> <tbody> <tr> <td>Nodeとブラウザーで動く</td> <td>△(Webpackなどを利用している場合はハマる)</td> </tr> <tr> <td>型はあるか</td> <td>○(DefinitelyTyped)</td> </tr> <tr> <td>日本語フォントは使えるのか</td> <td>△(自前でビルドが必要)</td> </tr> <tr> <td>使いやすさ</td> <td>○(宣言的でpdfmakeのレイアウトエンジンが利用可能)</td> </tr> </tbody> </table></div> <hr /> <h2 id="jsPDF"><a href="#jsPDF">jsPDF</a></h2> <p><a href="https://crieit.now.sh/upload_images/cfed57cc5b84c8c2d1910334c10275fd5f6cda89bd93d.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/cfed57cc5b84c8c2d1910334c10275fd5f6cda89bd93d.png?mw=700" alt="image" /></a></p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/MrRio/jsPDF">公式サイト:https://github.com/MrRio/jsPDF</a></p> <p><strong>jsPDFは上記のPDFKitとは別に独自にPDF作成ができるライブラリです。 この記事で紹介するライブラリの中で一番スター数が多く、比較的安定してメンテナンスされています。</strong></p> <p>node,ブラウザーで利用できるUMDモジュールも提供されています。(nodeで保存する場合はカレントディレクトリに保存されるので使い勝手悪いかもです)</p> <p>命令的な操作ができるAPIが提供されており、複雑な帳票をプログラムする場合は難易度が高い印象です。</p> <p>また、日本語を扱う場合は日本語のフォントを読み込ませる必要がありますが、ここにハマりどころがあるようです。<br /> 詳細は下記の記事にまとまっています</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/JunichiWatanuki/items/07bcb842e5532068fd62">jsPDFで、無理やり日本語出力を行ってみる </a></li> <li><a target="_blank" rel="nofollow noopener" href="https://blog.ver001.com/javascript-jspdf-japanese/">JavaScriptでjsPDFを使ってPDFファイルを生成する(日本語対応)</a></li> </ul> <p>上記を参考にしていただければわかりますが、日本語フォントを扱うための方法はありますが、一手間必要になります。(ttfファイルの変換が必要)</p> <p>できることは多いのですが、上記で説明したように操作が命令的でなため、使いこなすには一定のインプットが必要になります。(幸いにもリッチなドキュメントがあります <a target="_blank" rel="nofollow noopener" href="https://rawgit.com/MrRio/jsPDF/master/docs/index.html">https://rawgit.com/MrRio/jsPDF/master/docs/index.html</a>)<br /> また、英語の記事も多く人気なのは間違いないと思います。</p> <p>ドキュメントを参考にして自分の用途に合った操作ができる場合はおすすめできます。(ドキュメントみた感じだとAcroFormとかできちゃいます。ヤバイな)</p> <div class="table-responsive"><table> <thead> <tr> <th>ポイント</th> <th>評価</th> </tr> </thead> <tbody> <tr> <td>Nodeとブラウザーで動く</td> <td>○(<a target="_blank" rel="nofollow noopener" href="https://github.com/MrRio/jsPDF#typescriptangularwebpackreactetc-configuration">参考</a>)</td> </tr> <tr> <td>型はあるか</td> <td>○</td> </tr> <tr> <td>日本語フォントは使えるのか</td> <td>○(ttfファイルの変換が必要)</td> </tr> <tr> <td>使いやすさ</td> <td>△プログラムの手続きが複雑</td> </tr> </tbody> </table></div> <hr /> <h2 id="pdf-lib"><a href="#pdf-lib">pdf-lib</a></h2> <p><a href="https://crieit.now.sh/upload_images/aeb78cf46f1fadacd773efbc17dc76e35f6cdaa3bde4f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/aeb78cf46f1fadacd773efbc17dc76e35f6cdaa3bde4f.png?mw=700" alt="image" /></a></p> <p><a target="_blank" rel="nofollow noopener" href="https://pdf-lib.js.org/">公式サイト:https://pdf-lib.js.org/</a></p> <p><strong>pdf-libはPDFKitを参考にTypescriptで実装されたPDFの作成、編集ライブラリです。 他のライブラリに比べて後発でリリースされたライブラリですが、非常によくできており、もちろんnode,ブラウザで動作します。また、PDFの結合、分割や埋め込みをサポートし、他のライブラリにない機能を持っていますが、ライブラリとしてシンプルで強力です。</strong></p> <p><strong>他のライブラリと比較して大きく違う点がフォントファイルを埋め込む際に<code>Uint8Array</code>,<code>ArrayBuffer</code>が使用できる</strong>ので、nodeの場合は<code>fs</code>で、ブラウザの場合は<code>xhr</code>を使ってフォントファイルを読み込むことができます。日本語の馬鹿でかいbase64のファイルを読み込む必要がなくなり、パフォーマンス的にも優れています。</p> <p>もちろん、Webpackなどで利用でき、ドキュメントも充実しています。 本サービスのlabelmake.jpも当初はpdfmakeを利用していましたが、途中からパフォーマンスの観点でPDF作成処理をpdf-libに行わせるよう変更しました。</p> <p>欠点としては提供されているAPIが命令的なため複雑な帳票の場合、プログラムが複雑になってしまうという点と考えています。また<strong>レイアウトについてはpdf-libは責務を持たず、ユーザーに計算させるという方針ですので、中央揃えや右揃えなどのレイアウトはできません。</strong>あと地味ですが、位置情報の単位が<code>pt</code>なので、位置を指定する時に若干面倒です。</p> <p>個人的には後に紹介するlabelmakeを除くライブラリに比べて一番扱いやすく、パフォーマンスの観点でも優秀だと考えています。</p> <p>まだ日本語での記事数はpdfmake,jsPDFと比べると少ないのですが、帳票が比較的シンプルでモダンな環境での開発の場合は参考にしてみてください。おすすめです。</p> <div class="table-responsive"><table> <thead> <tr> <th>ポイント</th> <th>評価</th> </tr> </thead> <tbody> <tr> <td>Nodeとブラウザーで動く</td> <td>○</td> </tr> <tr> <td>型はあるか</td> <td>○</td> </tr> <tr> <td>日本語フォントは使えるのか</td> <td>○</td> </tr> <tr> <td>使いやすさ</td> <td>△プログラムの手続きが複雑+レイアウトの計算は自分で行う必要がある</td> </tr> </tbody> </table></div> <hr /> <h2 id="labelmake"><a href="#labelmake">labelmake</a></h2> <p><a href="https://crieit.now.sh/upload_images/c2fcbd38933cf75273dc378858f1da235f6cdab902f0f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/c2fcbd38933cf75273dc378858f1da235f6cdab902f0f.png?mw=700" alt="image" /></a></p> <p><a target="_blank" rel="nofollow noopener" href="https://labelmake.jp/javascript-pdf-generator-library">公式サイト:https://labelmake.jp/javascript-pdf-generator-library</a></p> <p><strong>labelmakeはpdf-libのラッパーとして筆者が開発しました。 特徴としてはpdf-libを使っている人はレイアウトは自分で計算する必要がありましたが、位置情報の単位をmmにし、alignment,line-heightなどのレイアウトの計算を行い、宣言的にデータでPDFを作成できるようにAPIをデザインしました。</strong> また既存のPDFをベースとして読み込んでそこに入力項目を足すことができます。</p> <p>コードの例は<a target="_blank" rel="nofollow noopener" href="https://labelmake.jp/javascript-pdf-generator-library/example">こちらからご覧になれます。</a><br /> スキーマがあるので、テンプレート的に帳票生成などに利用ができます。</p> <p>帳票のデザインデータをJSONで管理できる点も複数のテンプレートを利用する際には読み込みがシンプルになり利用しやすいです。</p> <p>pdf-libのメリットのフォントのデータで<code>Uint8Array</code>,<code>ArrayBuffer</code>が使用できる点や、PDFファイルの埋め込みができる点を利用して効率的に複雑な帳票が作成できるようにしています。</p> <p><strong>また、<a target="_blank" rel="nofollow noopener" href="https://labelmake.jp/javascript-pdf-generator-library/template-design">こちらのTemplate Design & Code Generator</a>を使い、帳票のデザインと、実行可能コードの生成を行うことができます。</strong></p> <p><a href="https://crieit.now.sh/upload_images/fa948ee1c0bf1cf7c5b8b90d55e0e6f15f6cdad97418f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/fa948ee1c0bf1cf7c5b8b90d55e0e6f15f6cdad97418f.png?mw=700" alt="image" /></a></p> <p>ポジショントークにならないようにしたいと思いますが、既存のPDFファイルに対して入力項目を設定する形で帳票が作成でき、実際に本サービスでは現時点で様々なテンプレートをつかってPDFを作成しています。</p> <p>デメリットとしてはまだ利用者も少なく、有名なライブラリではありません。<br /> 日本語フォントで利用していますが、他にも自分のサービスだけでは見つけられなかったバグがあるかもしれません。</p> <p><strong>そして、自由に0から帳票すると言うよりは既存のPDFをもとに入力項目を設置するという使い方がハマります。(俗に言うバリアブル印刷というやつです)<br /> 他のJavascriptのPDF作成ライブラリと比較しても、用途が合っている場合は、我ながらよくできていると思っていますので、ぜひスターやシェアをしていただけると嬉しいです 笑</strong></p> <div class="table-responsive"><table> <thead> <tr> <th>ポイント</th> <th>評価</th> </tr> </thead> <tbody> <tr> <td>Nodeとブラウザーで動く</td> <td>○</td> </tr> <tr> <td>型はあるか</td> <td>○</td> </tr> <tr> <td>日本語フォントは使えるのか</td> <td>○</td> </tr> <tr> <td>使いやすさ</td> <td>○</td> </tr> </tbody> </table></div> <hr /> <h2 id="番外編"><a href="#%E7%95%AA%E5%A4%96%E7%B7%A8">番外編</a></h2> <h3 id="PDF.js"><a href="#PDF.js">PDF.js</a></h3> <p><a href="https://crieit.now.sh/upload_images/d4c455428e1bc1bcb7f22658c09c4adb5f6cdaf202c18.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d4c455428e1bc1bcb7f22658c09c4adb5f6cdaf202c18.png?mw=700" alt="image" /></a></p> <p><a target="_blank" rel="nofollow noopener" href="https://mozilla.github.io/pdf.js/">公式サイト:https://mozilla.github.io/pdf.js/</a></p> <p>よく間違えられるのですが、非常に有名なライブラリなので紹介します。<br /> PDF.jsはPDFのレンダリングライブラリで、PDFの作成ライブラリではありません。<br /> PDFを表示するだけでなく、PDFのレンダリング結果をcanvasに転写し、PDFのレンダリング画像を取得することができます。</p> <p>Webpack用のビルドもバンドルされており、最近のフロントエンドの環境でも利用可能です。</p> <hr /> <h3 id="Puppeteer"><a href="#Puppeteer">Puppeteer</a></h3> <p><a href="https://crieit.now.sh/upload_images/6fc4effa9a96db29ebd3ba9a1351a1ae5f6cdb0ba9c4e.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6fc4effa9a96db29ebd3ba9a1351a1ae5f6cdb0ba9c4e.png?mw=700" alt="image" /></a></p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/puppeteer/puppeteer">公式サイト:https://github.com/puppeteer/puppeteer</a></p> <p>GoogleのPuppeteerでもPDFファイルの作成が可能です。<br /> テンプレートはhtmlとして管理する必要がありますが、Webの開発者なら装飾も行いやすいかと思います。</p> <p>実装は下記の記事が参考になります。<br /> - <a target="_blank" rel="nofollow noopener" href="https://dev.to/damcosset/generate-a-pdf-from-html-and-back-on-the-front-5ff5">Generate a PDF from HTML with puppeteer<br /> </a><br /> - <a target="_blank" rel="nofollow noopener" href="https://uyamazak.hatenablog.com/entry/2018/02/08/192304">Headless Chrome + puppeteerを使ったHTML→PDF変換サーバーを作る puppeteer編</a></p> <p>バックエンドの実装が必要になるのと、PDF作成するまでにPuppeteerが起動するオーバーヘッドがありますが、それらが問題ない場合で、htmlでデザインしたいと言う場合には選択肢になるかもしれません。(可変のテーブルなどはデザインしやすいかと思います。)</p> <hr /> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>番外編を除く下記の5つのライブラリを紹介させていただきました。</p> <ol> <li>PDFKit</li> <li>pdfmake</li> <li>jsPDF</li> <li>pdf-lib</li> <li>labelmake</li> </ol> <p>参考になったでしょうか?<br /> 筆者はpdf-lib押しです。パフォーマンスも良く、レイアウトの計算が面倒ですがモダンなフロントエンド環境でも使いやすいです。</p> <p>あとは、遊びでも構わないのでlabelmakeを触っていただけると嬉しいです!</p> <h4><a target="_blank" rel="nofollow noopener" href="https://labelmake.jp/javascript-pdf-generator-library">Webページはこちらからご覧いただけます!</a></h4> <p>それでは!</p> hand-dot tag:crieit.net,2005:PublicArticle/15226 2019-07-12T09:56:02+09:00 2019-07-12T09:56:02+09:00 https://crieit.net/posts/WPF-WebBrowser-PDF 【WPF】WebBrowser を使ってPDFファイルを表示してみる <p>おはようございます。</p> <p>今回は、WPFアプリでPDFを表示する方法のうち、WebBrowser でサクッとファイルを表示するのを試してみました。</p> <p>画面に上部メニューを追加し、そこから呼び出せるように修正します。<br /> ヘルプやマニュアルなんかをアプリから表示する際にやったりしますよね。</p> <p>プログラムは前回のものを流用します。<br /> <a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2017/11/01/post-2960/" target="_blank" rel="noopener noreferrer" data-blogcard="1">【WPF】はてなアイコンにツールチップを表示する</a></p> <h2 id="画面の追加"><a href="#%E7%94%BB%E9%9D%A2%E3%81%AE%E8%BF%BD%E5%8A%A0">画面の追加</a></h2> <p>新規でPDFを表示するためのウィンドウを追加します。<br /> 画像を取り忘れてしまいましたが、ソリューション・エクスプローラーから「追加」>「ウィンドウ」みたいな感じで出来るはずです。</p> <h3 id="画面レイアウト"><a href="#%E7%94%BB%E9%9D%A2%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%A6%E3%83%88">画面レイアウト</a></h3> <p>PdfView.xaml</p> <pre><code><Mah:MetroWindow x:Class="WpfApp1.PdfView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfApp1" xmlns:Mah="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro" mc:Ignorable="d" Title="PDFビュー" Width="1024" Height="768" GlowBrush="{DynamicResource AccentColorBrush}" BorderThickness="1" Icon="/WpfApp1;component/Resource/Cat.ico" WindowStartupLocation="CenterScreen" > <Window.Resources> <ResourceDictionary Source="/Style/StyleDic.xaml"/> </Window.Resources> <Grid> <WebBrowser x:Name="wb_manual" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="1,1,1,1"/> </Grid> </Mah:MetroWindow> </code></pre> <p>単純に WebBrowser を配置してスタイルを弄っただけです。</p> <h3 id="コードビハインド"><a href="#%E3%82%B3%E3%83%BC%E3%83%89%E3%83%93%E3%83%8F%E3%82%A4%E3%83%B3%E3%83%89">コードビハインド</a></h3> <p>PdfView.xaml.cs</p> <pre><code>using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; using MahApps.Metro.Controls; using System.Reflection; namespace WpfApp1 { /// <summary> /// PdfView.xaml の相互作用ロジック /// </summary> public partial class PdfView : MetroWindow { public PdfView() { InitializeComponent(); Assembly mainAssembly = Assembly.GetExecutingAssembly(); String appDir = System.IO.Path.GetDirectoryName(mainAssembly.Location); wb_manual.Navigate("file://" + appDir + "/Pdf/sample.pdf" + "#toolbar=1"); } } } </code></pre> <p> </p> <p>実行ディレクトリを取得して、PDFのパスを絶対パスで指定します。<br /> また、ツールバーを表示したくなければ「#toolbar=1」を「#toolbar=0」に変更してください。</p> <h2 id="PDFファイルの追加"><a href="#PDF%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E8%BF%BD%E5%8A%A0">PDFファイルの追加</a></h2> <p>プロジェクト直下に「Pdf」フォルダ―を作成し、適当なPDFファイルを格納します。<br /> ファイル名は「sample.pdf」としました。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/10/WpfPdf000.jpg" alt="出力設定" /></p> <p>また、ファイルのプロパティを開き、常に実行ディレクトリにコピーするようにプロパティを変更します。</p> <h2 id="画面の修正"><a href="#%E7%94%BB%E9%9D%A2%E3%81%AE%E4%BF%AE%E6%AD%A3">画面の修正</a></h2> <h3 id="グリッドのレイアウト調整"><a href="#%E3%82%B0%E3%83%AA%E3%83%83%E3%83%89%E3%81%AE%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%A6%E3%83%88%E8%AA%BF%E6%95%B4">グリッドのレイアウト調整</a></h3> <p>MainWindow.xaml(抜粋)</p> <pre><code> <Grid.RowDefinitions> <RowDefinition Height="50" /> <RowDefinition /> </Grid.RowDefinitions> </code></pre> <h3 id="メニュー追加"><a href="#%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E8%BF%BD%E5%8A%A0">メニュー追加</a></h3> <p>MainWindow.xaml(抜粋)</p> <pre><code> <Menu Style="{StaticResource menu-normal}" Background="#e7efff" Height="auto" Width="auto" Margin="0,0,0,20"> <MenuItem Header="ファイル(_F)" > <MenuItem x:Name="menu_exit" Header="終了(_X)" Click="menu_exit_Click"/> </MenuItem> <MenuItem Header="その他(_O)"> <MenuItem x:Name="menu_pdfview" Header="サンプルPDF表示(_P)" Click="menu_pdfview_Click"/> </MenuItem> </Menu> </code></pre> <h3 id="スタイル定義の追加"><a href="#%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB%E5%AE%9A%E7%BE%A9%E3%81%AE%E8%BF%BD%E5%8A%A0">スタイル定義の追加</a></h3> <p>StyleDic.xaml</p> <pre><code> <Style x:Key="menu-normal" TargetType="Menu" > <Setter Property="Background" Value="#ffeef1ff" /> </Style> </code></pre> <h2 id="プログラム修正"><a href="#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E4%BF%AE%E6%AD%A3">プログラム修正</a></h2> <p>追加したメニューのクリックイベントの実装を追加します。</p> <p>MainWindow.xaml.cs</p> <pre><code> /// <summary> /// 閉じるメニュークリックイベント. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void menu_exit_Click(object sender, RoutedEventArgs e) { this.Close(); } /// <summary> /// サンプルPDF表示メニュークリックイベント. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void menu_pdfview_Click(object sender, RoutedEventArgs e) { // ダイアログを表示 var win = new PdfView(); win.Owner = GetWindow(this); win.ShowDialog(); } </code></pre> <p> </p> <h2 id="起動してみる"><a href="#%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">起動してみる</a></h2> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/10/WpfPdf001.jpg" alt="起動後画面" /></p> <p>上部にメニューが追加されました。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/10/WpfPdf002.jpg" alt="閉じるメニュー" /></p> <p>よくある閉じるメニュー。<br /> 他に何も思いつきませんでした。。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/10/WpfPdf003.jpg" alt="PDF表示メニュー" /></p> <p>PDF表示用のメニューです。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/10/WpfPdf005.jpg" alt="PDF表示" /></p> <p>サンプルPFD表示メニューをクリックしてPDFを表示した画面です。<br /> 無事に表示されました。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>以前、何かの記事でも触れましたが<br /> Word で、「rand=(10,10)」みたいな文言を入力し、エンターを押すとランダムでサンプルドキュメントを作ることができます。</p> <p>今回のPDFはその機能を使って作ったサンプルのドキュメントを、PDFとして保存したものとなります。</p> <p>こういった便利なコマンドを知っていると、ちょっとした効率化ができますね。</p> <p>WebBrowser はもちろん HTML も表示できるので他にも色々と応用することができそうですね。<br /> そのうちまた何か別のこともやってみたいと思います。</p> <p>ではでは。</p> <p> </p> doraxdora tag:crieit.net,2005:PublicArticle/14562 2018-10-04T21:12:08+09:00 2018-10-24T16:06:36+09:00 https://crieit.net/posts/Inkscape-PDF フリーソフトInkscapeで生成したPDFでオリジナル名刺を注文する <p>PDFでオリジナルの名刺を作成できると、送料を含めても千円以内で名刺100枚を作ることができます。InkscapeというソフトはWindows, mac, Linux関わらず無料で使えるドローソフトですので、これを使えばIllustrator等を持っていなくても作成することができます。</p> <p>僕も実際にこんな感じのイベント用の名刺を作ってみましたので、作り方を紹介します。</p> <p><a href="https://crieit.now.sh/upload_images/0e3a81aa310cf38d16d9dc43d9bc41d65bb5fbab2991d.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/0e3a81aa310cf38d16d9dc43d9bc41d65bb5fbab2991d.png?mw=700" alt="meishi.png" /></a></p> <p>※ 今回試したのは4色までの名刺になります。</p> <h2 id="Inkscapeのインストール"><a href="#Inkscape%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">Inkscapeのインストール</a></h2> <p>WindowsはMicrosoft Store、Linuxはパッケージマネージャ、macは<a target="_blank" rel="nofollow noopener" href="https://inkscape.org/ja/release/0.92.2/mac-os-x/">公式サイトからのダウンロード</a>でインストールできます。</p> <h2 id="用紙の設定"><a href="#%E7%94%A8%E7%B4%99%E3%81%AE%E8%A8%AD%E5%AE%9A">用紙の設定</a></h2> <p>インストールができたら起動し、まずは用紙の設定を行います。「ファイル」メニューから「ドキュメントのプロパティ」ダイアログを開きます。</p> <p><a href="https://crieit.now.sh/upload_images/13224904219e95ad958277c0c2d253555bb5fd2f10363.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/13224904219e95ad958277c0c2d253555bb5fd2f10363.png?mw=700" alt="documentmenu.png" /></a></p> <p>ここで、用紙のサイズを幅93mm、高さ57mmに変更します。</p> <p><a href="https://crieit.now.sh/upload_images/93caafe888d2f9cc4e27c6c1120255125bb5fd3c726bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/93caafe888d2f9cc4e27c6c1120255125bb5fd3c726bc.png?mw=700" alt="documentproperty.png" /></a></p> <p>通常の名刺のサイズは 91mm x 55mm なのですが、下記のPDF入稿の説明ページの通り、実際のサイズより幅を持たせる必要があるためこのサイズにしています。今回はマットコートで注文をしたため、93mm x 57mm にしています。</p> <p><a target="_blank" rel="nofollow noopener" href="http://www.adprint.jp/dataintro/pdfGuide.aspx">完全PDF入稿について - 印刷通販なら印刷専門サイト【アドプリント】</a></p> <h2 id="色々書く"><a href="#%E8%89%B2%E3%80%85%E6%9B%B8%E3%81%8F">色々書く</a></h2> <p>あとはもう自由です。必要な文言や画像を適宜配置していきましょう。Inkscapeの使い方を詳しく説明しているサイトはいくつかありますので、そのあたりを参考にするとわかりやすいです。(とはいえ画像や文字を配置するだけなのでさほど必要な知識は多くはないです)</p> <p>用紙はちょっと大きくなっており、そこは印刷されるかされないか分からないスペースになっていますので、どちらでも問題ないようにしておきましょう。</p> <p>あと、今回は4色までの名刺になるので、色を使いすぎないよう注意しましょう。</p> <h2 id="PDFで出力する"><a href="#PDF%E3%81%A7%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B">PDFで出力する</a></h2> <p>「名前を付けて保存」ダイアログを開くと、「ファイルの種類」を選択する箇所がありますので、そこで「Portable Document Format (*.pdf)」を選択して保存すればPDFが完成します。</p> <h2 id="注文する"><a href="#%E6%B3%A8%E6%96%87%E3%81%99%E3%82%8B">注文する</a></h2> <p>僕が今回使ったのは <a target="_blank" rel="nofollow noopener" href="http://www.adprint.jp/">アドプリント</a> です。</p> <p>例えば今回試した一番安いものはマットコート 22kg ラミネート無しで100枚460円になります。(+送料)</p> <p><a href="https://crieit.now.sh/upload_images/395e7aaeafd9886b3d254378d3f0cb185bb600dc0958f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/395e7aaeafd9886b3d254378d3f0cb185bb600dc0958f.png?mw=700" alt="mattoko-to.png" /></a></p> <p>注文画面へ行くと、データの入稿方法の選択がありますので、「完全データ入稿注文」を選択して進むと最終的にPDFを登録して注文ができます。</p> <p><a href="https://crieit.now.sh/upload_images/fa688ed6cfed42e5548db434540f6e595bb60176d738d.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/fa688ed6cfed42e5548db434540f6e595bb60176d738d.png?mw=700" alt="dataselect.png" /></a></p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>イベント用の名刺などは時々変えたくなったりしますので、いちいちお店で注文するよりもこうやって自分で手直しして安くで作り直しができると非常に便利です。</p> <p>Web上の注文でも、デザインを選択する形式だとTwitterアカウントや自分のサービスの画像を入れることができなかったりすることもあり、ちょうどよいサービスを探すだけでも結構な労力になってしまいますので、自分で作ったもので入稿できると何も考えなくて良いので楽です。</p> <p>品質よりも伝えたい情報が第一! という場合にはぜひ試してみてください。</p> だら@Crieit開発者