Проверьте, действительно ли PDF файл (Python)
Я получаю файл через HTTP-Upload и должен быть уверен в его pdf файле. Язык программирования - это Python, но это не имеет значения.
Я подумал о следующих решениях:
-
Проверьте, являются ли первые байты строки "% PDF". Это не очень хорошая проверка, но не позволяет загружать другие файлы случайно.
-
Попробуйте libmagic (используется команда "файл" в bash). Это делает ту же проверку, что и 1.
-
Возьмите lib и попробуйте прочитать счетчик страниц из файла. Если lib может читать pagecount, он должен быть действительным pdf. Проблема: я не знаю lib для python, который может это сделать
У кого-нибудь есть какие-либо решения для lib или другого трюка?
Спасибо
Ответы
Ответ 1
Двумя наиболее часто используемыми библиотеками PDF для Python являются:
Оба являются чистым питоном, поэтому его легко установить и быть кросс-платформенным.
С pyPdf это, вероятно, будет так же просто, как делать:
from pyPdf import PdfFileReader
doc = PdfFileReader(file("upload.pdf", "rb"))
Этого должно быть достаточно, но doc
теперь будет иметь методы documentInfo()
и numPages()
, если вы хотите продолжить проверку.
Как ответил Карл, pdftotext также является хорошим решением и, вероятно, будет быстрее на очень больших документах (особенно с перекрестными ссылками). Однако это может быть немного медленнее в маленьком PDF из-за системных издержек, связанных с разветвлением нового процесса и т.д.
Ответ 2
Поскольку, по-видимому, больше нет PyPdf
и ReportLab
, то текущее решение, которое я нашел (по состоянию на 2015 год), заключается в использовании PyPDF2
и исключение catch (и, возможно, проанализировать getDocumentInfo()
)
import PyPDF2
with open("testfile.txt", "w") as f:
f.write("hello world!")
try:
PyPDF2.PdfFileReader(open("testfile.txt", "rb"))
except PyPDF2.utils.PdfReadError:
print("invalid PDF file")
else:
pass
Ответ 3
В проекте, если мне нужно проверить тип mime некоторого загруженного файла. Я просто использую команду file следующим образом:
from subprocess import Popen, PIPE
filetype = Popen("/usr/bin/file -b --mime -", shell=True, stdout=PIPE, stdin=PIPE).communicate(file.read(1024))[0].strip()
Вы, конечно, можете переместить фактическую команду в какой-либо файл конфигурации, так как параметры командной строки различаются между операционными системами (например, mac).
Если вам просто нужно знать, является ли это PDF или нет, и не нужно его обрабатывать, я думаю, что команда файла является более быстрым решением, чем lib. Разумеется, выполнение этого также возможно, но команда файла дает вам больше гибкости, если вы хотите проверить разные типы.
Ответ 4
Если вы используете ядро Linux или OS X, вы можете использовать Pdftotext (часть Xpdf, найденная здесь). Если вы передадите не PDF файл в pdftotext, он, безусловно, будет лаять на вас, и вы можете использовать команду command.getstatusoutput, чтобы получить результат и проанализировать его для этих предупреждений.
Если вы ищете независимое от платформы решение, вы можете использовать pyPdf.
Изменить: Это не изящно, но похоже, что pyPdf PdfFileReader будет вызывать IOError (22), если вы попытаетесь загрузить не PDF.
Ответ 5
Допустим, вы имеете в виду, что он может отображаться программой просмотра PDF или что текст может быть извлечен? Это две разные вещи.
Если вы просто хотите проверить, действительно ли это файл PDF, который был загружен, тогда будет создано решение pyPDF или что-то подобное.
Если, однако, вы хотите проверить, что текст может быть извлечен, тогда вы нашли целый мир боли! Использование pdftotext будет простым решением, которое будет работать в большинстве случаев, но оно ни в коем случае не является 100% успешным. Мы нашли много примеров PDF файлов, которые pdftotext не может извлечь из, но библиотеки Java, такие как iText и PDFBox.
Ответ 6
Я столкнулся с той же проблемой, но не был вынужден использовать язык программирования для управления этой задачей. Я использовал pyPDF, но не был эффективен для меня, так как он бесконечно зависает на некоторых поврежденных файлах.
Тем не менее, я нашел это программное обеспечение полезным до сих пор.
Удачи с этим.
https://sourceforge.net/projects/corruptedpdfinder/