পিডিএফ পৃষ্ঠাগুলি বিভক্ত করুন


67

আমার একটি স্ক্যান করা পিডিএফ ফাইল রয়েছে যা একটি ভার্চুয়াল পৃষ্ঠায় দুটি পৃষ্ঠা (পিডিএফ ফাইলের পৃষ্ঠা) স্ক্যান করেছে।

রেজোলিউশনটি ভাল মানের সাথে। সমস্যাটি হচ্ছে পড়ার সময় আমাকে জুম করতে হবে এবং বাম থেকে ডানে টেনে আনতে হবে।
এমন কিছু কমান্ড ( convert,, pdftk...) বা স্ক্রিপ্ট আছে যা এই পিডিএফ ফাইলটিকে সাধারণ পৃষ্ঠাগুলির সাথে (পিডিএফ ফাইলের বই থেকে এক পৃষ্ঠা = একটি পৃষ্ঠা) রূপান্তর করতে পারে?


1
Athough এটা সবচেয়ে সম্মত উত্তর নেই নয়, এই এক সত্যিই আমাকে বিস্মিত। এটি সহজ, সংক্ষিপ্ত, দ্রুত এবং মার্জিত। আমি ভেবেছিলাম এটি এখানে উল্লেখ করা ভাল, কারণ কখনও কখনও আমরা অন্যান্য উত্তরগুলি স্ক্রোল করতে খুব অলস হয়ে যাই ...
পেক

রেকর্ডগুলির জন্য, বিপরীতমুখী অপারেশন (একাধিক পৃষ্ঠায় যোগদান) স্যুট pdfnupথেকে কমান্ড লাইন থেকে ("ফাইল থেকে মুদ্রণের পরিবর্তে" চেয়ে) পাওয়া যাবে pdfjam
স্কিপি লে গ্র্যান্ড গৌরু

উত্তর:


46

এখানে পাইপডিএফ লাইব্রেরি ব্যবহার করে একটি ছোট পাইথন স্ক্রিপ্ট রয়েছে যা কাজটি খুব সুন্দরভাবে করে। এটি un2up(বা আপনি যা পছন্দ করেন) নামক স্ক্রিপ্টে সংরক্ষণ করুন, এটি কার্যকর ( chmod +x un2up) তৈরি করুন এবং এটি ফিল্টার হিসাবে চালান ( un2up <2up.pdf >1up.pdf)।

#!/usr/bin/env python
import copy, sys
from pyPdf import PdfFileWriter, PdfFileReader
input = PdfFileReader(sys.stdin)
output = PdfFileWriter()
for p in [input.getPage(i) for i in range(0,input.getNumPages())]:
    q = copy.copy(p)
    (w, h) = p.mediaBox.upperRight
    p.mediaBox.upperRight = (w/2, h)
    q.mediaBox.upperLeft = (w/2, h)
    output.addPage(p)
    output.addPage(q)
output.write(sys.stdout)

কোনও অবমূল্যায়ন সতর্কতা উপেক্ষা করুন; কেবল পিপিডিএফ রক্ষণাবেক্ষণকারীদেরই তাদের সম্পর্কিত হতে হবে।

যদি ইনপুটটি অস্বাভাবিক উপায়ে কেন্দ্রিক হয়, পৃষ্ঠাগুলি কাটানোর সময় আপনাকে বিভিন্ন স্থানাঙ্ক ব্যবহার করতে হতে পারে। দেখুন কেন আমার কোডগুলি প্রতিটি স্ক্যান করা পিডিএফ মধ্যে প্রতিটি পৃষ্ঠা সঠিকভাবে বিভক্ত হয় না?


কেবলমাত্র এটি কার্যকর হলে এখানে আমার আগের উত্তরটি দুটি সরঞ্জাম এবং কিছু ম্যানুয়াল হস্তক্ষেপের সংমিশ্রণ ব্যবহার করে:

  • পৃষ্ঠাগুলি ক্রপ করার জন্য পিডিএফজাম (কমপক্ষে সংস্করণ ২.০), পিডিএফপেজ ল্যাটেক্স প্যাকেজের উপর ভিত্তি করে ;
  • বাম এবং ডান অর্ধেক একসাথে ফিরে রাখতে পিডিএফটক

