我们重新启动了一个网站和数百个不同语言的 PDF 以及硬打印的 QR 代码。
重新启动后,我们遇到了问题,某些 QR 代码未链接到正确的 UR。 为了减少工作量,我的想法是加载所有 PDF,扫描 QR 码,从 pdf 中提取 URL 并发出请求,该请求是 URL 的状态代码 200(并有一个包含所有文档和链接的表格)。|| |但是我的代码找不到 QR 码。
有任何帮助修复吗?
不同的代码和应用程序
import os
import requests
import fitz # PyMuPDF
import cv2
from pyzbar.pyzbar import decode
import numpy as np
import csv
import pdfplumber
# Funktion zum Herunterladen der PDFs
def download_pdf(url, save_path):
if os.path.exists(save_path):
print(f"{save_path} already exists, skipping download.")
return True
response = requests.get(url)
if response.status_code == 200:
with open(save_path, 'wb') as f:
f.write(response.content)
print(f"Downloaded {url}")
return True
else:
print(f"Failed to download {url}, status code: {response.status_code}")
return False
# Funktion zum Konvertieren von PDF-Seiten in Bilder mit PyMuPDF
def pdf_to_images(pdf_path):
doc = fitz.open(pdf_path)
images = []
for page in doc:
pix = page.get_pixmap()
if pix.alpha:
img = np.frombuffer(pix.samples, dtype=np.uint8).reshape(pix.height, pix.width, 4)
else:
img = np.frombuffer(pix.samples, dtype=np.uint8).reshape(pix.height, pix.width, 3)
images.append(img)
return images
# Funktion zum Extrahieren von QR-Codes aus einem Bild
def extract_qr_codes(image):
qr_codes = decode(image)
return [qr.data.decode('utf-8') for qr in qr_codes]
# Funktion zum Überprüfen der URL und Rückgabe des Statuscodes
def check_url(url):
try:
response = requests.head(url, allow_redirects=True)
return response.status_code
except requests.RequestException as e:
print(f"Error checking URL {url}: {e}")
return 'Error'
# Alternative Methode zur Bildextraktion mit pdfplumber
def extract_images_and_decode_qr(pdf_path):
with pdfplumber.open(pdf_path) as pdf:
for page in pdf.pages:
im_list = page.images
for im in im_list:
bbox = (im['x0'], im['top'], im['x1'], im['bottom'])
cropped_image = page.crop(bbox).to_image(resolution=300)
image = np.array(cropped_image.original)
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
qr_codes = decode(image)
for qr in qr_codes:
print("Gefundener QR-Code:", qr.data.decode())
# Hauptfunktion zum Verarbeiten der PDFs
def process_pdfs(url_list):
results = []
for url in url_list:
pdf_filename = os.path.basename(url)
pdf_path = os.path.join('downloads', pdf_filename)
if not os.path.exists('downloads'):
os.makedirs('downloads')
if download_pdf(url, pdf_path):
print(f"Processing {pdf_path}...")
images = pdf_to_images(pdf_path)
for img in images:
qr_urls = extract_qr_codes(img)
for qr_url in qr_urls:
status_code = check_url(qr_url)
results.append((pdf_filename, qr_url, status_code))
# Versuchen Sie es mit pdfplumber, wenn keine QR-URLs gefunden wurden
if not any(result[1] for result in results if result[0] == pdf_filename):
extract_images_and_decode_qr(pdf_path)
if results:
with open('results.csv', 'w', newline='') as file:
writer = csv.writer(file)
writer.writerow(['PDF Name', 'QR Code', 'Target URL', 'Status Code'])
for result in results:
writer.writerow(result)
else:
print("No results to write to CSV.")
# Testaufruf für URLs
if __name__ == "__main__":
url_list = [
"https:.....pdf"
]
process_pdfs(url_list)
期望:QR 码后面的 URL 的状态代码,以及 QR 码检测作为基本。
Expecting: Status Code of the URL behind QR-Code, and QR-Code detection as basic.
你的代码看起来很有条理,而且思路正确!问题可能出在 QR 码的检测方法上,特别是如果 QR 码很小或者分辨率低的时候。
让我们来优化你的代码以便更可靠地检测和处理 QR 码:
import os
import requests
import fitz # PyMuPDF
import cv2
from pyzbar.pyzbar import decode
import numpy as np
import csv
import pdfplumber
# 函数用于下载 PDF 文件
def download_pdf(url, save_path):
# ... (代码不变)
# 函数用于使用 PyMuPDF 将 PDF 页面转换为图像
def pdf_to_images(pdf_path):
# ... (代码不变)
# 函数用于从图像中提取 QR 码
def extract_qr_codes(image):
qr_codes = decode(image)
if qr_codes:
return [qr.data.decode('utf-8') for qr in qr_codes]
else:
# 如果使用默认设置找不到 QR 码,请尝试使用更高的分辨率
resized_image = cv2.resize(image, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)
qr_codes = decode(resized_image)
if qr_codes:
return [qr.data.decode('utf-8') for qr in qr_codes]
else:
return []
# 函数用于检查 URL 并返回状态代码
def check_url(url):
# ... (代码不变)
# 使用 pdfplumber 提取图像并解码 QR 码的备用方法
def extract_images_and_decode_qr(pdf_path):
# ... (代码不变)
# 主要函数用于处理 PDF 文件
def process_pdfs(url_list):
results = []
for url in url_list:
# ... (代码不变)
# ... (代码不变)
# 尝试使用 pdfplumber,如果使用 PyMuPDF 找不到 QR URL,则尝试使用 pdfplumber
if not any(result[1] for result in results if result[0] == pdf_filename):
print(f"Trying with pdfplumber for {pdf_filename}...")
extract_images_and_decode_qr(pdf_path)
# ... (代码不变)
# 用于 URL 的测试调用
if __name__ == "__main__":
# ... (代码不变)
改进之处:
- 提高 QR 码检测的可靠性:
-
如果在初始尝试中未找到 QR 码,我们现在会使用
cv2.resize
函数放大图像。这可以帮助检测较小或分辨率较低的 QR 码。 - 增强的错误处理:
-
如果
extract_qr_codes
函数在调整大小后仍未找到任何 QR 码,则返回一个空列表,以避免错误并继续处理。 - 更清晰的日志记录:
-
添加了一条消息,指示何时使用
pdfplumber
作为备用方法。
其他提示:
- QR 码质量: 确保 PDF 文件中的 QR 码清晰且分辨率足够高。低质量的 QR 码可能难以检测。
- QR 码大小: 如果 QR 码相对于页面大小而言过小,则可能需要更积极地调整图像大小或考虑在检测之前裁剪页面区域。
- 对比度: 确保 QR 码与其背景之间有足够的对比度。
通过这些改进,你的代码应该能够更可靠地从 PDF 文件中提取 QR 码并检查其 URL。如果仍然遇到问题,请提供示例 PDF 文件或图像,以便我进行进一步调查!
标签:python,qr-code From: 78790546