برنامه نویسی

با استفاده از Chromedriver برای ایجاد PDF با یاقوت

تولید PDF از HTML یک چالش رایج در توسعه وب است ، به خصوص هنگام حفظ طرح بندی دقیق و یک ظاهر طراحی شده. چه فاکتورها ، گزارش ها یا اسناد تولید شده پویا باشد ، توسعه دهندگان به ابزارهای قابل اعتماد برای تبدیل دقیق HTML به PDF نیاز دارند. ابزارهای زیادی برای حل آن وجود دارد. به تازگی ، من در HTML2PDF_CHROME کار کردم ، یک گوهر یاقوت که Chromedriver را برای تولید PDF می پوشاند ، و من در این روند چیزهای زیادی آموختم.

کتابخانه های زیادی برای تولید PDF از HTML وجود دارد ، از جمله Wkhtmltopdf و Puppeteer. با این حال ، قابلیت های چاپ داخلی Chrome اغلب نتایج دقیق تری به دست می آورند ، به خصوص برای طرح های وب مدرن که به CSS Grid ، Flexbox و فونت های وب متکی هستند. Chromedriver دسترسی برنامه ای به این قابلیت را فراهم می کند و به ما امکان می دهد تا تولید PDF را اسکریپت کنیم.

بدیهی است که استفاده از Chromedriver به معنای نصب Chromedriver است. می توان آن را با اکثر مدیران بسته بندی (به عنوان مثال Homebrew) نصب کرد:

brew install chromedriver
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

برای مدیریت رابط با Chromedriver از سلنیوم استفاده کردم. در اینجا یک مثال ساده از استفاده از سلنیوم برای تولید PDF از HTML آورده شده است:

require 'base64'
require 'selenium-webdriver'

# Create an options object for starting Chromedriver
options = Selenium::WebDriver::Chrome::Options.new
options.add_argument('--headless=new')
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')
options.add_argument('--disable-software-rasterizer')

# Create a Chromedriver instance
driver = Selenium::WebDriver.for(:chrome, options: options)

# Create a data URL for the html string
html_string = ""
encoded_html = Base64.strict_encode64(html)
data_url = "data:text/html;base64,#{encoded_html}"

# Visit the data URL and get the rendered PDF
driver.navigate.to(data_url)
cdp_response = driver.execute_cdp('Page.printToPDF')
pdf_data = Base64.decode64(cdp_response['data'])

# Save the PDF!
File.write("output.pdf", pdf_data)
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

ایجاد درایور با سلنیوم یک فرآیند Chromedriver را شروع می کند ، که می تواند با منابع پررنگ باشد و برای اولیه سازی زمان لازم است. این می تواند کند و گران باشد. برای ما بهتر خواهد بود که یک بار یک نمونه درایور واحد ایجاد کنیم و سپس چندین بار دوباره از آن استفاده کنیم.

در یک محیط چند رشته ای ، چندین موضوع ممکن است سعی در تولید همزمان PDF داشته باشند. برای جلوگیری از تداخل ، باید دسترسی به راننده را کنترل کنیم. من این کار را در گوهر html2pdf_chrome انجام دادم. نمونه ای مختصر از آنچه به نظر می رسد در زیر آمده است:

# Create a function for creating a driver.
def initialize_driver
  options = Selenium::WebDriver::Chrome::Options.new
  options.add_argument('--headless=new')
  options.add_argument('--disable-gpu')
  options.add_argument('--no-sandbox')
  options.add_argument('--disable-software-rasterizer')

  Selenium::WebDriver.for(:chrome, options: options)
end

# Create a function for fetching a singleton driver with a Mutex
def fetch_driver
  @driver ||= initialize_driver
  @semaphore ||= Mutex.new
  @semaphore.synchronize do
    yield @driver
  end
  nil
end

# Encode the HTML like before
encoded_html = Base64.strict_encode64(html)
data_url = "data:text/html;base64,#{encoded_html}"

# Get the driver and use it to generate the PDF
pdf_data = nil
fetch_driver do |driver|
  driver.navigate.to(data_url)
  cdp_response = driver.execute_cdp('Page.printToPDF')
  pdf_data = Base64.decode64(cdp_response['data'])
end

# Save the PDF!
File.write("output.pdf", pdf_data)
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

استفاده از Chromedriver با سلنیوم برای تولید PDF از HTML به خوبی کار می کند و به نظر می رسد شگفت آور آسان است. سخت ترین قسمت نصب Chromedriver است. اگر می خواهید این کار را در تولید انجام دهید ، حتماً دسترسی به راننده را کنترل کنید تا تولید همزمان PDF در محیط های چند رشته ای را فعال کنید. شما همچنین می توانید از گوهایی که نوشتم استفاده کنید که همه این کارها را برای شما انجام می دهد

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا