2026年4月28日 星期二

只要點兩下,就能將input資料夾內所有PDF進行容量壓縮

系列文章:
01.python 不管何時何地,只要點兩下,資料夾內的所有pdf都會合併成一個pdf
https://skjhcreator.blogspot.com/2022/06/pythonpdfpdf.html
02.python 只要點兩下,分別對各資料夾內的pdf合併,合併後的檔名要讓人知道來自哪個資料夾 
https://skjhcreator.blogspot.com/2022/06/python-pdf.html
03. 只要點兩下,就能將一堆的Doc與Docx 轉成 PDF
03.https://skjhcreator.blogspot.com/2023/05/docdocx-pdf.html
04.只要點兩下,就能將一堆的JPG轉成一個PDF,並以JPG所在的資料夾名稱為PDF的檔名
04.https://skjhcreator.blogspot.com/2023/06/jpgpdfjpgpdf.html
05.只要點兩下,就能將放進input的一堆PDF轉成各自的WORD
05.https://skjhcreator.blogspot.com/2023/10/inputpdfword.html
06.只要點兩下,就能將放進input的一堆PDF轉成在ouput資料夾內的各自的WORD 
06.https://skjhcreator.blogspot.com/2023/10/inputpdfouputword.html
07.只要點兩下,就能夠將InputAndOutput資料夾底下的子子孫孫資料夾內所有Word通通轉成PDF
07.https://skjhcreator.blogspot.com/2024/09/word-word-pdf.html
08.只要點兩下,就可以將資料夾input內的所有Word通通轉成一個PDF
08.https://skjhcreator.blogspot.com/2025/07/inputwordpdf.html
09.只要點兩下兩次,就能依照設定拆分指定PDF頁數並合併成設定好的一個PDF
09.https://skjhcreator.blogspot.com/2025/09/pdfpdf.html
10.只要點兩下,就能將input資料夾內所有PDF進行容量壓縮
10.https://skjhcreator.blogspot.com/2026/04/inputpdf.html

Just double-click to compress all PDFs in the input folder.

        最近要上傳一大堆的PDF,常常因為PDF內的照片未經壓縮,導致整體容量過大。上傳時又因容量過大,導致無法上傳。上傳網站要求多少容量內的PDF才能上傳。問題是PDF不是我做的,偏偏又要發回或通知原主,要做PDF壓縮,才能上傳。如此的一來一往,浪費很多時間。能不能有個程式,讓我點個兩下就能將這些PDF進行壓縮,而不用再跟原主溝通?

        Recently, I’ve had to upload a large number of PDFs, but they’re often too big because the images inside them haven’t been compressed. As a result, the files exceed the upload size limit and can’t be uploaded. The website requires PDFs to be under a certain size, but the problem is that I didn’t create these PDFs. I end up having to send them back or notify the original creator to compress them before I can upload them. This back-and-forth wastes a lot of time.

        Is there a program that would let me simply double-click and compress these PDFs myself, without needing to communicate with the original creator?

下載檔案解壓密碼:demo1234
Here is the website where you can download the program and find instructions:
Download。Extraction Password: demo1234
使用教學(Instructional videos):




方法:Python + Ghostscript
一、下載與安裝 Ghostscript
到 https://www.ghostscript.com/download/gsdnld.html 下載後,點兩下進行安裝

二、Python 程式碼
檔案:pyPdfCompress.py
檔案內容:
import os
import subprocess

INPUT_DIR = "input"
OUTPUT_DIR = "output"
GS_COMMAND = "gswin64c"  # Windows 用這個(如果不行可改 "gs")
QUALITY = "ebook"  # screen / ebook / printer / prepress

quality_settings = {
    "screen": "/screen",
    "ebook": "/ebook",
    "printer": "/printer",
    "prepress": "/prepress"
}

def compress_pdf(input_path, output_path):
    cmd = [
        GS_COMMAND,
        "-sDEVICE=pdfwrite",
        "-dCompatibilityLevel=1.4",
        f"-dPDFSETTINGS={quality_settings.get(QUALITY, '/ebook')}",
        "-dNOPAUSE",
        "-dQUIET",
        "-dBATCH",
        f"-sOutputFile={output_path}",
        input_path
    ]

    subprocess.run(cmd, check=True)

