Tại sao hình ảnh lấy ra từ PDF khác với hình ảnh nhìn thấy trên trang?

Hình ảnh có độ trong suốt có thể được lưu trữ riêng biệt dưới dạng hình ảnh chính và mặt nạ mềm. Tiếp theo, sử dụng Pillow để tạo RGBA PNG, chèn tệp PDF trong bộ nhớ và lấy hình ảnh chính và SMask. Việc trích xuất các byte hình ảnh chính không có nghĩa là đạt được hiệu ứng trong suốt hoàn toàn cũng như không bằng việc tái tạo lại tất cả các phiên bản hiển thị trên trang.

Hình ảnh bạn trích xuất từ tệp PDF thường trông khác với những gì bạn nhìn thấy trên trang: chúng hoàn toàn đen, kích thước sai hoặc thiếu hình nền hoặc hình mờ. Vấn đề thường không nằm ở chính mã mà thực tế là bạn đang đọc đối tượng hình ảnh gốc bên trong tệp PDF và thiếu hướng dẫn bố cục khi hiển thị trang.

Bài viết này được viết cho các nhà phát triển và người xử lý tài liệu, những người cần sử dụng tập lệnh để phân tích hình ảnh PDF. Nó phù hợp với các tình huống như tiền xử lý OCR và sắp xếp lại nội dung. Sau khi đọc, bạn có thể hiểu sự khác biệt giữa đối tượng ban đầu và hiển thị trang, biết lý do SMask (mặt nạ mềm) gây mất vùng trong suốt và nắm vững bộ phương pháp tự kiểm tra bằng cách sử dụng mẫu tổng hợp.

Bài viết này sử dụng các mẫu tổng hợp để trình bày phương pháp xử lý. Mã đã được kiểm tra bằng các ví dụ trong môi trường biệt lập và không đảm bảo cho tất cả các tệp thực hoặc hiệu suất sản phẩm. Trước khi xử lý các văn bản quan trọng, vui lòng giữ lại bản chính và xem xét theo ranh giới và các mục chấp nhận trong văn bản.

##Kết quả trích xuất ảnh PDF không nhất quán với trang? Một câu kết luận

Các byte hình ảnh chính được trích xuất không bằng hiệu ứng hoàn chỉnh trên trang. SMask cần được xử lý cùng lúc và kết quả hiển thị thực tế của đầu đọc được sử dụng làm điểm chuẩn chấp nhận.

hoàn cảnh của bạnCác phương pháp được đề xuấtlý do
Kết quả trích xuất là một hình chữ nhật đồng màu và vùng trong suốt trở thành màu đen hoặc trắngKiểm tra xem smask_xref có bằng 0 hay không và hợp nhất SMask dưới dạng kênh Alpha vào hình ảnh chínhHình ảnh có độ trong suốt có thể được lưu trữ riêng biệt làm hình ảnh chính và mặt nạ mềm. Chỉ trích xuất hình ảnh chính sẽ làm mất thông tin trong suốt.
Những gì được trích xuất là hình ảnh lớn hoàn chỉnh và chỉ một phần của nó được hiển thị trên trang.Đọc ma trận CTM và /BBox, cắt theo vùng hiển thịCùng một bản đồ cơ sở có thể được nhiều trang sử dụng lại và mỗi trang chỉ hiển thị một phần diện tích của nó.
Hướng hình ảnh bị đảo ngược hoặc bị biến dạngĐọc các tham số ma trận để hiệu chỉnh hình học và kiểm tra văn bản và khuôn mặt theo cách thủ côngMa trận biến đổi có thể chứa các phép biến đổi tỷ lệ âm hoặc không đồng nhất
Trích xuất thành công nhưng không thể nhìn thấy trangTruy vấn trạng thái OCG và so sánh với CropBoxHình ảnh có thể bị ẩn bởi nhóm nội dung tùy chọn hoặc nằm ngoài vùng cắt
Hình ảnh bị mờ hoặc độ phân giải thấpGhi lại siêu dữ liệu DPI và đánh dấu là chất lượng thấp, quét lại các tệp nguồn nếu cầnBản thân hình ảnh được nhúng ban đầu có thể là hình thu nhỏ có độ phân giải thấp

Sự khác biệt giữa đối tượng ban đầu và quy trình kết xuất

Các tệp PDF có cấu trúc giống như một kho tài nguyên. `Document.extract_image(xref)` Phương pháp này thực hiện là lấy các bộ phận ra khỏi kho như hiện trạng. Việc hiển thị trên trang cũng cần phải trải qua nhiều quy trình: chia tỷ lệ ma trận biến đổi (CTM), cắt đường dẫn (Clip Path), trộn nhóm trong suốt (Nhóm trong suốt) và lớp phủ mặt nạ mềm (Soft Mask).

