การบ้านทำเสร็จใน Jupyter แล้ว แต่ระบบส่งงานรับเฉพาะ PDF คุณเลือก "ดาวน์โหลดเป็น PDF" หรือรัน jupyter nbconvert --to pdf แล้วก็เจอข้อผิดพลาดว่าหา xelatex ไม่เจอ หรือไม่มี pandoc เพราะ nbconvert สร้าง PDF ผ่าน LaTeX จึงต้องติดตั้งชุด TeX ให้ครบก่อนถึงจะส่งออกอะไรได้

ตอนนี้ Look Scanned เปิดไฟล์ .ipynb ได้โดยตรงแล้ว เลือกโน้ตบุ๊กของคุณในหน้า แปลง Jupyter Notebook เป็น PDF แบบสแกน แล้วระบบจะจัดหน้าให้ในเบราว์เซอร์ทันที ทั้งเซลล์ Markdown โค้ด และเอาต์พุตที่บันทึกไว้ในไฟล์ ตรวจหน้าต่าง ๆ ในตัวอย่าง แล้วดาวน์โหลด PDF ได้เลย ไม่ต้องติดตั้งอะไร และโน้ตบุ๊กจะไม่ถูกอัปโหลดไปที่ไหน

ขอบอกไว้ก่อนอย่างหนึ่ง Look Scanned ทำให้เอกสารดูเหมือนผ่านการสแกน PDF ที่ได้จึงหน้าตาเป็นแบบนั้น เหมาะกับโน้ตบุ๊กที่ต้องส่งเป็นฉบับพิมพ์แล้วสแกน หรือที่อยากให้ดูเหมือนกระดาษ คุณลดการหมุน ความเบลอ และนอยส์ลงเหลือศูนย์ได้เพื่อให้หน้าสะอาดขึ้น แต่ทุกหน้าก็ยังเป็นภาพอยู่ดี จึงเลือกหรือค้นหาข้อความใน PDF ไม่ได้

วิธีแปลงไฟล์ .ipynb เป็น PDF แบบสแกน

  1. รันโน้ตบุ๊กแล้วบันทึกใน Jupyter, JupyterLab, VS Code หรือ Google Colab เพื่อให้เอาต์พุตถูกเก็บไว้ในไฟล์ ใน Colab ให้ใช้ ไฟล์ → ดาวน์โหลด → ดาวน์โหลด .ipynb
  2. เปิด แปลง Jupyter Notebook เป็น PDF แบบสแกน แล้วเลือกไฟล์ .ipynb
  3. ดูตัวอย่างทีละหน้า ตรวจโค้ด ตาราง และกราฟ แล้วตั้งขนาดกระดาษและระยะขอบ
  4. ปรับเอฟเฟกต์สแกน ตั้งความเบลอและนอยส์ให้ต่ำไว้ เพื่อให้โค้ดตัวเล็กยังอ่านออก หน้าจะออกมาเป็นโทนสีเทาตามค่าเริ่มต้น ถ้าอยากให้กราฟคงสีไว้ให้เลือก "สี"
  5. สร้าง PDF แบบสแกนแล้วดาวน์โหลด

ถ้าอยากได้เป็นภาพ ก็ส่งออกแต่ละหน้าเป็น JPG หรือ PNG แทนได้ คู่มือ PDF, JPG และ PNG ของเราอธิบายว่าแบบไหนเหมาะกับกรณีใด ถ้าใช้ Pro ก็ใช้ การสแกนเป็นชุด ทำไฟล์ .ipynb หลายไฟล์พร้อมกันได้

สิ่งที่จะปรากฏบนหน้า

  • เซลล์ Markdown: หัวข้อ รายการ ตาราง ลิงก์ และรูปภาพ รวมถึงรูปที่วางลงในเซลล์โดยตรง
  • เซลล์โค้ด มีการไฮไลต์ไวยากรณ์ตามภาษาของโน้ตบุ๊ก และมีพรอมต์ In [1]: กำกับ บรรทัดยาวจะขึ้นบรรทัดใหม่แทนที่จะล้นออกนอกหน้า
  • เอาต์พุตที่บันทึกไว้ ใต้พรอมต์ Out[1]: ได้แก่ ข้อความที่พิมพ์ออกมา ค่าที่คืนกลับ ตาราง HTML อย่าง DataFrame ของ pandas และรูปภาพ กราฟจาก matplotlib หรือ seaborn จึงแสดงครบ
  • ข้อผิดพลาด พร้อม traceback ฉบับเต็ม
  • เอาต์พุตเทอร์มินัลตามที่เทอร์มินัลแสดง รหัสสีจะถูกตัดออก และแถบความคืบหน้าอย่าง tqdm จะเหลือแค่สถานะสุดท้าย ไม่ใช่ทุกครั้งที่อัปเดต