def main():
    if not os.path.exists(OUTPUT_DIR):
        os.makedirs(OUTPUT_DIR)

    files = [f for f in os.listdir(INPUT_DIR) if f.lower().endswith(".pdf")]

    if not files:
        print("input 資料夾內沒有 PDF")
        return

    for file in files:
        input_path = os.path.join(INPUT_DIR, file)
        output_path = os.path.join(OUTPUT_DIR, file)

        try:
            compress_pdf(input_path, output_path)

            original_size = os.path.getsize(input_path) / 1024
            compressed_size = os.path.getsize(output_path) / 1024

            print(f"✔ {file}")
            print(f"   原始: {original_size:.2f} KB")
            print(f"   壓縮: {compressed_size:.2f} KB")
            print(f"   減少: {original_size - compressed_size:.2f} KB\n")

        except Exception as e:
            print(f"✖ 失敗: {file}")
            print(e)

if __name__ == "__main__":
    main() 

2026年4月11日 星期六

想修改 chcweb 出現的問題解決集

系列文章:
1.Ubuntu 24.04 安裝 chcweb 專案的過程記錄
2.Ubuntu 24.04 安裝 laravel 5.7 的過程記錄
3.laravel 5.7 初始相關設定與注意事項
4.想修改 chcweb 出現的問題解決集
 

問題一: UnexpectedValueException : The stream or file "/home/webadmin/html/chcweb/storage/logs/laravel-2026-04-11.log" could not be opened in append mode: failed to open stream: Permission denied

解決方法:
錯誤意思是 Laravel 沒辦法寫入 log 檔,通常跟 目錄權限 有關。 

1.檢查檔案與目錄權限

Laravel 日誌檔案路徑:

/home/webadmin/html/chcweb/storage/logs/laravel-2026-04-16.log

需要 Web 伺服器用戶能夠寫入。通常 Linux 系統 Web 伺服器用戶是:

  • Debian/Ubuntu:www-data
  • CentOS/Fedora:apachenginx

檢查目錄權限:

ls -l /home/webadmin/html/chcweb/storage/logs/

2.設定正確的擁有者

假設你的 Web 伺服器用戶是 www-data

sudo chown -R www-data:www-data /home/webadmin/html/chcweb/storage
這樣 Web 伺服器就能寫入。

3.設定正確的權限

Laravel 需要 storagebootstrap/cache 可寫:
sudo chmod -R 775 /home/webadmin/html/chcweb/storage
sudo chmod -R 775 /home/webadmin/html/chcweb/bootstrap/cache
  • 775:擁有者與群組可讀寫執行,其他人可讀與執行
  • 如果 775 仍然不行,可以暫時用 777 測試,但不建議長期使用(安全性較低) 

4.清除快取(可選)

Laravel 有時會快取檔案路徑,建議清除:

php artisan config:clear
php artisan cache:clear

然後再重新載入網站看看是否正常。

小技巧
Laravel 的 storagebootstrap/cache 目錄必須可寫,這是最常見的「Permission denied」原因。 

一行命令,直接安全地修復 Laravel 所有目錄的權限和擁有者,幾乎可以立即解決這種錯誤:

sudo chown -R www-data:www-data /home/webadmin/html/chcweb && sudo find /home/webadmin/html/chcweb/storage -type d -exec chmod 775 {} \; && sudo find /home/webadmin/html/chcweb/storage -type f -exec chmod 664 {} \; && sudo find /home/webadmin/html/chcweb/bootstrap/cache -type d -exec chmod 775 {} \; && sudo find /home/webadmin/html/chcweb/bootstrap/cache -type f -exec chmod 664 {} \; 

問題二:要在資料表setups 新增遺個欄位 bg_image

1.建立 Migration 

php artisan make:migration add_bg_image_to_setups_table --table=setups

2. 修改 Migration 檔案

<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class AddBgImageToSetupsTable extends Migration {
  public function up() {
      Schema::table('setups', function (Blueprint $table) {
          $table->string('bg_image', 255)->nullable()->after('bg_color')->comment('背景圖片');
      }); 
}

  public function down() {
       Schema::table('setups', function (Blueprint $table) {
          $table->dropColumn('bg_image');
       });
    }
}

3.執行 Migration

php artisan migrate 

