Làm cách nào tôi có thể chuyển đổi tệp pdf từ thang màu xám sang đen trắng?


11

Hệ điều hành của tôi là Ubuntu 12.04. Làm cách nào tôi có thể chuyển đổi tệp pdf từ thang màu xám sang đen trắng? Tệp pdf tỷ lệ xám xuất phát từ việc quét với tùy chọn thang màu xám và pdf tỷ lệ trắng đen được OCR yêu cầu.


Cập nhật:

Theo câu trả lời của Marco, bản pdf pdf không tốt và tệp gốc có ở đây .


thửscantailor
frostschutz

scantailorcó vô số tính năng hữu ích khác khi chuẩn bị quét OCR, và đó là lý do duy nhất khiến tôi đề xuất nó (như một bình luận, không phải là một câu trả lời)
frostschutz

Bạn có thể mở và xuất, (ít nhất là một số) .pdf trong libreoffice (và do đó tôi sẽ đoán hầu hết các trình xử lý văn bản hiện đại). Không biết điều đó sẽ làm cho thay đổi mong muốn của bạn có thể hoặc dễ dàng tho.
goldilocks

1
Ngoài ra còn có pdfimages(poppler) để trích xuất hình ảnh được quét từ bộ chứa PDF của nó. Có thể hiệu quả hơn để xử lý chúng với ImageMagick ngay từ đầu.
frostschutz

Câu trả lời:


9

1) Sử dụng ghostscript để chuyển đổi tệp PDF thành tệp PostScript đơn sắc bằng thiết bị psmono :

gs -q -sDEVICE=psmono -o mono.ps input.pdf

2) Sau đó chuyển đổi PostScript đơn sắc thành PDF:

ps2pdf mono.ps

EDIT: Thiết psmonobị tạo ra hình ảnh nửa tông 1 bit rõ ràng không phải là thứ bạn muốn. Tôi không thể tìm ra cách chỉ định ngưỡng bằng ghostscript, vì vậy tôi đã dùng đến hình ảnh tưởng tượng. convertbên trong sử dụng ghostscript để chuyển đổi PDF. Sau đó, nó áp dụng bộ lọc ngưỡng để tạo ra hình ảnh 1 bit và sử dụng lại ghostscript để tạo tệp PDF. Do convertsử dụng độ phân giải 75DPI theo mặc định, có thể không khớp với độ phân giải thực tế của bạn, bạn có thể cung cấp densityđối số. Và thử nghiệm với các thresholdthiết lập. Các giá trị tối ưu phụ thuộc nhiều vào tệp đầu vào.

convert -density 150 -threshold 50% input.pdf output.pdf

Cảm ơn! Một vấn đề khi chạy lệnh đầu tiên: pdf quy mô màu xám ban đầu khoảng 25 MB và việc chạy chưa kết thúc sau 15 phút và tệp đầu ra mono.ps đã 150MB và vẫn đang tăng. Tôi lo lắng về điều đó. Có cách nào khác, ví dụ, in ra tệp pdf pdf không?
Tim

@Tim Điều đó không có gì lạ. Các tệp PostScript không bị nén, tệp PDF kết quả sẽ nhỏ hơn.
Marco

Cảm ơn. Mất khoảng 20 phút. Các pdf pdf không tốt. và tập tin gốc ở đây
Tim

@Tim chất lượng khủng khiếp, không phù hợp với OCR cho dù bạn làm gì.
frostschutz

4

Cách tốt nhất tôi tìm thấy ở đó, mà không giảm chất lượng, loại bỏ bóng, tiếng ồn, văn bản từ trang tiếp theo chảy máu, v.v.

1) Đầu tiên chuyển đổi pdf thành hình ảnh cá nhân

pdfimages combined_ocr.pdf page

2) Thứ hai loại bỏ bóng, tiếng ồn, văn bản từ trang tiếp theo chảy qua (tín dụng cho blog này )

ls ./p*.ppm | xargs -L1 -I {} convert {}  -quality 100 -density 300 -fill white -fuzz 80% +opaque "#000000" {}.jpg

