Theo bước chân của @ n0nuf, tôi đã viết một tập lệnh bó để kiểm tra tất cả các tệp PDF trong một thư mục cụ thể bằng pdfinfo và đẩy nó qua cpdf nếu bị hỏng như một nỗ lực khắc phục chúng:
@ECHO OFF
FOR %%f in (*.PDF) DO (
echo %%f
pdfinfo "%%f" 2>&1 | findstr /I "error" >nul 2>&1
if not errorlevel 1 (
echo "bad -> try to fix"
@cpdf -i %%f -o %%f_.pdf 2>NUL
mv %%f .\\bak\\%%f
) else (
REM echo good
)
)
@ECHO ON
Hoặc giống như tập lệnh bash:
for file in $(find . -iname "*.pdf")
do
echo "$file"
pdfinfo "$file" 2>&1 | grep -i 'error' &> /dev/null
if [ $? == 0 ]; then
echo "broken -> try to fix"
cpdf -i "$file" -o "$file"_.pdf
fi
done
Các tệp PDF bị hỏng sẽ được chuyển đến thư mục con \ bak và các tệp PDF được tạo lại có hậu tố _.pdf (không hoàn hảo, nhưng đủ tốt cho tôi). GHI CHÚ: Một tệp PDF được tạo lại chứa các lỗi ít hơn và có thể xem được bằng trình xem PDF thông thường. Nhưng điều này không có nghĩa là bạn lấy lại tất cả nội dung của mình. Nội dung không thể phục hồi dẫn đến các trang trống.
Tôi cũng đã thử tương tự với JHOVE (công cụ nhận dạng, xác thực & xác định định dạng tệp nguồn mở) như được đề xuất bởi @kraftydevil tại đây: Kiểm tra xem các tệp PDF có bị hỏng khi sử dụng dòng lệnh trên Linux hay không và bây giờ có thể xác nhận đây cũng là một cách tiếp cận hợp lệ. (Đầu tiên tôi đã thành công ít hơn. Nhưng sau đó tôi nhận thấy tôi đã không xử lý chính xác đầu ra của JHOVE.)
Để kiểm tra cả hai cách tiếp cận, tôi đã xóa và thay đổi các phần ngẫu nhiên từ PDF bằng trình chỉnh sửa văn bản (đã xóa các luồng, do đó các trang không thể hiển thị trong trình xem PDF của tôi, Thẻ PDF đã thay đổi và thay đổi một số bit). Kết quả là: Cả pdfinfo và JHOVE đều có thể phát hiện ra các tệp bị hỏng một cách chính xác (trong một số trường hợp, JHISE thậm chí còn nhạy hơn).
Và đây là kịch bản tương đương cho JHOVE:
@ECHO OFF
FOR %%f in (*.PDF) DO (
echo %%f
"C:\Program Files (x86)\JHOVE\jhove.bat" -m pdf-hul %%f | findstr /C:"Well-Formed and valid" >nul 2>&1
if not errorlevel 1 (
echo good
) else (
echo "bad -> try to fix"
@cpdf -i %%f -o %%f_.pdf 2>NUL
REM mv %%f .\\bak\\%%f
)
)
@ECHO ON