উভয় সরঞ্জামের প্রয়োজন কারণ যতদূর আমি বলতে পারি পিডিএফ পৃষ্ঠাগুলি একই প্রবাহে একই পৃষ্ঠায় দুটি পৃথক রূপান্তর প্রয়োগ করতে সক্ষম হয় না। কলটিতে pdftk, ইনপুট ডকুমেন্টের ( 2up.pdf) পৃষ্ঠাগুলির সংখ্যা দ্বারা 42 প্রতিস্থাপন করুন ।

pdfjam -o odd.pdf --trim '0cm 0cm 14.85cm 0cm' --scale 1.141 2up.pdf
pdfjam -o even.pdf --trim '14.85cm 0cm 0cm 0cm' --scale 1.141 2up.pdf
pdftk O=odd.pdf E=even.pdf cat $(i=1; while [ $i -le 42 ]; do echo O$i E$i; i=$(($i+1)); done) output all.pdf

আপনার পিডিএফজাম ২.০ না থাকলে পিডিএফপেজ প্যাকেজটি পিডিএফএলএক্স ইনস্টল করার জন্য যথেষ্ট (উবুন্টুতে: আপনার টেক্সলাইভ-লেটেক্স-প্রস্তাবিত টেক্সলাইভ-ল্যাটেক্স-প্রস্তাবিত ইনস্টল করুন এবং সম্ভবত (উবুন্টুতে: টেক্সলাইভ-ফন্ট-প্রস্তাবিত টেক্সলাইভ-ফন্টগুলি ইনস্টল করুন recommended ) প্রয়োজন, এবং নিম্নলিখিত ড্রাইভারটি ব্যবহার করুন ফাইল driver.tex:

\batchmode
\documentclass{minimal}
\usepackage{pdfpages}
\begin{document}
\includepdfmerge[trim=0cm 0cm 14.85cm 0cm,scale=1.141]{2up.pdf,-}
\includepdfmerge[trim=14.85cm 0cm 0cm 0cm,scale=1.141]{2up.pdf,-}
\end{document}

তারপরে ইনপুট ফাইলের পৃষ্ঠাগুলির সংখ্যা দ্বারা 42 টি প্রতিস্থাপন করে নিম্নলিখিত কমান্ডগুলি চালিত করুন (যা অবশ্যই বলা উচিত 2up.pdf):

pdflatex driver
pdftk driver.pdf cat $(i=1; pages=42; while [ $i -le $pages ]; do echo $i $(($pages+$i)); i=$(($i+1)); done) output 1up.pdf

পাইপডিএফ লাইব্রেরি নিখুঁতভাবে কাজ করে। আমি কেবল এটি কিছুটা পরিবর্তন করেছি এবং পাইথন কনভ_পিডিএফ.সি.পিডিএফ দিয়ে চালাচ্ছি । কমান্ডলাইন থেকে আপনি কীভাবে আপনার স্ক্রিপ্ট শেবাং চালাবেন?
xralf

আমি পিডিএফজামের সাথে সংস্করণটি চেষ্টা করতে চাই (সামান্য স্কেলিংয়ের কারণে) তবে পিডিএফজাম প্যাকেজটি ইনস্টল করার পরে আমার শেলটি pdfjamকমান্ডকে স্বীকৃতি দেবে না ।
xralf

@ এক্স্রাল্ফ: আমার পাইথন স্ক্রিপ্টটি কেবল স্ট্যান্ডার্ড ইনপুট থেকে পড়ে এবং স্ট্যান্ডার্ড আউটপুটে লেখায়। পিডিএফজাম সংস্করণে পিডিএফজাম ২.০ প্রয়োজন; এটি পিডিএফপেজের চারপাশে কেবল একটি ছোট্ট মোড়ক রয়েছে, এবং আমি এটি উত্পন্ন ল্যাটেক্সের বিট যুক্ত করেছি যাতে আপনি এটি সরাসরি ব্যবহার করতে পারেন। স্কেলিং ইস্যুটি সম্ভবত পিআইপিডিএফ দিয়ে সমাধানযোগ্য, এটি একটি পৃষ্ঠার আকারের সমস্যা হতে পারে (আপনি কী ঘটছে এবং বিশেষত পৃষ্ঠার আকারগুলি জড়িত সে সম্পর্কে আরও বিশদ দিলে আমি সহায়তা করতে সক্ষম হতে পারি বা নাও করতে পারি)।
গিলস

ধন্যবাদ, পার্থক্যটি খুব সামান্য খারাপ রেজোলিউশনে রয়েছে, তবে এটি কোনও ব্যাপার নয়। আমি যখন লেটেক্স সম্পর্কে আরও জানব তখন আমি এটিতে ফিরে যাব (এটি এখন আমার পক্ষে খুব জটিল এবং পাইপিডিএফ দিয়ে সমাধানটি সত্যিই ভাল)।
xralf

1
@ গিলস ভার্সি দরকারী স্ক্রিপ্ট। আমি পিডিএফজাম, পিডিএফটেক-তে এরকম কিছু দেখার আশা করেছি। যাইহোক, কিছু লোক পৃষ্ঠাগুলি অন্য অক্ষের উপর বিভক্ত করতে এবং বিভিন্ন ক্রম ব্যবহার করতে কিছু পরিবর্তন চাইবেন। কয়েকটি লাইন পরিবর্তন করা এবং ব্যবহার করা সম্ভবq.mediaBox.lowerRight = (w, h/2)
ony

52

পাইথন স্ক্রিপ্ট (এবং অন্যান্য বেশ কয়েকটি সমাধান) নিয়ে আমার সমস্যা ছিল যেহেতু: আমার জন্য mutoolদুর্দান্ত কাজ করেছে। এটি মার্জিত mupdfপাঠকের সাথে একটি সহজ এবং ছোট সংযোজন । সুতরাং আপনি চেষ্টা করতে পারেন:

mutool poster -y 2 input.pdf output.pdf

অনুভূমিক টুকরা জন্য, প্রতিস্থাপন yসঙ্গে x। এবং আপনি অবশ্যই আরও জটিল সমাধানের জন্য দুটিকে একত্রিত করতে পারেন।

এটি পেয়ে সত্যিই খুশি (দৈনিক এমপিডিএফ ব্যবহারের বহু বছর পরে :)

mutoolসংস্করণ ১.৪ থেকে শুরু করে এমপিডিএফ নিয়ে আসে: http://www.mupdf.com/news .com /


উত্স ইনস্টল করা mupdfএবং mutoolথেকে:

wget http://www.mupdf.com/downloads/mupdf-1.8-source.tar.gz
tar -xvf mupdf-1.8-source.tar.gz
cd mupdf-1.8-source
sudo make prefix=/usr/local install

অথবা নতুন সংস্করণ খুঁজতে ডাউনলোড পৃষ্ঠায় যান।


3
আমার একটি ডিজেভু ছিল ... আমি এটিকে পোস্টস্ক্রিপ্টে পরিণত করেছি (বেশ দ্রুত), তারপরে পিডিএফ (টার্টল ধীর) - এবং অবশেষে মিউটুল এত তাড়াতাড়ি কাটল আমি ভেবেছিলাম এটি কার্যকর হয়নি - এটি ছিল!
জুলিয়েন পয়েড

2
হ্যাঁ, আমিও গতিতে সত্যিই সন্তুষ্ট ছিলাম।
মার্টজ

3
এটি এক সহজ এবং সর্বোত্তম। mutoolএই জন্য তৈরি করা হয়েছিল। এছাড়াও, সাবধান থাকুন -y, বেশিরভাগ ক্ষেত্রে আপনি যা চান তা আমি মনে করি -x
ফায়াতজাফ

2
এই ইউটিলিটিটি খুব দ্রুত, তবে পৃষ্ঠা অর্ডার নিয়ে আমার সমস্যা আছে। কমান্ডটি প্রথম অবস্থানে ডান পৃষ্ঠা এবং দ্বিতীয় পৃষ্ঠায় বাম পৃষ্ঠার বরাদ্দ দেয়। এই সমস্যা সম্পর্কে কেউ আমাকে সহায়তা করতে পারে?
গারসিপার্ডিজ


16

চিত্রগ্রাহক এটি এক ধাপে করতে পারেন:

$ convert in.pdf -crop 50%x0 +repage out.pdf

1
ধন্যবাদ। আমি যদি -density 400প্যারামিটারটি যুক্ত করি তবে এটি আরও ভাল মানের।
xralf

11
দেখে মনে হচ্ছে রূপান্তরটি মধ্যবর্তী ফর্ম্যাট হিসাবে রাস্টার ব্যবহার করে। মূল পিডিএফটিতে ভেক্টর অবজেক্ট থাকা সত্ত্বেও এটি অস্পষ্ট চেহারা দেখা দেয়।
ony

পথের পৃষ্ঠার বিষয়বস্তুগুলিকে রাস্টারাইজ না করে কেউ কীভাবে এই উপায়টি জানেন ... বা কমপক্ষে উচ্চতর রেজোলিউশন সেট করবেন?
টমিস্লাভ নাকিক-আলফায়ারভিক

এটি পাঠ্যগুলিকে চিত্রগুলিতে রেন্ডার করে এবং চিত্রগুলি থেকে পিডিএফ তৈরি করে। ছবি তোলার জন্য সুন্দর তবে পাঠ্য উত্তোলনের জন্য অকেজো।
andrej

6

ইমেজম্যাগিকের কনভার্ট কমান্ড আপনাকে আপনার ফাইলটি 2 অংশে ক্রপ করতে সহায়তা করতে পারে। Http://www.imagemagick.org/Usage/crop/ দেখুন

আমি যদি আপনি থাকতাম তবে আমি এই জাতীয় (শেল) স্ক্রিপ্ট লিখতাম:

  1. আপনার ফাইলটি পিডিএফসামের সাথে বিভক্ত করুন : 1 পৃষ্ঠা = 1 ফাইলকে ডিস্কে (ফর্ম্যাট কোনও বিষয় নয় Image চিত্রম্যাগিক জানে এমন একটি চয়ন করুন I'd আমি কেবল পিএস বা পিডিএফ নেব।
  2. প্রতিটি পৃষ্ঠার জন্য, প্রথমার্ধটি ক্রপ করুন এবং এটিকে $ {পেজ নাম্বার} এ নামের একটি ফাইলে রাখুন

  3. দ্বিতীয়ার্ধটি ক্রপ করুন এবং এটিকে $ {পেজ নাম্বার} বি নামের একটি ফাইলে রাখুন।

    আপনি 1A.pdf, 1B.pdf, 2A.pdf, 2B.pdf, ইত্যাদি পান

  4. এখন, নতুন পিডিএফে এটি আবার জড়ো করুন। এটি করার জন্য অনেকগুলি পদ্ধতি রয়েছে।

1
ইমেজম্যাগিক ফাইলগুলি ব্যবহার করে না? এবং আপনার শেষ অংশটি ইনলাইনটি ব্যাখ্যা করা উচিত, বিশেষত শ্রোতাদের মধ্যে নন-ফ্র্যাঙ্কফোনের সুবিধার জন্য।
গিলস 22

কারণ আপনার ফ্রেঞ্চ বোঝার দরকার নেই। এটি কেবলমাত্র এই লক্ষ্য অর্জনের জন্য আপনি কীভাবে ইমেজম্যাগিকের রূপান্তর, পিডিএফটক বা ভূস্ট্রিপ্ট (জিএস) ব্যবহার করতে পারেন তা দেখায়। আমি পিডিএফটক ব্যবহার করতে পছন্দ করি "রাস্টারিং" কোনও স্ক্যান নথি হিসাবে এটি বিবেচনা করে না।
টিকটাক

6

গিলস থেকে উত্তর এবং পিডিএফ পৃষ্ঠার গণনা আমি কীভাবে খুঁজে পেতে পারি তার উপর ভিত্তি করে

#!/bin/bash

pdforiginal=$1
pdfood=$pdforiginal.odd.pdf
pdfeven=$pdforiginal.even.pdf
pdfout=output_$1
margin=${2:-0}
scale=${3:-1}

pages=$(pdftk $pdforiginal dump_data | grep NumberOfPages | awk '{print $2}')

pagesize=$(pdfinfo $pdforiginal | grep "Page size" | awk '{print $5}')
margin=$(echo $pagesize/2-$margin | bc -l)

pdfjam -o $pdfood --trim "0cm 0cm ${margin}pt 0cm" --scale $scale $pdforiginal
pdfjam -o $pdfeven --trim "${margin}pt 0cm 0cm 0cm" --scale $scale  $pdforiginal

pdftk O=$pdfood E=$pdfeven cat $(i=1; while [ $i -le $pages ]; do echo O$i E$i; i=$(($i+1)); done) output $pdfout

rm $pdfood $pdfeven

তাই আমি চালাতে পারি

./split.sh my.pdf 50 1.2

যেখানে 50 টি সামঞ্জস্য মার্জিনের জন্য এবং 1.2 স্কেলের জন্য।


4

এখানে গিলস পোস্ট করা পিপিডিএফ কোডের বিভিন্নতা। এই পৃষ্ঠাটি ওরিয়েন্টেশন কী তা বিবেচনা করেই কাজ করবে:

import copy
import math
import pyPdf

def split_pages(src, dst):
    src_f = file(src, 'r+b')
    dst_f = file(dst, 'w+b')

    input = pyPdf.PdfFileReader(src_f)
    output = pyPdf.PdfFileWriter()

    for i in range(input.getNumPages()):
        p = input.getPage(i)
        q = copy.copy(p)
        q.mediaBox = copy.copy(p.mediaBox)

        x1, x2 = p.mediaBox.lowerLeft
        x3, x4 = p.mediaBox.upperRight

        x1, x2 = math.floor(x1), math.floor(x2)
        x3, x4 = math.floor(x3), math.floor(x4)
        x5, x6 = math.floor(x3/2), math.floor(x4/2)

        if x3 > x4:
            # horizontal
            p.mediaBox.upperRight = (x5, x4)
            p.mediaBox.lowerLeft = (x1, x2)

            q.mediaBox.upperRight = (x3, x4)
            q.mediaBox.lowerLeft = (x5, x2)
        else:
            # vertical
            p.mediaBox.upperRight = (x3, x4)
            p.mediaBox.lowerLeft = (x1, x6)

            q.mediaBox.upperRight = (x3, x6)
            q.mediaBox.lowerLeft = (x1, x2)

        output.addPage(p)
        output.addPage(q)

    output.write(dst_f)
    src_f.close()
    dst_f.close()

2

সর্বোত্তম সমাধানটি ছিল মিউটুল উপরে দেখুন:

sudo apt install mupdf-tools pdftk

বিভাজন:

mutool poster -y 2 input.pdf output.pdf

তবে তারপরে আপনাকে বাকী পৃষ্ঠাটি ঘোরানো দরকার:

pdftk output.pdf cat 1-endleft output rotated.pdf

তবুও কোনও ওভারল্যাপ নেই ...
বেলজিয়াম

1

আস্কউবুন্টুতে বেনিয়ামিনের উত্তরের ভিত্তিতে , আমি gscan2pdf নামক জিইউআই সরঞ্জামটি ব্যবহার করার পরামর্শ দেব

  1. Gscan2pdf এ পিডিএফ স্ক্যান ফাইলটি আমদানি করুন। মনে রাখবেন যে চিত্রবিহীন পিডিএফ ফাইলগুলি কাজ করতে পারে না। স্ক্যানগুলি ঠিক আছে, তাই আপনাকে চিন্তা করার দরকার নেই।

    এখানে চিত্র বর্ণনা লিখুন

  2. দস্তাবেজের আকারের উপর নির্ভর করে এটি কিছুটা সময় নিতে পারে। এটি লোড হওয়া পর্যন্ত অপেক্ষা করুন।

  3. সমস্ত পৃষ্ঠাগুলি নির্বাচন করতে Ctrl + A টিপুন এবং তারপরে প্রয়োজনে তাদের ঘোরান (Ctrl + Shift + C)

    এখানে চিত্র বর্ণনা লিখুন

  4. সরঞ্জামগুলিতে যান >> পরিষ্কার করুনডাবল এবং # আউটপুট পৃষ্ঠা হিসাবে লেআউট নির্বাচন করুন = 2

    এখানে চিত্র বর্ণনা লিখুন

  5. হিট ঠিক আছে এবং পর্যন্ত কাজ সমাপ্ত হয় অপেক্ষা করুন।

    এখানে চিত্র বর্ণনা লিখুন

  6. পিডিএফ ফাইল সংরক্ষণ করুন। সম্পন্ন.


পরীক্ষিত, জটিল পিডিএফ ডকুমেন্টগুলির সাথে ইমেজের বিশাল নলবার সহ ব্যর্থ।
MUY বেলজিয়াম

0

moraes সমাধান আমার জন্য কাজ করে না। মূল সমস্যাটি ছিল x5 এবং x6 গণনা। এখানে একটি অফসেট বিবেচনা করতে হবে, যেমন লোয়ার বামে না থাকলে (0,0)

সুতরাং পাইপডিএফ 2 এবং পাইথন 3 ব্যবহারের জন্য অতিরিক্ত অ্যাডাপশন সহ এখানে আরও একটি প্রকরণ রয়েছে:

import copy
import math
import PyPDF2
import sys
import io 

def split_pages(src, dst):
    src_f = io.open(src, 'r+b')
    dst_f = io.open(dst, 'w+b')

    input = PyPDF2.PdfFileReader(src_f)
    output = PyPDF2.PdfFileWriter()

    for i in range(input.getNumPages()):
        p = input.getPage(i) 
        q = copy.copy(p)
        q.mediaBox = copy.copy(p.mediaBox)

        x1, x2 = p.cropBox.lowerLeft
        x3, x4 = p.cropBox.upperRight        

        x1, x2 = math.floor(x1), math.floor(x2)
        x3, x4 = math.floor(x3), math.floor(x4)

        x5 = math.floor((x3-x1) / 2 + x1)
        x6 = math.floor((x4-x2) / 2 + x2)

        if x3 > x4:        
            # horizontal
            p.mediaBox.upperRight = (x5, x4)
            p.mediaBox.lowerLeft = (x1, x2)

            q.mediaBox.upperRight = (x3, x4)
            q.mediaBox.lowerLeft = (x5, x2)
        else:
            # vertical        
            p.mediaBox.lowerLeft = (x1, x6)
            p.mediaBox.upperRight = (x3, x4)

            q.mediaBox.upperRight = (x3, x6)
            q.mediaBox.lowerLeft = (x1, x2)

        output.addPage(p)
        output.addPage(q)

    output.write(dst_f)
    src_f.close()
    dst_f.close()

if __name__ == "__main__":
    if ( len(sys.argv) != 3 ):
        print ('Usage: python3 double2single.py input.pdf output.pdf')
        sys.exit(1)

    split_pages(sys.argv[1], sys.argv[2])
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.