Sự khác biệt điển hình nhất đến từ SMask. Nhiều PNG có kênh trong suốt được chia thành hai phần bên trong tệp PDF: luồng hình ảnh RGB và luồng mặt nạ Xám riêng biệt. Nếu bạn chỉ trích xuất hình ảnh chính và loại bỏ đối tượng SMask liên quan, bạn sẽ nhận được một hình chữ nhật không có độ trong suốt và vùng trong suốt ban đầu sẽ trở thành màu đen hoặc trắng.

Ngoài ra, để tiết kiệm dung lượng, cùng một bản đồ cơ sở có độ phân giải cao có thể được nhiều trang sử dụng lại và mỗi trang chỉ hiển thị một phần của nó thông qua các ma trận và /BBox khác nhau. Trích xuất trực tiếp sẽ mang lại hình ảnh lớn hoàn chỉnh chứ không phải các mảnh bị cắt mà người dùng nhìn thấy. "Những gì bạn thấy không phải là những gì bạn nhận được" là một đặc điểm cố hữu của PDF dưới dạng định dạng trao đổi và không phải là một lỗ hổng của thư viện phân tích cú pháp.

Bảng dưới đây so sánh hai quan điểm:

📊 So sánh cốt lõi

Kích thước tương phảnTrích xuất trực tiếp đối tượng ban đầuKết quả hiển thị trang
Lấy nội dungCác phần gốc trong kho tài nguyên, chẳng hạn như luồng hình ảnh chínhHiệu ứng hình ảnh sau khi xử lý theo hướng dẫn tổng hợp
minh bạchHình ảnh chính và SMask có thể được lưu riêng biệt và phải được gán thủ côngMặt nạ mềm đã được thêm vào, và vùng trong suốt hiển thị bình thường
Kích thước và dải sản phẩmCó thể đó là kích thước đầy đủ của bản đồ cơ bảnBị giới hạn bởi CTM, /BBox và đường cắt
Tình trạng tái sử dụngCùng một bản đồ cơ sở có thể được chia sẻ trên nhiều trangMỗi trang chỉ trình bày các phần riêng của nó

Môi trường kiểm thử tổng hợp và xử lý tình huống biên

Để xác minh logic trích xuất mà không phụ thuộc vào các tệp bên ngoài, cần xây dựng một PDF tổng hợp chứa SMask. Đoạn mã sau sử dụng PyMuPDF để tạo các tài liệu thử nghiệm trong bộ nhớ, nơi các đối tượng hình ảnh có mặt nạ mềm độc lập, mô phỏng một kịch bản thực tế trong đó "biểu tượng có nền trong suốt nhưng được lưu trong các luồng riêng biệt ở phía dưới."

from io import BytesIO
from PIL import Image
import pymupdf
im = Image.new("RGBA", (16, 16), (255, 0, 0, 128))
raw = BytesIO()
im.save(raw, format="PNG")
with pymupdf.open() as doc:
    page = doc.new_page(width=100, height=100)
    page.insert_image(pymupdf.Rect(10, 10, 70, 70), stream=raw.getvalue())
    images = page.get_images(full=True)
    assert len(images) == 1
    xref, smask = images[0][:2]
    assert xref > 0 and smask > 0
    assert doc.extract_image(xref)["width"] == 16
    assert doc.extract_image(smask)["image"]

Đầu ra kỳ vọng chính xác: Chương trình cần nhận diện rằng hình ảnh liên kết với SMask và trích xuất thành công dữ liệu hình ảnh chính.

Mã nguồn hoàn toàn tự chứa và không cần các tệp đầu vào bên ngoài. Nó tổng hợp các file PDF với SMask trong bộ nhớ và sau đó kiểm tra xem logic trích xuất có xác định đúng các liên kết mặt nạ hay không. Mã nguồn chứa hai khẳng định chính: một xác minh tính toàn vẹn của dữ liệu được trích xuất, và một xác minh nhận thức về các trạng thái liên kết SMask.

Mã này tập trung vào xác minh tính toàn vẹn ở cấp siêu dữ liệu. Trong sản xuất thực tế, nếu sử dụng smask_xref != 0, các thư viện như Pillow cần dán kết quả của doc.extract_image(smask_xref) dưới dạng kênh Alpha lên ảnh chính. Hai khẳng định này lần lượt bao gồm hai hợp đồng cốt lõi: "Trích xuất dữ liệu" và "Mask-Associative Visibleness," giúp ngăn chặn thành công giả khi xảy ra các thay đổi tài liệu hoặc API.

Ranh giới giữa việc chấp nhận kết quả trích xuất và đánh giá thủ công

Trích xuất tự động không thể thay thế hoàn toàn xác nhận bằng hình ảnh. Bảng dưới đây tóm tắt các hiện tượng bất thường phổ biến, các chiến lược xử lý và các tình huống cần được đánh giá thủ công.