điều này có thể được thêm vào dưới dạng bước thêm hoặc thay vì lệnh ở trên để thực sự chỉ có hai màu:

ls ./p*.ppm | xargs -L1 -I {} convert {} +dither -colors 2 -type bilevel -density 300 -fill white -fuzz 40% +opaque "#000000" -density 300 {}.jpg

3) Điều này để tạo một tệp pdf ra khỏi mọi hình ảnh jpg mà không làm giảm độ phân giải hoặc chất lượng:

ls -1 ./*jpg | xargs -L1 -I {} img2pdf {} -o {}.pdf

4) Điều này để ghép các trang pdf thành một:

pdftk *.pdf cat output combined.pdf

5) Và cuối cùng tôi thêm một lớp văn bản OCRed không làm thay đổi chất lượng quét trong các tệp pdf để chúng có thể tìm kiếm được:

pypdfocr combined.pdf 

3

Tôi cũng đã có một số pdf màu quét và pdf thang độ xám mà tôi muốn chuyển đổi sang bw. Tôi đã thử sử dụng gsvới mã được liệt kê ở đây và chất lượng hình ảnh vẫn tốt với văn bản pdf vẫn còn đó. Tuy nhiên, mã gs đó chỉ chuyển đổi sang thang độ xám (như được hỏi trong câu hỏi) và vẫn có kích thước tệp lớn. convertmang lại kết quả rất kém khi sử dụng trực tiếp.

Tôi muốn bw pdf với chất lượng hình ảnh tốt và kích thước tệp nhỏ. Giải pháp của tôi sử dụng gsđể trích xuất các tệp bmp thang độ xám từ pdf, convertđể ngưỡng các bmps đó thành bw và lưu chúng dưới dạng tệp tiff, sau đó img2pdf để nén các hình ảnh tiff và hợp nhất tất cả chúng thành một pdf.

Tôi đã cố gắng trực tiếp đến tiff từ pdf nhưng chất lượng không giống nhau nên tôi lưu từng trang vào bmp. Đối với một tệp pdf một trang, convertthực hiện một công việc tuyệt vời từ bmp đến pdf. Thí dụ:

gs -sDEVICE=bmpgray -dNOPAUSE -dBATCH -r300x300 \
   -sOutputFile=./pdf_image.bmp ./input.pdf

convert ./pdf_image.bmp -threshold 40% -compress zip ./bw_out.pdf

Đối với nhiều trang, gscó thể hợp nhất nhiều tệp pdf thành một, nhưng img2pdfmang lại kích thước tệp nhỏ hơn gs. Các tệp tiff phải được giải nén làm đầu vào cho img2pdf. Hãy ghi nhớ với số lượng lớn các trang, các tệp bmp và tiff trung gian có xu hướng có kích thước lớn. pdftkhoặc joinpdfsẽ tốt hơn nếu họ có thể hợp nhất các tệp pdf nén từ convert.

Tôi tưởng tượng có một giải pháp thanh lịch hơn. Tuy nhiên, phương pháp của tôi tạo ra kết quả với chất lượng hình ảnh rất tốt và kích thước tệp nhỏ hơn nhiều. Để lấy lại văn bản trong pdf bw, hãy chạy lại OCR.

Kịch bản shell của tôi sử dụng gs, convert và img2pdf. Thay đổi các tham số (# trang, quét dpi, ngưỡng%, v.v.) được liệt kê ngay từ đầu khi cần và chạy chmod +x ./pdf2bw.sh. Đây là tập lệnh đầy đủ (pdf2bw.sh):

#!/bin/bash

num_pages=12
dpi_res=300
input_pdf_name=color_or_grayscale.pdf
bw_threshold=40%
output_pdf_name=out_bw.pdf
#-------------------------------------------------------------------------
gs -sDEVICE=bmpgray -dNOPAUSE -dBATCH -q -r$dpi_res \
   -sOutputFile=./%d.bmp ./$input_pdf_name
#-------------------------------------------------------------------------
for file_num in `seq 1 $num_pages`
do
  convert ./$file_num.bmp -threshold $bw_threshold \
          ./$file_num.tif
done
#-------------------------------------------------------------------------
input_files=""

for file_num in `seq 1 $num_pages`
do
  input_files+="./$file_num.tif "
done

img2pdf -o ./$output_pdf_name --dpi $dpi_res $input_files
#-------------------------------------------------------------------------
# clean up bmp and tif files used in conversion

for file_num in `seq 1 $num_pages`
do
  rm ./$file_num.bmp
  rm ./$file_num.tif
done

2

Trên thực tế, nếu xuất phát từ quá trình quét, cách hợp lý duy nhất là sử dụng pdfimages và chuyển đổi đồ họa cơ bản. Tôi đã sử dụng tập lệnh này để chuyển đổi nó:

#!/bin/sh
if [ -z "$1" -o -z "$2" ]; then
    echo "Syntax: $0 <input.pdf> <output.pdf>"
    exit 1
fi

pdfimages "$1" scan
for a in scan*.ppm; do 
   convert -white-threshold 85% -monochrome $a `basename $a .ppm`.tiff
done
tiffcp scan*.tiff output.tiff
tiff2pdf output.tiff -o "$2" -p A4 -F
rm scan*.ppm scan*.tiff output.tiff

1

Cảm ơn OccamsRazor cho kịch bản của mình, công việc tuyệt vời này là chuyển đổi cả PDF và màu xám thành phiên bản đơn sắc nhỏ gọn và dễ đọc. Đây thực sự là một nhận xét về bài đăng của OccamsRazor, nhưng tôi không có đủ điểm để bình luận.

Tập lệnh sẽ thất bại img2pdf -o ./$output_pdf_name --dpi $dpi_res $input_files--dpikhông còn là đối số được chấp nhận cho img2pdf. Thay vào đó, nó nhận được độ phân giải từ tệp đầu vào, vì vậy bạn có thể bỏ qua nó.

Đây là phiên bản kịch bản của tôi. Tôi không muốn chỉnh sửa tập lệnh cho mọi tệp, vì vậy tôi chuyển số lượng trang và tên tệp nhập khi tôi chạy. Tôi có tập tên đầu ra và thiết lập độ phân giải 200 dpi, mà làm việc cho công việc của tôi, nhưng bạn có thể muốn thay đổi nó, hoặc biến chúng thành và và vượt qua chúng trong.00input_name$3$4

Để chạy, sử dụng , ví dụ , ../pdf2bw.sh <number_of_pages> <input_name>./pdf2bw.sh 55 input.pdf

#!/bin/bash

num_pages=$1
input_pdf_name=$2
output_pdf_name="00$2"
bw_threshold=40%
dpi_res=200
#-------------------------------------------------------------------------
gs -sDEVICE=bmpgray -dNOPAUSE -dBATCH -q -r$dpi_res \
   -sOutputFile=./%d.bmp ./$input_pdf_name
#-------------------------------------------------------------------------
for file_num in `seq 1 $num_pages`
do
  convert ./$file_num.bmp -threshold $bw_threshold \
          ./$file_num.tif
done
#-------------------------------------------------------------------------
input_files=""

for file_num in `seq 1 $num_pages`
do
  input_files+="./$file_num.tif "
done

img2pdf -o ./$output_pdf_name $input_files
#-------------------------------------------------------------------------
# clean up bmp and tif files used in conversion

for file_num in `seq 1 $num_pages`
do
  rm ./$file_num.bmp
  rm ./$file_num.tif
done

Bạn nên trích dẫn các biến shell của bạn; đặc biệt là những cái xuất phát từ các đối số hoặc đầu vào của người dùng khác: ví dụ "./$input_pdf_name"và thậm chí seq 1 "$num_pages". Ngoài ra, bạn có thể muốn thay đổi `…`thành $(…)- xem cái này , cái nàycái này .
G-Man nói 'Phục hồi Monica'

Đây là kịch bản của OccamsRazor ngoại trừ những thay đổi tôi đã lưu ý. Tôi không phải là lập trình viên hệ vỏ, vì vậy tôi không muốn làm hỏng thứ gì đó hiệu quả. Nhưng nếu bất cứ ai muốn làm sạch điều này, bạn có lời cảm ơn của tôi.
tường thấp
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.