چرا گنو/لینوکس رو دوست دارم: یک ستونه کردن یک پی دی اف تصویری دو ستونه

بازم با یک سوال بسیار جذاب طرف هستیم: یک دوست خوب یک کتاب که منتظرش بودم بخونم رو بهم داده. پی دف اسکن شده. متاسفانه پی دی اف اسکن شده دو ستونه است و خوندنش روی دیوایس‌هایی با صفحه کوچیک سخت. این شکلی:

من می خوام اینها یک ستونه باشن. کار هم نشد نداره… بخصوص وقتی ابزار خوب دارین. قدم اول اینکه هر پی دی اف رو به یکسری عکس های مستقل با کیفیت خوب تبدیل کنم. می‌زنم:

$ convert -verbose -colorspace GRAY -interlace none -density 150 1.pdf 1.png

مشخصه: تغییر بده -حرف زیاد بزن -خاکستری -کیفیت ۱۵۰ فایل یک.پی‌دی‌اف رو روی فایل‌هایی به اسم ۱.پی‌ان‌جی.

نتیجه؟ بعد از رسیدن دمای سی پی یو به ۸۵ سانتی‌گراد، به چیزی شبیه این می‌رسیم:

کلی فایل دارم که دو ستونه هستن. حالا من یک چیزی می‌خوام که هر عکس رو به دو ستون مختلف تبدیل کنه. بازم جادوی convert. اینبار مثلا برای به دست آوردن سمت چپ صفحه بیست و پنج جلد یک اینطوری کار می کنیم:

$ convert 1-25.png -crop 1240×17540+0+0 +repage 1-25b.png

یعنی تغییر بده -فلان صفحه رو -ببر از گوشه سمت چپ بالا به عرض ۱۲۴۰ پیکسل (نصف عرض تصویر) و ارتفاع 1754 و نتیجه رو بریز توی فایلی با همون اسم که کنارش یک b است. در ضمن یک repage هم اضافه داره که باعث می شه موقع نوشتن تصویر جدید،‌ بیخیال این بشیم که قبلا این تصویر چه ابعادی داشته و کلا یک تصویر جدید با این اطلاعات جدید بسازیم.

برای سمت راست هم:

$ convert 1-25.png -crop 1240×1754+1240+0 +repage 1-25a.png

که خب مثل قبلی است ولی می گه از وسط عرض شروع کنه به بریدن که در نتیجه خروجی می شه ستون سمت راست (اسمش رو می ذاریم a).

حالا که با یک صفحه تونستم اینکار رو بکنم، باید با همه صفحات بتونم. کافیه دستور find که می تونه یکسری فایل رو بهم بده رو تست کنم:

$ find . -name “1-*” -exec convert \{\} -crop 1240×1754+0+0 +repage \{\}b.png \;

دستور فایند همه فایل های توی این شاخه که اسمشون شبیه اسم کتاب من هست رو پیدا می کنه و بعد در بخش exec اونها رو یکی یکی می ده به دستوری که بالا داشتیم (کانورت). حالا عین همین رو بعد از جدا کردن فایل های تازه وارد، برای صفحات سمت راست هم اجرا می کنم:

$ find . -name “1-*” -exec convert \{\} -crop 1240×1754+1240+0 +repage \{\}a.png \;

و بعد می رسم به مجموعه ای فایل‌ها که به ترتیب حروف الفبا،‌ صفحات کتاب هستن:

حالا کافیه مثلا مجموعه همه فایل‌هایی که با ۱ شروع می‌شن رو به هم بچسبونم و یک پی دی اف درست کنم تا به کتاب یک ستونی جلد یک برسم. اما یک سوال مطرحه! باید بتونیم ترتیب این فایل ها رو مشخص کنیم. اگر به سادگی بزنیم

$ convert 1*png jeld1.pdf

