Hình ảnh wkhtmltopdf không được hiển thị

Đang tải trang (1/6) [> ] 0% [======> ] 10% [======> ] 10% [============> ]

Vấn đề của chúng tôi là url hình ảnh mà chúng tôi gửi vào đây đến từ một nhóm AWS s3 được bảo vệ, ngoài ra nó có chữ ký phía trước trên đám mây gây ra đủ loại sự cố cho chúng tôi. WkHTMLtoPDF không thể hiển thị hình ảnh khi đang phân tích cú pháp html

Chúng tôi đã giải quyết nó như thế nào

application.rb

require 'rails/all'
require 'base64'

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

def download_image(url)
    return 'data:image/png;base64,' + Base64.encode64(open(url) { |io| io.read })
end

def generate_html_template(image_url)

    "
    
        
        
        
        .. some html template
        
        
    
    "
end

# credit: https://stackoverflow.com/questions/1547008/how-to-encode-media-in-base64-given-url-in-ruby
0

def download_image(url)
    return 'data:image/png;base64,' + Base64.encode64(open(url) { |io| io.read })
end

def generate_html_template(image_url)

    "
    
        
        
        
        .. some html template
        
        
    
    "
end

# credit: https://stackoverflow.com/questions/1547008/how-to-encode-media-in-base64-given-url-in-ruby

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

Trong cùng một dòng, chúng tôi sử dụng

def download_image(url)
    return 'data:image/png;base64,' + Base64.encode64(open(url) { |io| io.read })
end

def generate_html_template(image_url)

    "
    
        
        
        
        .. some html template
        
        
    
    "
end

# credit: https://stackoverflow.com/questions/1547008/how-to-encode-media-in-base64-given-url-in-ruby
1 để đọc tệp trên tệp đường ray của chúng tôi và sau đó chúng tôi chuyển đổi bằng cách sử dụng mô-đun Base64

Sau đó, chúng tôi chỉ cần đưa nó trở lại mẫu, theo cách này, WKHTMLtoPDF không phải mở tệp từ nguồn, nó chỉ đọc nó dưới dạng chuỗi Base64

Sau đó, chúng tôi phát hiện ra rằng chúng tôi cũng cần gói wkhtmltopdf với các bản vá qt để có thể thêm đầu trang và chân trang vào tất cả các trang

apt update
apt install xfonts-75dpi xfonts-base gvfs colord glew-utils libvisual-0.4-plugins gstreamer1.0-tools opus-tools qt5-image-formats-plugins qtwayland5 qt5-qmltooling-plugins librsvg2-bin lm-sensors
wget https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.5/wkhtmltox_0.12.5-1.buster_amd64.deb
dpkg -i wkhtmltox_0.12.5-1.buster_amd64.deb
cp /usr/local/bin/wkhtmltopdf /usr/bin/
cp /usr/local/bin/wkhtmltoimage /usr/bin/

Bạn có thể kiểm tra xem các bản vá qt đã được cài đặt hay chưa bằng cách sử dụng

def download_image(url)
    return 'data:image/png;base64,' + Base64.encode64(open(url) { |io| io.read })
end

def generate_html_template(image_url)

    "
    
        
        
        
        .. some html template
        
        
    
    "
end

# credit: https://stackoverflow.com/questions/1547008/how-to-encode-media-in-base64-given-url-in-ruby
2
Đầu ra sẽ giống như thế này.
def download_image(url)
    return 'data:image/png;base64,' + Base64.encode64(open(url) { |io| io.read })
end

def generate_html_template(image_url)

    "
    
        
        
        
        .. some html template
        
        
    
    "
end

# credit: https://stackoverflow.com/questions/1547008/how-to-encode-media-in-base64-given-url-in-ruby
3

Có thể chúng tôi đã cài đặt nhiều hơn mức cần thiết với phương pháp này.
Mọi lời khuyên để xử lý vấn đề này tốt hơn đều được đánh giá cao. Chúng tôi vẫn còn khá mới với linux.

nguồn

tôi cũng gặp vấn đề tương tự, tôi đã cài đặt wkhtmltopdf trong env của mình bằng cách sử dụng

sudo apt-get install wkhtmltopdf 

nếu điều này không hoạt động, hãy cài đặt lại wkhtmltopdf sau đó kiểm tra cài đặt của bạn. py

MEDIA_ROOT = 'blog4/media'

thay đổi dòng này để này

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

điều này có thể làm việc

Bạn có thể chỉ định tất cả các tùy chọn wkhtmltopdf. Bạn có thể bỏ '–' trong tên tùy chọn. Nếu tùy chọn không có giá trị, hãy sử dụng Không có, Sai hoặc ‘’ cho giá trị chính tả. Đối với các tùy chọn có thể lặp lại (bao gồm. allow, cookie, custom-header, post, postfile, run-script, replace), bạn có thể sử dụng danh sách hoặc bộ dữ liệu. Với tùy chọn cần nhiều giá trị (e. g. –custom-header Authorization secret), chúng ta có thể sử dụng 2-tuple (xem ví dụ bên dưới)

options = {
    'page-size': 'Letter',
    'margin-top': '0.75in',
    'margin-right': '0.75in',
    'margin-bottom': '0.75in',
    'margin-left': '0.75in',
    'encoding': "UTF-8",
    'custom-header': [
        ('Accept-Encoding', 'gzip')
    ],
    'cookie': [
        ('cookie-empty-value', '""')
        ('cookie-name1', 'cookie-value1'),
        ('cookie-name2', 'cookie-value2'),
    ],
    'no-outline': None
}

pdfkit.from_url('http://google.com', 'out.pdf', options=options)

Theo mặc định, PDFKit sẽ chạy wkhtmltopdf với tùy chọn im lặng được bật, vì trong hầu hết các trường hợp, đầu ra là không cần thiết và có thể gây sử dụng bộ nhớ quá mức và kết quả bị hỏng. Nếu cần nhận đầu ra wkhtmltopdf, bạn nên chuyển verbose=True cho lệnh gọi API

pdfkit.from_url('google.com', 'out.pdf', verbose=True)

Do cú pháp lệnh wkhtmltopdf, các tùy chọn TOC và Cover phải được chỉ định riêng. Nếu bạn cần cover trước TOC, hãy sử dụng tùy chọn cover_first

________số 8

Bạn có thể chỉ định các tệp CSS bên ngoài khi chuyển đổi tệp hoặc chuỗi bằng tùy chọn css

Cảnh báo Đây là một cách giải quyết cho lỗi này trong wkhtmltopdf. Bạn nên thử tùy chọn –user-style-sheet trước