問題三: UnexpectedValueException  : The stream or file "/home/webadmin/html/chcweb/storage/logs/laravel-2026-04-17.log" could not be opened in append mode: failed to open stream: Permission denied

問題解析:這個錯誤是 Laravel 在寫 log 檔案時發生的權限問題,完全跟你新增欄位無關,但它會阻止 migration 或任何程式寫入日誌。解決方式是調整 storagebootstrap/cache 的權限。

1.確認目錄

Laravel 需要以下目錄可讀寫:

  • storage
  • storage/logs
  • storage/framework
  • bootstrap/cache

 2.修改權限(Linux)

假設你的專案目錄是 /home/webadmin/html/chcweb

cd /home/webadmin/html/chcweb
# 設定 owner 為 web server 使用者,通常是 www-data (Ubuntu/Debian) 或 apache/nginx
sudo chown -R webadmin:www-data storage bootstrap/cache
# 設定目錄可寫權限
sudo chmod -R 775 storage bootstrap/cache
#注意:如果你的 web server 使用者不是 www-data,請改成實際使用者。

3.Laravel 快速清理快取(建議做)

php artisan config:clear
php artisan cache:clear
php artisan route:clear
php artisan view:clear

4. 測試

重新執行 migration:

php artisan migrate

如果權限設定正確,就不會再出現 Permission denied

💡小技巧

在開發環境中,設定 storagebootstrap/cache 777(所有人可寫)雖然方便,但生產環境建議限制為 775 或更安全的方式,以免安全風險。 

 6.一行指令
既改權限,又保證 Laravel 的 storagebootstrap/cache 可以被 web server 寫入,同時保持相對安全(775)

sudo chown -R webadmin:www-data /home/webadmin/html/chcweb/storage /home/webadmin/html/chcweb/bootstrap/cache && sudo chmod -R 775 /home/webadmin/html/chcweb/storage /home/webadmin/html/chcweb/bootstrap/cache 

問題四:   ErrorException  : file_put_contents(/home/webadmin/html/chcweb/database/migrations/2026_04_18_132842_add_bg_image_to_setups_table.php): failed to open stream: No such file or directory

問題解析:

這個錯誤訊息告訴我們 Laravel 無法寫入 migration 檔案,因為目標目錄不存在或沒有權限。重點在這兩件事:

  1. 目錄 database/migrations 是否存在
  2. 你的使用者是否有寫入權限

問題解答:

1.確認目錄存在

執行:

ls -ld /home/webadmin/html/chcweb/database/migrations
  • 如果出現 No such file or directory,表示這個目錄真的不存在,需要建立:
mkdir -p /home/webadmin/html/chcweb/database/migrations

2.確認權限

Laravel 需要該目錄可寫入:

sudo chown -R webadmin:www-data /home/webadmin/html/chcweb/database/migrations
sudo chmod -R 775 /home/webadmin/html/chcweb/database/migrations

替換 webadminwww-data 為你的實際使用者與 web server 群組。

3. 再次建立 migration

php artisan make:migration add_bg_image_to_setups_table --table=setups

這次 Laravel 就能成功在 database/migrations 產生檔案了。

💡 小提醒:

  • storagebootstrap/cachedatabase/migrations 都需要對 Laravel 可寫。
  • 開發環境可以用 775,生產環境更安全的做法是限制非必要使用者寫入。

 4. 一次性指令

把 Laravel 專案的 storagebootstrap/cachedatabase/migrations 全部權限一次調整好。

sudo mkdir -p /home/webadmin/html/chcweb/database/migrations && sudo chown -R webadmin:www-data /home/webadmin/html/chcweb/storage /home/webadmin/html/chcweb/bootstrap/cache /home/webadmin/html/chcweb/database/migrations && sudo chmod -R 775 /home/webadmin/html/chcweb/storage /home/webadmin/html/chcweb/bootstrap/cache /home/webadmin/html/chcweb/database/migrations

 

 

 

 

只要點兩下,就能將input資料夾內所有PDF進行容量壓縮

系列文章: 01. python 不管何時何地,只要點兩下,資料夾內的所有pdf都會合併成一個pdf https://skjhcreator.blogspot.com/2022/06/pythonpdfpdf.html 02. python 只要點兩下,分別對各資料夾內的pdf合...