اوه شکست موقت خوردیم! ترتیب صفحات قاطی پاتی شده. من دقیق نمی‌دونم باید چیکار کنم پس یک راه کثیف سریع که بلدم رو استفاده می کنم! می دونم دستور دایرکتوری گیری یک سوییچ داره به اسم v که به ترتیب معقول مثل آدم سورت می کنه (پس بیخود نبود که از اسم a و b برای ستون راست و چپ استفاده کردیم ;) ). حالا ls رو با v به همراه سوییچ 1 که هر فایل رو در یک خط نشون می ده می زنم و خروجی رو می دم به xargs echo که کل اینها رو پشت هم نشون بده. می شه این:

می دونم کثیفه ولی یکبار در تاریخ می شه تحملش کرد و تازه جا داره دوستان پیشنهادات بهتر بدن! حالا کافیه این تیکه رو کپی پیست کنم جلوی یک دستور کانورت و آخرش هم اسم فایل خروجی رو بدم.. داریم:

$ convert 1-0.pnga.png 1-0.pngb.png 1-1.pnga.png 1-1.pngb.png 1-2.pnga.png 1-2.pngb.png 1-3.pnga.png 1-3.pngb.png 1-4.pnga.png 1-4.pngb.png 1-5.pnga.png 1-5.pngb.png 1-6.pnga.png 1-6.pngb.png 1-7.pnga.png 1-7.pngb.png 1-8.pnga.png 1-8.pngb.png 1-9.pnga.png 1-9.pngb.png 1-10.pnga.png 1-10.pngb.png 1-11.pnga.png 1-11.pngb.png 1-12.pnga.png 1-12.pngb.png 1-13.pnga.png 1-13.pngb.png 1-14.pnga.png 1-14.pngb.png 1-15.pnga.png 1-15.pngb.png 1-16.pnga.png 1-16.pngb.png 1-17.pnga.png 1-17.pngb.png 1-18.pnga.png 1-18.pngb.png 1-19.pnga.png 1-19.pngb.png 1-20.pnga.png 1-20.pngb.png 1-21.pnga.png 1-21.pngb.png 1-22.pnga.png 1-22.pngb.png 1-23.pnga.png 1-23.pngb.png 1-24.pnga.png 1-24.pngb.png 1-25.pnga.png 1-25.pngb.png 1-26.pnga.png 1-26.pngb.png 1-27.pnga.png 1-27.pngb.png 1-28.pnga.png 1-28.pngb.png 1-29.pnga.png 1-29.pngb.png 1-30.pnga.png 1-30.pngb.png 1-31.pnga.png 1-31.pngb.png 1-32.pnga.png 1-32.pngb.png 1-33.pnga.png 1-33.pngb.png 1-34.pnga.png 1-34.pngb.png 1-35.pnga.png 1-35.pngb.png 1-36.pnga.png 1-36.pngb.png 1-37.pnga.png 1-37.pngb.png 1-38.pnga.png 1-38.pngb.png 1-39.pnga.png 1-39.pngb.png 1-40.pnga.png 1-40.pngb.png 1-41.pnga.png 1-41.pngb.png 1-42.pnga.png 1-42.pngb.png 1-43.pnga.png 1-43.pngb.png 1-44.pnga.png 1-44.pngb.png 1-45.pnga.png 1-45.pngb.png 1-46.pnga.png 1-46.pngb.png 1-47.pnga.png 1-47.pngb.png 1-48.pnga.png 1-48.pngb.png 1-49.pnga.png 1-49.pngb.png 1-50.pnga.png 1-50.pngb.png 1-51.pnga.png 1-51.pngb.png 1-52.pnga.png 1-52.pngb.png 1-53.pnga.png 1-53.pngb.png 1-54.pnga.png 1-54.pngb.png 1-55.pnga.png 1-55.pngb.png 1-56.pnga.png 1-56.pngb.png 1-57.pnga.png 1-57.pngb.png 1-58.pnga.png 1-58.pngb.png 1-59.pnga.png 1-59.pngb.png 1-60.pnga.png 1-60.pngb.png 1-61.pnga.png 1-61.pngb.png 1-62.pnga.png 1-62.pngb.png 1-63.pnga.png 1-63.pngb.png 1-64.pnga.png 1-64.pngb.png 1-65.pnga.png 1-65.pngb.png 1-66.pnga.png 1-66.pngb.png 1-67.pnga.png 1-67.pngb.png 1-68.pnga.png 1-68.pngb.png 1-69.pnga.png 1-69.pngb.png 1-70.pnga.png 1-70.pngb.png 1-71.pnga.png 1-71.pngb.png 1-72.pnga.png 1-72.pngb.png 1-73.pnga.png 1-73.pngb.png 1-74.pnga.png 1-74.pngb.png 1-75.pnga.png 1-75.pngb.png 1-76.pnga.png 1-76.pngb.png 1-77.pnga.png 1-77.pngb.png 1-78.pnga.png 1-78.pngb.png 1-79.pnga.png 1-79.pngb.png 1-80.pnga.png 1-80.pngb.png 1-81.pnga.png 1-81.pngb.png 1-82.pnga.png 1-82.pngb.png 1-83.pnga.png 1-83.pngb.png 1-84.pnga.png 1-84.pngb.png 1-85.pnga.png 1-85.pngb.png 1-86.pnga.png 1-86.pngb.png 1-87.pnga.png 1-87.pngb.png 1-88.pnga.png 1-88.pngb.png 1-89.pnga.png 1-89.pngb.png 1-90.pnga.png 1-90.pngb.png 1-91.pnga.png 1-91.pngb.png 1-92.pnga.png 1-92.pngb.png 1-93.pnga.png 1-93.pngb.png 1-94.pnga.png 1-94.pngb.png 1-95.pnga.png 1-95.pngb.png 1-96.pnga.png 1-96.pngb.png 1-97.pnga.png 1-97.pngb.png 1-98.pnga.png 1-98.pngb.png 1-99.pnga.png 1-99.pngb.png 1-100.pnga.png 1-100.pngb.png 1-101.pnga.png 1-101.pngb.png 1-102.pnga.png 1-102.pngb.png 1-103.pnga.png 1-103.pngb.png 1-104.pnga.png 1-104.pngb.png 1-105.pnga.png 1-105.pngb.png 1-106.pnga.png 1-106.pngb.png 1-107.pnga.png 1-107.pngb.png 1-108.pnga.png 1-108.pngb.png 1-109.pnga.png 1-109.pngb.png 1-110.pnga.png 1-110.pngb.png 1-111.pnga.png 1-111.pngb.png 1-112.pnga.png 1-112.pngb.png 1-113.pnga.png 1-113.pngb.png 1-114.pnga.png 1-114.pngb.png 1-115.pnga.png 1-115.pngb.png 1-116.pnga.png 1-116.pngb.png 1-117.pnga.png 1-117.pngb.png 1-118.pnga.png 1-118.pngb.png 1-119.pnga.png 1-119.pngb.png 1-120.pnga.png 1-120.pngb.png 1-121.pnga.png 1-121.pngb.png 1-122.pnga.png 1-122.pngb.png 1-123.pnga.png 1-123.pngb.png 1-124.pnga.png 1-124.pngb.png 1-125.pnga.png 1-125.pngb.png 1-126.pnga.png 1-126.pngb.png 1-127.pnga.png 1-127.pngb.png 1-128.pnga.png 1-128.pngb.png 1-129.pnga.png 1-129.pngb.png 1-130.pnga.png 1-130.pngb.png 1-131.pnga.png 1-131.pngb.png 1-132.pnga.png 1-132.pngb.png 1-133.pnga.png 1-133.pngb.png 1-134.pnga.png 1-134.pngb.png 1-135.pnga.png 1-135.pngb.png 1-136.pnga.png 1-136.pngb.png 1-137.pnga.png 1-137.pngb.png 1-138.pnga.png 1-138.pngb.png 1-139.pnga.png 1-139.pngb.png 1-140.pnga.png 1-140.pngb.png 1-141.pnga.png 1-141.pngb.png 1-142.pnga.png 1-142.pngb.png 1-143.pnga.png 1-143.pngb.png 1-144.pnga.png 1-144.pngb.png 1-145.pnga.png 1-145.pngb.png 1-146.pnga.png 1-146.pngb.png jeld1.pdf

