কীভাবে 2 টি পিডিএফ ফাইল ইন্টারলিভিং পৃষ্ঠাগুলির ক্রমের সাথে মার্জ করবেন?


13

লিনিয়ার বাল্ক স্ক্যানারের সাহায্যে স্ক্যান করতে আমার ডাবল-সাইড-প্রিন্টেড মাল্টিপেজ ডকুমেন্ট পেয়েছে। সুতরাং, ফলস্বরূপ আমি 2 পিডিএফ ফাইল পেয়েছি: একটিতে সমস্ত বিজোড় পৃষ্ঠা রয়েছে এবং দ্বিতীয়টি সমস্ত সমৃদ্ধ পৃষ্ঠা রয়েছে। আমি তাদের প্রাকৃতিক উপায়ে মার্জ করা প্রয়োজন:

1. <- 1.1. (odd.pdf page 1 to result.pdf page 1)
2. <- 2.1. (even.pdf page 1 to result.pdf page 2)
3. <- 1.2. (odd.pdf page 2 to result.pdf page 3)
4. <- 2.2. (even.pdf page 2 to result.pdf page 4)

প্রভৃতি


কেবল একটি পিডিএফ পার্সার সন্ধান করুন এবং স্টাফের মতো একত্রিত করার পদ্ধতি করুন।
ডেইজি

1
যদি স্টিফেন আপনার সমস্যার সমাধান না করে, আপনি পার্ল মডিউলটি চেষ্টা করতে পারেন CAM::PDF, আমি আপনার স্ক্রিপ্ট পরে দেব। দুটি পিডিএফ এর পেজ গণনা কি একই রকম?
ডেইজি

উত্তর:


7

থেকে আদেশগুলি pdfseparateএবং দেখুন । প্রথমটি প্রতিটি নথী থেকে পৃথক ফাইলে পৃষ্ঠাগুলি পৃথক করে এবং দ্বিতীয়টি নতুন ডকুমেন্টে আপনি যে ক্রমটি চান তা সেগুলিতে মার্জ করে।pdfunitepoppler-utils

এছাড়াও নোট করুন যেহেতু স্ক্যানাররা আপনাকে যেভাবেই রাস্টার ইমেজ দেয় (যা আপনার মতো কেউ পিডিএফ ফাইলগুলিতে রূপান্তর করতে পারে), এর পরিবর্তে আপনি এটিকে আউটপুট চিত্রগুলিতে কনফিগার করতে পারেন (পিএনজি, টিফ ...) এবং নিজেই পিডিএফে কনক্যাটেনশনটি নিজেই করতে পারেন করে ImageMagick।


এটি আমার যা প্রয়োজন তা দেখে মনে হচ্ছে, আসুন চেষ্টা করুন ...
ইভান

1
প্রকৃতপক্ষে. চমৎকার। আমার যা প্রয়োজন তা সঠিক করতে ব্যবহার করতে সহজ। যাইহোক, আমি অবশ্যই জিজ্ঞাসা করার আগে গুগল করেছিলাম এবং সমাধানগুলি খুঁজে পেয়েছি যেগুলি হুবহু একইভাবে পাওয়া গেছে উল্লেখযোগ্যভাবে আরও জটিল।
ইভান

আমি এটি উবুন্টু 18.04 এ চেষ্টা করেছি (@ টিটিএফ থেকে নীচে সহায়ক স্ক্রিপ্ট সহ) এবং এটি দুটি ~ 5.5 এমবি ফাইলকে একটি 197 এমবি ফাইলে পরিণত করেছে, সুতরাং এটি কাজ করার সময় এটি ব্যবহারযোগ্য ছিল না (ফলাফলটি ইমেল করার দরকার ছিল!) ।
রূবেণ টমাস

12

পিডিএফটকের একটি শফল কমান্ড রয়েছে যা পৃষ্ঠাগুলি জোটায়:

pdftk A=odd.pdf B=even.pdf shuffle A B output collated.pdf

1
এটি আমার পক্ষে ভাল কাজ করেছে, তবে সমান পৃষ্ঠাগুলি বিপরীত করার জন্য একটি টুইটের সাথে (প্রথম পৃষ্ঠাগুলির ক্রমটি উল্টিয়ে না দিয়ে আমি সেগুলি স্ক্যান করেছি): পিডিএফটিএকে এ = রেক্টো.পিডিএফ বি = ভার্সো.পিডিএফ একটি বেন্ড -১ আউটপুট সঙ্কুচিত হয়েছে। পিডিএফ
রূবেণ টমাস

কল্পনাপ্রসূত, ধন্যবাদ - এটি পুরোপুরি কাজ করে
ইনফোমানিয়াক

