Visual Studio Code Printing
English version by Peter Wone
ENGLISH | FRENCH | Add a language
Markdown and source code, styled for print
- Print source code
- Print Markdown fully rendered
Source code gets line numbers and syntax colouring. Markdown is rendered with VS Code's preview rendering pipeline — many Markdown extensions work with printing.
Platform independent printing
Print-jobs are rendered as styled HTML and served from an embedded webserver. When you print, your local web browser is launched to load the print-job and give you printing options like page orientation and margin size. So if you have a local browser that can print, and VS Code can launch it, you're in business. Known user platforms include Windows, Linux and OSX.
Troubleshooting on first launch
VSCode Printing Free worked for thirty thousand people out of the box, but sometimes local settings and permissions can spoil the fun. Here are the problems we've seen so far. If something else is wrong, or you have an improvement idea, we invite you to log an issue on the GitHub repository.
Nothing seems to happen
If you try to print and nothing happens, restart VS Code. If it still doesn't work, your system may have a configuration or permission problem that won't let the browser launch. The default Firefox browser on Ubuntu gives trouble out of the box. Install Chromium (or Chrome, Edge, Brave...) and make it the default browser. If you don't want to make Chromium the default browser, read the manual for details of how to use a specific browser for printing and use Chromium to print.
Browser launches but no page loads
Your system settings are likely interfering with the embedded webserver. Aggressively locked-down network settings can do this. It's probably permissions. Whoever interfered with networking permissions should troubleshoot this.
Browser launches and shows an error message instead of a print-job
Examine the error message. Generally it's some sort of permission denied on aggressively locked down systems.
Classic user experience
The print icon on the toolbar prints the document in the active editor.
If you have a text selection that crosses at least one line-break you can right click and choose
Print from the context menu to send just the selection to the printer. In the absence of a multi-line selection the entire document is printed. You can control the position of
Print in this menu, or remove it altogether.
Or you can right-click on a file in the file explorer pane and choose Print from the context menu.
Printing on Mac, Linux and Windows
- Entirely local in operation, no dependence on cloud services
- Syntax colouring in a wide range of familiar colour schemes that you can import or modify
- Optional line numbering
- Adjustable line spacing (1, 1.5, 2)
- Print a selection of code with line numbers matching the editor
- Specify a browser other than your default
- Markdown documents are rendered when you print them (or not, there's a setting)
You'll need a web browser and access to a printer.
This extension is tested with Windows 10 with current builds of Chrome, Edge and Firefox.
I can't test on a Mac because I don't own one. Likewise I don't have any systems running Windows XP, 7 or 8.
If you use an untested combination then report bugs with test documents and snaps of failed outcomes.
VS Code Printing is highly configurable. Settings can be modified by going to Code > Preferences > Settings > Extensions > Printing.
A detailed breakdown of these settings can be found in the manual.
The browser used will affect your experience. Chrome is the recommended browser for printing.
- Firefox doesn't close the browser after printing
- Edge Classic doesn't support making printed tabs respect the editor tab size (because the experimental CSS
tab-size property is not supported)
- Microsoft Edge always prompts for permission to close the browser after printing
- Chrome remembers too much about printers, paper sizes and margins especially if you abort
Settings for contributed features are not yet localised.
Using some command line options with Chrome causes errors to be reported, even though printing succeeds.
On Windows you can't supply command-line options on the alternate browser path because we automatically put quotes around your path in case of spaces in file or folder names. (On other platforms auto-quoting is not done and you must manually escape spaces in file and folder names.) Work around this by creating a batch file in the same directory as the browser executable and use this to specify the options you require. For the browser path, supply the path to the batch file. Don't forget to pass through the URL parameter.
Some Chrome plugins interfere with print job styling. Don't use
--disable-plugins because if there is already a running instance of Chrome, this switch doesn't work. Instead use
chrome --incognito %1
firefox -private-window %1
msedge -inprivate %1
KaTeX requires an internet connection. You must also configure a stylesheet reference. Details are in the manual.
- Adjust tag line to ensure that Markdown is mentioned when it is clipped.
- Capitalise all references to Markdown in readme file.
- Remove automatic quoting of alternate browser path due to incompatibility with Linux.
- Add German localisation
- Fix missing assets due to broken update in Microsoft's extension packaging and publishing tool (reversion to an earlier version resolved the missing assets)
- Change marketplace tag line.
- Security updates
- Work-around new bug in nodejs. The error handler is now always invoked when the browser is launched, and it is necessary to check whether the error object is null. This has caused spurious errors to be reported even though printing succeeds.
- Update readme to promote the (apparently rare) ability to print rendered Markdown. Thanks to Andy Barratt for suggesting this in his review.
- Update assets to compensate changes in Visual Studio Code 1.56
- PR101 display error message when browser launch fails, fix thanks to baincd
- PR97 rendered Markdown path fixes, fix thanks to baincd
- PR96 correct extensionKind UI setting in package.json, fix thanks to baincd
- PR94 update README to clarify browser differences and recommendation, fix thanks to baincd
- PR92 implements webserver timeout, thanks to baincd
- Further updates for language support
- Issue 88 Trying to print a new file that does not exist in the filesystem would cause an error message, a regression caused by internal changes in support of folder printing, fix thanks to baincd
- Issue 87 Blank lines don't print correctly, fix thanks to baincd
- Fix missing documentation and language translation issues
- Various dependencies updated to mitigate security risks.
- Syntax colouring fix for multi-line strings and comments, thanks to gji closes #85 and #63
- Changed default stylesheet from vs2015 (a dark theme) to Atelier Dune.
- Added support for printing entire folders thanks to alainx277.
highlight.js to latest version on advice from the keepers of
- Removed potential vulnerabilities to HTML documents containing toxic script
- Addresses minor colourisation issues (see #63)
- Removed port acquisition announcement setting as ports are no longer under user control.
- Corrected issue 68, an exception occurring when printing an editor buffer that does not have a corresponding file on disk, by typing the command.
- Because the host operating system now chooses the port for the embedded webserver, the webserver is created on first use and retained until the extension deactivates, so that the port allocation does not change. Code to decommissione the webserver after processing a request was not removed in 0.8.0 and is removed in 0.8.1 removing the risk of an unexpected change of port.
- Various issues describing high CPU use at extension startup are resolved by use of Webpack.
- Port selection for the embedded webserver is now fully delegated to the host operating system. As a result the port range settings are no longer necessary and have been removed.
- No longer dependent on the portfinder package.
- Issue 64 - local images were broken because Microsoft changed VS Code. Markdown rendering no longer rewrites resource references to prefixed filepaths, they are now passed through unchanged. The extension now handles mapping to the filesystem.
- Issue 51 - add configuration in support of WSL, courtesy of sburlap
- Issue 54 - respect editor font when printing code
- Issue 48 - fix MD image path glitch.
- Update dependencies to address known vulnerabilities.
- Issue 40 - prevent double file extension producing an unhandled exception in the page generator stalling the embedded webserver resulting in an empty white browser window for a page load that does not complete.
- Issue 41 - handle unexpected exceptions in the page generator by delivering the error stack as the page content, thereby vastly improving diagnostic information in issues.
- Issue 39 - correction to inappropriately scoped regular expression causing colons to be escaped in the entire document when they should be escaped only in URLs.
- Issue 36 - corrected a problem with the internal rendering pipeline rewriting URLs to use a vscode internal protocol. This caused image references to work in the preview but fail in the browser.
- Issue 35 - stylesheet cache path incorrectly constructed on non-Windows file systems. This has now been corrected.
- Issue 33 - the editor tab-size setting was incorrectly retrieved and therefore not respected. This has now been corrected.
- Issue 34 - printing was failing for direct invocation (press
F1 then type Printing: Print finally press
Enter). This has now been corrected.
- Localised to French.
- The Russian "localisation" is a stub (still in English) pending translations.
- Menu and icon availability now determined from editorLangId rather than resourceLangId. This should allow printing of unsaved documents and unrecognised file types per issues 31 and 32.
Now using VS Code's Markdown rendering pipeline.
- faster load
- smaller memory footprint
- Markdown extensions like Markdown+Math take effect when printing
- Bump minor version as 0.6.13 introduced new settings changing the UX
- Fix support for extended character sets and mixed languages in printed source code (#29) with thanks to Ekgart Vikentiy for reporting this.
Stub release because there's no other way to patch the readme.
- Settings to allow the user to move the range in which the embedded webserver chooses ports
- Moved default port range into the correct range for dynamic ports (was library default)
- Separate manual thanks to Nat Kuhn
- UTF-8 for extended charsets.
- Support images on local paths.
ac WEB DESIGN reported both these issues and provided test content.
- Control whether the embedded web server announces which port it acquires (off by default).
- Render Markdown with the same engine VS Code uses for preview.
Report acquired port to user with toast.
- Context menu position is now a setting.
- New store graphics.
Fixes command categories so they appear as
- Print: Browse for stylesheet
- Print: Print
The commands are present and functional in 0.6.1 but are not correctly categorised.
Colour scheme stylesheets are no longer selected from a combo-box. Instead there is a new command
Print: Browse for stylesheet that spawns a file-browse dialog and updates the setting. If you choose a file outside the stylesheet cache it is copied into the cache so you don't become dependent on network-local resources.
Earlier versions occasionally had problems with port collisions causing printing to fail. A manual retry or three always fixed it but this was ugly. Correcting the problem was the primary focus of 0.5.3, and I am pleased to finally remove it from known issues.
Also addressed is [issue #17](https://github.com/PeterWone/vsc-print/issues/17) which moves responsibility for language detection from highlightjs (the library used for syntax colouring) to VS Code, falling back to highlightjs when an incompatible language code is produced.
Microsoft Edge always prompts for permission to close the browser after printing, which can be annoying.
Firefox doesn't prompt, it just plain doesn't close the browser, which is beyond annoying. As a result, Chrome is the recommended browser for printing.
Apply categories to commands.
- Colour scheme stylesheet setting is no longer presented as a combo-box. Instead, there is a command that presents a file-browse dialog and updates the setting.
- Language detection falls back to highlightjs when VS Code produces an incompatible language identifier.
- Tab size respects editor setting.
- Responsibility for language detection moved from highlightjs to VS Code.