و حالا بعد از نیم ساعت کار یک کتاب دارم که جوری است که راحت می تونم بخونمش (:

صاحب ابزار خوب بودن فوق العاده نیست؟

توضیح لازم

من وقتی شروع می کنم به چنین کاری دقیقا نمی‌دونم چجوری و با چه ابزاری و با چه جزییاتی قراره انجام بشه.اما می‌دونم که اینکار چیزی پیچیده تر از تبدیل یکسری فرمت به همدیگه و بریدن و چسبوندن و اتوماتیک کردن این پروسه‌ها نیست و مطمئن هستم که فلسفه سیستم عامل من (گنو/لینوکس و فلسفه پوزیکس) دقیقا بر اساس همین ایده ابزارهای کوچیک و کارا که می شه به خوبی باهم ترکیبشون کرد ساخته شده پس مطمئن هستم که اینکار عملیه. در حین انجامش راهنما نگاه می کنم و سوییچ‌ها رو تجربه می کنم و کار پیش می ره و با هم لذت می بریم. قرار نیست کسی اینها رو حفظ باشه. چیزی که مهمه درک فلسفه پوزیکس است.

کتاب داستان پداگوژیکی است، که تا مدت محدودی برای دانلود می ذارمشون اینجا: جلد یک و جلد دو

  • بعضی مواقع احساس می‌کنم با انتخاب گنو/لینوکس، خودمو از جامعه جدا کردم
    «چرا گنو/لینوکس رو دوست دارم» بهم انرژی می‌ده
    این پدرسوخته (گنو/لینوکس) عجب چیزیه!

  • arash.

    تنها فایده این کارا بعد این همه وقت گذاشتن و درگیری فقط حس خوبیه که آخر کار بهت میده .و الا همه این جنگولک بازی ها فقط با سه کلیک و چند ثانیه انجام میشه!!!
    Faxit—>Crop Pages

    • جادی

      آرش: فکس ایت رو ندیدم. ولی مثل اینکه یک مکانیک توضیح بده که چطوری سوپاپ رو می تراشن که قدرت ماشین بره بالا بعد بهش یک شماره تلفن بدی که یک شرکتی همین کار رو می کنه (:

  • مرتضی رضایی

    سلام
    اگه برات ممکنه کتاب را بفرست منم بخونم.تو زندگی کاری به جز ء کتاب خواندن ندارم. ممنون

    • جادی

      آخر مطلب لینک گذاشتم. البته بعد از چند روز فایل ها رو حذف می کنم (:

  • hamid

    $ find . -name “1-*” -exec convert \{\} -crop 1240×1754+0+0 +repage \{\}b.png \;

    توی متن 1240×1754 به جای ایکس یک کراکتر دیگه درج شده که با کپی پیست کردن کار نخواهد کرد. این رو مد نظر داشته باشید اگه کامند های رو کپی پیست کنید کار نخواهد کرد

  • hamid

    همچنین کتیشن ها. بابام جا دستورات رو تی فایل قرار بده آدم خواست واقعا اجرا کنه انقدر اذیت نشه.
    خیلی ممنون

    • جادی

      تی فایل؟ توی فایل؟‌ بعد فایل رو بذارم برای دانلود مثلا؟ (((: خب این دستورها به درد کپی پیست نمی خورن. به درد کسی می خورن که سعی می کنه یاد بگیره یا ایده بگیره یا کلا فقط لذت ببره (: کلا هم این پروسه چند تا ریزه کاری دیگه داره که من نیاوردم اینجا چون قرار نیست کسی دقیق کپی پیستشون کنه (مثلا اینکه فایل ها دارن کنار هم ساخته می شند و فایند آخر همه رو پیدا می کنه و کلا برای درست کار کردن باید فایل ها رو کمی جابجا کرد حداقل).

      ولی نگاه می کنم ببینم اگر وردپرس چیزی داره که از این باهوش بازی هاش (عوض کردن کاراکترها به میل خودش)‌ جلوگیری کنه فعالش می کنم (: مرسی از دقت.

  • 1. این وبلاگ، به مناسبت روز داروین(12فوریه) راه اندازی شده است تا علاقه‌مندان به فرگشت(تکامل) مطالبی را که قبلا درباره فرگشت گفته شده است را یکجا و کامل مشاهده نمایند. در انتهای هر پست نیز نام وبلاگ یا نویسنده آن مطلب بیان شده است.

  • به خلاقیتت حسودیم شد. هیچوقت به این فکر نیفتاده بودم که این مشکلم رو حل کنم.
    من یکم روش کارت رو تغییر دادم که این کثیف بازی‌ها رو نداشته باشیم. البته بگم برای کتابایی که تعداد صفحه‌هاشون بین ۲۰۰ تا ۲۰۰۰ صفحه هستن این روش جواب می‌ده. برای کمتر و بیشتر باید یک sed کم یا زیاد کرد.

    find -name "z-*.png" | sed 's_^\./z-\([0-9]\).png_mv ./z-\1.png ./z-00\1.png_'| sed 's_^\./z-\([0-9]\{2\}\).png_mv ./z-\1.png ./z-0\1.png_' | sed '/^\.\/z-\([0-9]\{3\}\).png/d' | xargs -t -i bash -c {} && find -name "z-*.png" | xargs -t -i bash -c "convert -crop 677x1070+100+30 +repage {} {}b.png; convert -crop 677x1070+977+30 +repage {} {}a.png" ; convert -verbose z*.png*.png output.pdf

    بعد این توضیح رو بدم که تو از ۱ استفاده کردی برای نام‌گذاری و من از z (به خاطر اسم کتاب!) و سایز صفحات و البته کراپ هم فرق می‌کرد. البته این توضیح خطاب به خوننده‌های کامنت بود نه شخص تو :D

  • من تلاشم رو برای بهبود کد ادامه دادم و به کد زیر که خیلی تمیز تره رسیدم. محدودیت تعداد صفحه رو به ۹۹۹۹۹ صفحه رسوندم. بعلاوه این که جلد رو هم صفحه ۰ در نظر گرفتم. اگر جلد وجود نداره یکم کد باید تغییر کنه. در نهایت باز نامگذاری z-xxx.png رو استفاده کردم.

    find -name "z-*.png" | sed 's_[^0-9]*\([0-9]*\).*_\1_' | xargs -IP bash -c "echo P*2+1 | bc | xargs -i printf %05d {} | xargs -IE bash -c 'echo E-1 | bc | xargs -i printf %05d {} | xargs -IO convert -crop 1556x2200+1853+50 +repage z-P.png pageO.png; convert -crop 1556x2200+99+50 +repage z-P.png pageE.png; echo croping z-P.png: done. '" && convert -verbose page*png output.pdf

    • جادی

      ایول باحال شده (: نگه می دارم برای دفعه بعد. من توی sed ضعیف هستم و ازش در می رم (((:

      اینم بگم که من توی نوشتن این دو بار مجبور شدم برم توی ترمینال و convert رو کیل کنم چون اگر یک اشتباه کوچیک داشته باشی به راحتی کل رم سیستم رو پر می کنه

  • sed خیلی باحاله. من با sed از کلاینت آیدنتیکا تا برنامه اتک بازی آنلاین خان وارز نوشتم.
    بعد حالا من کانورت رو با نایس (nice) هم اجرا کردم که کیل کردنش هم پروژه بود. ابعاد صفحه هم که معلومه با رزولوشن ۳۰۰ کار کردم که رسمن ۴ گیگ رم و ۵ گیگ swap رو به راحتی پر کرد!
    یه ابزار فری هم پیدا کردم که بد نبود و برای همین کار ساخته شده. البته برای پی‌دی‌اف تکست من تستش کردم:
    http://sourceforge.net/projects/briss/

  • عالی… عالی…
    Thank you

  • علیرضا

    سلام
    این دوست من قبول نمیکنه لینوکس بهترینه! آدرس این سایت رو میدم، دیگه نمیتونه چیزی بگه!
    ولی یه سوال: اینهمه از convert استفاده میکنی، میتونی یه مقاله کوچیک بذاری واسه آموزشش؟ انگلیسیم در اون حد قوی نیست که از manual این چیزی سر در بیارم! آخه بزرگه آدم حوصلش سر میره! :d

    • جادی

      علیرضا: مقاله کوچیک فایده نداره (: همین ها رو ببین و بعد دنبال چیزی بگر دکه خودت می خوای. مجموعه ImageMagic خیلی خیلی بزرگ و قویه و نمی شه همه اش رو یکجا گفت (: هر کس باید نیازهاش رو از توی راهنماهاش پیدا کنه.

      در ضمن لازم نیست man رو کامل بخونی. توش سرچ کن دنبال چیزهایی که می خوای یا اینترنت رو بگرد. در ضمن شروع کن انگلیسی خوندن.. حتی اگر سخت باشه. اگر کسی نتونه انگلیسی بخونه در دنیای لینوکس کار خاصی هم نمی تونه بکنه (:

  • Soroush

    من این کارو دقیفا به همین طریق انجام دادم قبلا، فقط کتاب من 4 صفحه در یه صفحه بود، واسه حل مشکل اخرتم میتونی خیلی راحت تو اکستنشن فایل خروجی a,b یا 1و2و3و… بزاری

  • Mohsen Pahlevanzadeh

    چرا sed؟ از sort هم می‌تونی استفاده کنی….

  • maral

    @رامین: می شه روش استفاده از نرم افزار رو هم بگین؟؟؟؟

  • Wahid

    سلام
    جادی من از این دستور استفاده کردم:
    convert `ls -v1` ebook.pdf
    ساده و کوتاه ولی کاربردی :)

  • manoochd

    اگر یک روزی نظرسنجی بذاری در مورد بهترین پست، من به این پست رای میدم، تا قبل از این فقط خونده بودمش، امروز به کارم هم اومد. خواستم فقط تشکری بکنم

  • بعد از این همه وقت گذشتن از انتشار مطلبت‌، امروز بهش نیاز پیدا کردم. با این فرق که تو هر صفحهٔ کتاب من ۴ صفحه بود :D ممنون مطلبت کمکم کرد خیلی. فقط یه مشکل کوچیکی داشتم که مثلا اگه صفحهٔ ۱ رو جدا کرده بودم و دستور رو برای صفحهٔ ۲ تکرار می‌کردم‌، فایلای ساخته شده با دستور یک هم تحت تاثیر قرار می‌گرفتن. این شد که دستور فایندت رو یه کم تغییر دادم که این کار رو نکنه:
    find . -regextype sed -regex “.*/1-[0-9]\{0,2\}\.png”
    که برای تعداد صفحات زیر صدتا مناسبه (موقعیت من) برای بیشترش که کافیه محدوده رو زیاد کنیم.
    باز هم دمت گرم‌، نجاتم دادی ;-)

  • Pingback: آیا کتابخون دیجیتال کیندل به درد می خوره؟ | کیبرد آزاد()

  • Weis Xan

    سلام جادی جان
    گوگل یه سرویس ocr تو گوگل درایو داره که خوشبختانه از فارسی پشتیبانی میکنه
    ولی مشکل اینجاست باید هر عکس جداگانه پردازش میشه و یک فایل ورد ایجاد میکنه
    میتونی یه راه پیدا کنی عکسا آپلود کنیم و خودش یه فایل ورد تحویل بده؟
    برای استفاده شخصی کتاب هام روی صفحه گوشی میخام
    ممنون