2

কেবলমাত্র একটি bashদ্রুত শট ব্যবহার করে pdfjam:

ইনপুট আর্গুমেন্টের একটি অ্যারে তৈরি করুন:

for k in $(seq 1 ${N_PAGES}); do
    PAGES+=(odd.pdf);
    PAGES+=($k);
    PAGES+=(even.pdf);
    PAGES+=($k);
done

এটি আপনাকে এর জন্য ইনপুট তালিকা হিসাবে এটি ব্যবহার করার অনুমতি দেবে pdfjoin:

 pdfjoin ${PAGES[@]} --outfile shuffled.pdf

2
এটি লক্ষ করা উচিত যে pdfjoinএটি একটি মোড়কের স্ক্রিপ্ট pdfjamযার চারপাশে নিজেই pdfpagesল্যাটেক্স প্যাকেজ (এবং পিডিফ্লেটেক্স) এর চারপাশে একটি র‍্যাপার স্ক্রিপ্ট তাই এর অর্থ এটি ল্যাটেক্সকে নির্ভরতা হিসাবে নিয়ে আসে।
স্টাফেন চেজেলাস

1

আপনি পিডিএফসাম বেসিক (ফ্রি এবং ওপেন সোর্স) এ মিক্স মডিউলটি ব্যবহার করতে পারেন বা সেজদার বিকল্প এবং মিক্স বৈশিষ্ট্যটি ব্যবহার করে অনলাইনে এটি করতে পারেন


1
সেরা সমাধানটি হস্তান্তরিত করুন: মুক্ত উত্স, কোনও ইনস্টলেশন প্রয়োজন installation 2 টি ক্লিক এবং সম্পন্ন;)
নাথান

0

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

প্রশ্নটি পুরানো ধরনের, তাই আমি আশা করি মূল প্রশ্নকারী এর চাহিদা ইতিমধ্যে পূরণ হয়ে গেছে। যাইহোক, এটা সম্ভব যে স্ক্রিপ্টটি ভবিষ্যতে এখানে আগত লোকদের পক্ষে কার্যকর হবে, তাই আমি এটি নীচে রেখেছি।

#!/usr/bin/python
"""A simple script to merge two PDFs."""

import argparse
from os import listdir
from os.path import join as opjoin
import shutil
from subprocess import check_call, CalledProcessError
import tempfile

SEPARATE = 'pdfseparate %s %s'
MERGE = 'pdfunite %s %s'

def my_exec(command):
    """Execute a command from a shell, ignoring errors."""
    try:
        check_call(command, shell=True)
    except CalledProcessError:
        pass

def run(odd, even, out, reverse_odd=False, reverse_even=True):
    """Interleave odd and even pages from two PDF files."""
    folder = tempfile.mkdtemp()
    my_exec(SEPARATE % (odd, opjoin(folder, 'odd%d.pdf')))
    my_exec(SEPARATE % (even, opjoin(folder, 'even%d.pdf')))
    odd_files = []
    even_files = []
    for curr_file in listdir(folder):
        filepath = opjoin(folder, curr_file)
        if curr_file.startswith('odd'):
            odd_files.append((filepath, int(curr_file[3:-4])))
        elif curr_file.startswith('even'):
            even_files.append((filepath, int(curr_file[4:-4])))
    func = lambda x: x[1]
    odd_files.sort(key=func, reverse=reverse_odd)
    even_files.sort(key=func, reverse=reverse_even)
    parts = []
    for line in zip(odd_files, even_files):
        parts.append(line[0][0])
        parts.append(line[1][0])
    my_exec(MERGE % (' '.join(parts), out))
    shutil.rmtree(folder)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Merge two PDF files.')
    parser.add_argument('odd_pages', help='PDF containing the odd pages.')
    parser.add_argument('even_pages', help='PDF containing the even pages.')
    parser.add_argument('output_file', help='The target output file.')
    parser.add_argument('--reverse-odd', action='store_true', 
                        help='Insert the odd pages in reverse order.')
    parser.add_argument('--no-reverse-even', action='store_true',
                        help='Suppress reversal of the even pages.')
    args = parser.parse_args()
    run(args.odd_pages, args.even_pages, args.output_file,
        args.reverse_odd, not args.no_reverse_even)

0

আমি এই ব্যাশ স্ক্রিপ্টটি পেরিয়ে এসেছি, এটি ধরে নিয়েছে যে আপনি বিপরীত ক্রমে এমনকি পৃষ্ঠাগুলি স্ক্যান করেছেন, তবে আপনি -rএটি লাইনটি মুছে ফেলা পরিবর্তন করতে পারেন evenpages=($(ls "$evenbase-$key-"* | sort -r))(এটি লাইন 46)