สิ่งที่ควรรู้ก่อนเริ่ม

  • เซลล์จะไม่ถูกรัน Look Scanned อ่านเฉพาะสิ่งที่บันทึกอยู่ในไฟล์ ไม่มีเคอร์เนล เซลล์ที่ไม่เคยรัน หรือโน้ตบุ๊กที่ล้างเอาต์พุตก่อนบันทึก จะแสดงแค่โค้ดโดยไม่มีอะไรอยู่ข้างใต้ ให้รันทุกเซลล์แล้วบันทึกก่อนเลือกไฟล์
  • สูตรยังคงเป็นซอร์ส TeX สูตรที่เขียนเป็น $…$ หรือ $$…$$ ในเซลล์ Markdown จะแสดงตามที่พิมพ์ไว้ เช่น $\alpha + \beta$ ไม่ได้จัดเป็นสูตรคณิตศาสตร์
  • เอาต์พุตแบบโต้ตอบจะไม่แสดง Plotly, Bokeh และ ipywidgets วาดด้วย JavaScript ซึ่งจะไม่ถูกรัน คุณจะเห็นเวอร์ชันแบบนิ่งที่โน้ตบุ๊กบันทึกไว้ด้วย ซึ่งหลายครั้งเป็นแค่ข้อความสั้น ๆ บรรทัดเดียว หรือไม่มีอะไรเลย ส่วนกราฟที่บันทึกเป็นรูปภาพ อย่างของ matplotlib แสดงได้ปกติ
  • โน้ตบุ๊กต้องเป็น nbformat 4 ซึ่งเป็นรูปแบบที่ Jupyter, JupyterLab, VS Code และ Colab รุ่นปัจจุบันบันทึก โน้ตบุ๊กเก่ามากที่เป็น nbformat 3 จะเปิดไม่ได้ ให้เปิดด้วย Jupyter รุ่นใหม่แล้วบันทึกซ้ำเพื่ออัปเกรด
  • ตารางกว้างจะถูกบีบ ตารางจะถูกปรับให้พอดีกับความกว้างหน้า DataFrame ที่มีหลายคอลัมน์จึงมีคอลัมน์แคบและข้อความขึ้นบรรทัดใหม่
  • เก็บโน้ตบุ๊กต้นฉบับไว้ เช่นเดียวกับงานสแกนจริง PDF ประกอบด้วยภาพของแต่ละหน้า เก็บไฟล์ .ipynb ไว้สำหรับรันและแก้ไขโค้ด

โน้ตบุ๊กถูกอ่านและจัดหน้าบนอุปกรณ์ของคุณเอง ไม่ได้อัปโหลดไปยังเซิร์ฟเวอร์ ข้อยกเว้นเดียวคือเซลล์ Markdown ที่แสดงรูปจากที่อยู่เว็บ เบราว์เซอร์ของคุณจะดึงรูปนั้นจากเว็บไซต์ที่เก็บไว้ เหมือนที่ Jupyter ทำ

เมื่อไรที่ nbconvert เหมาะกว่า

ถ้าคุณต้องการข้อความที่เลือกได้ สูตรที่จัดรูปแบบแล้ว หรือ PDF ที่เหมือนการส่งออกของ Jupyter เองทุกประการ nbconvert ยังคงเป็นเครื่องมือที่ใช่ ติดตั้งชุด TeX แล้วรัน jupyter nbconvert --to pdf หรือใช้ --to webpdf ซึ่งพิมพ์ผ่านเบราว์เซอร์ Chromium แบบไม่มีหน้าจอ (headless) และไม่ต้องใช้ LaTeX เลย ไม่ว่าจะวิธีไหน คุณก็นำ PDF นั้นมาใส่เอฟเฟกต์สแกนใน Look Scanned ต่อได้

งานของคุณเป็นไฟล์ Markdown หรือ LaTeX ไม่ใช่โน้ตบุ๊กใช่ไหม ไฟล์เหล่านั้นก็เปิดได้เช่นกัน ดู แปลง Markdown และ HTML เป็น PDF แบบสแกน และ แปลง LaTeX เป็น PDF แบบสแกน

มีโน้ตบุ๊กที่ต้องส่งเป็น PDF อยู่ใช่ไหม ลองเลย