Я использую
PHP PhantomJs. Он не идеален, но для моих потребностей подходит. Ну и конечно сервер на котором это будет работать должен уметь запускать бинарные PHP скрипты.
<?php
//define('STDOUT', fopen('debug_log.txt', 'wb')); //write console logs to file
use JonnyW\PhantomJs\Client;
$url = 'https://toster.ru';
$client = Client::getInstance();
//$client->getEngine()->debug(true); //enable debug
$request = $client->getMessageFactory()->createCaptureRequest($url);
$response = $client->getMessageFactory()->createResponse();
$request->setOutputFile( 'preview.png' );
$request->setViewportSize(500, 1500); //width, height
//$request->setCaptureDimensions(500, 645, 0, 0); //width, height, top, left
$request->setFormat('png');
$request->setQuality(100);
$request->setTimeout(5000); // will render page if this timeout is reached and resources haven't finished loading
$client->send($request, $response);
$image = imagecreatefrompng( 'preview.png' );
$image = imagecropauto( $image, IMG_CROP_WHITE );
imagepng( $image, 'croped_preview.png' );
imagedestroy( $image );
Но если вам необходимо собрать DOM более качественно, придерживаясь самых современных стандартов, то изучайте
Selenium. Например на Питоне он очень прост в использовании:
from selenium import webdriver
driver = webdriver.Chrome('/usr/local/bin/chromedriver')
driver.set_window_position(0, 0)
driver.set_window_size(500, 1500)
driver.get('https://toster.ru')
screenshot = driver.save_screenshot('/users/Pavel/Desktop/preview.png')