#!/bin/bash
# Copyright Fabien André <fabien.andre@xion345.info>
# Distributed under the MIT license
# This script interleaves pages from two distinct PDF files and produces an
# output PDF file. The odd pages are taken from a first PDF file and the even
# pages are taken from a second PDF file passed respectively as first and second
# argument.
# The first two pages of the output file are the first page of the
# odd pages PDF file and the *last* page of the even pages PDF file. The two
# following pages are the second page of the odd pages PDF file and the
# second to last page of the even pages PDF file and so on.
#
# This is useful if you have two-sided documents scanned each side on a
# different file as it can happen when using a one-sided Automatic Document
# Feeder (ADF)
#
# It does a similar job to :
# https://github.com/weltonrodrigo/pdfapi2/blob/46434ab3f108902db2bc49bcf06f66544688f553/contrib/pdf-interleave.pl
# but only requires bash (> 4.0) and poppler utils.
# Print usage/help message
function usage {
echo "Usage: $0 <PDF-even-pages-file> <PDF-odd-pages-file>"
exit 1
}
# Add leading zeros to pad numbers in filenames matching the pattern
# $prefix$number.pdf. This allows filenames to be easily sorted using
# sort.
# $1 : The prefix of the filenames to consider
function add_leading_zero {
prefix=$1
baseprefix=$(basename $prefix | sed -e 's/[]\/()$*.^|[]/\\&/g')
dirprefix=$(dirname $prefix)
for filename in "$prefix"*".pdf"
do
base=$(basename "$filename")
index=$(echo "$base" | sed -rn "s/$baseprefix([0-9]+).pdf$/\1/p")
newbase=$(printf "$baseprefix%04d.pdf" $index)
mv $filename "$dirprefix/$newbase"
done
}
# Interleave pages from two distinct PDF files and produce an output PDF file.
# Note that the pages from the even pages file (second file) will be used in
# the reverse order (last page first).
# $1 : Odd pages filename
# $2 : Odd pages filename with extension removed
# $3 : Even pages filename
# $4 : Even pages filename with extension removed
# $5 : Unique key used for temporary files
# $6 : Output file
function pdfinterleave {
oddfile=$1
oddbase=$2
evenfile=$3
evenbase=$4
key=$5
outfile=$6
# Odd pages
pdfseparate $oddfile "$oddbase-$key-%d.pdf"
add_leading_zero "$oddbase-$key-"
oddpages=($(ls "$oddbase-$key-"* | sort))
# Even pages
pdfseparate $evenfile "$evenbase-$key-%d.pdf"
add_leading_zero "$evenbase-$key-"
evenpages=($(ls "$evenbase-$key-"* | sort -r))
# Interleave pages
pages=()
for((i=0;i<${#oddpages[@]};i++))
do
pages+=(${oddpages[i]})
pages+=(${evenpages[i]})
done
pdfunite ${pages[@]} "$outfile"
rm ${oddpages[@]}
rm ${evenpages[@]}
}
if [ $# -lt 2 ]
then
usage
fi
if [ $1 == $2 ]
then
echo "Odd pages file and even pages file must be different." >&2
exit 1
fi
if ! hash pdfunite 2>/dev/null || ! hash pdfseparate 2>/dev/null
then
echo "This script requires pdfunite and pdfseparate from poppler utils" \
"to be in the PATH. On Debian based systems, they are found in the" \
"poppler-utils package"
exit 1
fi
oddbase=${1%.*}
evenbase=${2%.*}
odddir=$(dirname $oddbase)
oddfile=$(basename $oddbase)
evenfile=$(basename $evenbase)
outfile="$odddir/$oddfile-$evenfile-interleaved.pdf"
key=$(tr -dc "[:alpha:]" < /dev/urandom | head -c 8)
if [ -e $outfile ]
then
echo "Output file $outfile already exists" >&2
exit 1
fi
pdfinterleave $1 $oddbase $2 $evenbase $key $outfile
# SO - Bash command that prints a message on stderr
# http://stackoverflow.com/questions/2643165/bash-command-that-prints-a-message-on-stderr
# SO - Check if a program exists from a bash script
# http://stackoverflow.com/questions/592620/check-if-a-program-exists-from-a-bash-script
# SO - How to debug a bash script?
# http://stackoverflow.com/questions/951336/how-to-debug-a-bash-script
# SO - Escape a string for sed search pattern
# http://stackoverflow.com/questions/407523/escape-a-string-for-sed-search-pattern

উৎস

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