Quan sát hiện tượngNhững lý do có thể xảy raQuyết định xử lý tự độngXem xét thủ công các điều kiện kích hoạt
Hình ảnh hoàn toàn đen hoặc trắng hoàn toànSMask được trích xuất dưới dạng hình ảnh độc lập; Giải mã không gian màu thất bạiKiểm tra các liên kết SMask; Thử lùi lại không gian màuNội dung vẫn không thể được nhận diện sau khi hoàn tác; Liên quan đến màu spot hoặc màu liên quan đến thiết bị
Hướng hình ảnh bị đảo ngược hoặc kéo giãnMa trận CTM chứa các phép biến đổi tỉ lệ âm hoặc không đồng đềuĐọc tham số ma trận cho hiệu chỉnh hình họcSau khi chỉnh sửa, văn bản hoặc khuôn mặt bị biến dạng rõ rệt; Đường cắt vector phức tạp
Nhiều hình ảnh nhỏ kết hợp thành một hình ảnh lớn duy nhấtMã khối (Mẫu lát gạch) hoặc lưu trữ dạng dảiCắt hoặc nối theo tọa độ BBoxNhững đường may rõ ràng ở các khớp nối; Về mặt logic, nó nên là một đơn vị ngữ nghĩa độc lập
Giải nén thành công, nhưng trang không hiển thịBị ẩn bởi OCG (Nhóm Nội dung Tùy chọn); Nằm ngoài khu vực cắtLọc trạng thái OCG truy vấn; So sánh với CropBoxLogic lớp rất phức tạp, chẳng hạn như OCMD lồng nhau; Trường biểu mẫu động
Độ phân giải cực kỳ thấp hoặc mờBản nhúng gốc là một hình thu nhỏ độ phân giải thấpGhi lại siêu dữ liệu DPI và đánh dấu là chất lượng thấpCác biểu đồ hoặc văn bản chính bị mờ và không thể đọc được; Bạn cần quét lại tệp nguồn

Lưu ý rằng "trình diễn mã" chỉ xác minh sự kết nối của các cuộc gọi API và luồng dữ liệu, và không đảm bảo hiệu suất đầu cuối. Khi gặp logic lồng OCG, shader tùy chỉnh hoặc tài liệu mã hóa, đầu ra script chỉ để tham khảo và phải được chấp nhận dựa trên kết xuất thực tế của trình đọc PDF.

🎯 Phương pháp nào phù hợp với bạn?

Nếu bạn cần giữ hiệu ứng trong suốt

Đầu tiên, kiểm tra xem SMask có tồn tại không, hợp nhất nó vào một kênh Alpha, rồi thực hiện xử lý tiếp theo.

Nếu bạn chỉ cần một phần hình ảnh trên trang

Đọc CTM và /BBox, cắt theo khu vực hiển thị, thay vì lưu trực tiếp hình ảnh gốc.

Nếu hình ảnh của bạn là bản quét hoặc nhúng trong hình ảnh độ phân giải thấp

Đầu tiên, ghi lại siêu dữ liệu DPI và đánh dấu chất lượng; nếu nội dung chính không rõ ràng, quay lại tệp nguồn để quét lại.

Nếu tài liệu chứa các lớp, mã hóa hoặc cắt phức tạp

Coi đầu ra script là kết quả sơ bộ, và cuối cùng sử dụng hiệu ứng rendering của trình đọc PDF làm tham chiếu cuối cùng.

❓ Câu hỏi thường gặp (FAQ)

1. Tại sao các vùng trong suốt của hình ảnh được trích xuất lại chuyển sang màu đen?

Một lý do phổ biến là thông tin trong suốt được lưu trữ trong SMask, chỉ trích xuất hình ảnh chính mà không hợp nhất mặt nạ.

2. Hình ảnh được trích xuất lớn hơn nhiều so với những gì bạn thấy trên trang. Chuyện gì đang xảy ra vậy?

Cùng một bản đồ cơ sở có thể được tái sử dụng trên nhiều trang, và mỗi trang chỉ hiển thị một phần qua /BBox và ma trận. Trích xuất trực tiếp sẽ cho ra toàn bộ bản đồ cơ sở.

3. Nếu mã hoạt động, có nghĩa là kết quả trích xuất có thể được sử dụng trực tiếp không?

Không. Trình diễn mã chỉ xác minh các cuộc gọi API và kết nối luồng dữ liệu, và cuối cùng yêu cầu kết quả hiển thị thực tế của người đọc chấp nhận.

4. Việc trích xuất thành công, nhưng hình ảnh không hiển thị trên trang. Lý do có thể là gì?

Hình ảnh có thể bị ẩn bởi Nhóm Nội dung Tùy chọn (OCG) hoặc đặt bên ngoài khu vực cắt, cho phép truy vấn trạng thái OCG và so sánh với CropBox.

📝 Tóm tắt

Đối tượng hình ảnh gốc và hiển thị trang trong PDF là hai thứ khác nhau, nên trước khi trích xuất chúng, bạn cần hiểu mối quan hệ giữa chúng. Xử lý SMask, ma trận và thông tin clipping cùng nhau, đồng thời xác minh chúng với kết quả render đảm bảo kết quả đáng tin cậy.

Trải nghiệm ngay: Tải lên tài liệu của bạn để bắt đầu dịch, giữ nguyên định dạng gốc

Cập nhật lúc 2026-11-13