// -*- mode: c++; tab-width: 4; indent-tabs-mode: t; eval: (progn (c-set-style "stroustrup") (c-set-offset 'innamespace 0)); -*- // vi:set ts=4 sts=4 sw=4 noet : // // Copyright 2010, 2011 wkhtmltopdf authors // // This file is part of wkhtmltopdf. // // wkhtmltopdf is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // wkhtmltopdf is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with wkhtmltopdf. If not, see . #include "outputter.hh" #include "pdfcommandlineparser.hh" #include #define STRINGIZE_(x) #x #define STRINGIZE(x) STRINGIZE_(x) /*! Output name and a short description \param o The outputter to output to */ void PdfCommandLineParser::outputManName(Outputter * o) const { o->beginSection("Name"); o->paragraph("wkhtmltopdf - html to pdf converter"); o->endSection(); } /*! Output a short synopsis on how to call the command line program \param o The outputter to output to */ void PdfCommandLineParser::outputSynopsis(Outputter * o) const { o->beginSection("Synopsis"); o->verbatim("wkhtmltopdf [GLOBAL OPTION]... [OBJECT]... \n"); o->endSection(); o->beginSection("Document objects"); o->beginParagraph(); o->text("wkhtmltopdf is able to put several objects into the output file, an object is either " "a single webpage, a cover webpage or a table of content. The objects are put into " "the output document in the order they are specified on the command line, options can " "be specified on a per object basis or in the global options area. Options from the "); o->sectionLink("Global Options"); o->text(" section can only be placed in the global options area"); o->endParagraph(); o->paragraph("A page objects puts the content of a singe webpage into the output document."); o->verbatim("(page)? [PAGE OPTION]..."); o->beginParagraph(); o->text("Options for the page object can be placed in the global options and the page " "options areas. The applicable options can be found in the "); o->sectionLink("Page Options"); o->text(" and "); o->sectionLink("Headers And Footer Options"); o->text(" sections."); o->endParagraph(); o->paragraph("A cover objects puts the content of a singe webpage into the output document, " "the page does not appear in the table of content, and does not have headers and footers."); o->verbatim("cover [PAGE OPTION]..."); o->paragraph("All options that can be specified for a page object can also be specified for a cover."); o->paragraph("A table of content object inserts a table of content into the output document."); o->verbatim("toc [TOC OPTION]..."); o->beginParagraph(); o->text("All options that can be specified for a page object can also be specified for a toc, " "further more the options from the "); o->sectionLink("TOC Options"); o->text(" section can also be applied. The table of content is generated via XSLT which means " "that it can be styled to look however you want it to look. To get an aide of how to " "do this you can dump the default xslt document by supplying the --dump-default-toc-xsl, and the outline it works on by supplying --dump-outline, see the "); o->sectionLink("Outline Options"); o->text(" section."); o->endParagraph(); o->endSection(); } /*! Explain what the program does \param o The outputter to output to */ void PdfCommandLineParser::outputDescripton(Outputter * o) const { o->beginSection("Description"); o->beginParagraph(); o->text("Converts one or more HTML pages into a PDF document, "); #ifdef __EXTENSIVE_WKHTMLTOPDF_QT_HACK__ o->text("using wkhtmltopdf patched qt."); #else o->bold("not"); o->text(" using wkhtmltopdf patched qt."); #endif o->endParagraph(); o->endSection(); } /*! Add explanation about reduced functionality without patched qt/webkit \param o The outputter to output to \param sure Is the functionality restricted in this wkhtmltopdf */ void PdfCommandLineParser::outputNotPatched(Outputter * o, bool sure) const { o->beginSection("Reduced Functionality"); if (sure) o->paragraph("This version of wkhtmltopdf has been compiled against a version of " "QT without the wkhtmltopdf patches. Therefore some features are missing, " "if you need these features please use the static version."); else o->paragraph("Some versions of wkhtmltopdf are compiled against a version of QT " "without the wkhtmltopdf patches. These versions are missing some features, " "you can find out if your version of wkhtmltopdf is one of these by running wkhtmltopdf --version " "if your version is against an unpatched QT, you can use the static version to get all functionality."); o->paragraph("Currently the list of features only supported with patch QT includes:"); o->beginList(); o->listItem("Printing more than one HTML document into a PDF file."); o->listItem("Running without an X11 server."); o->listItem("Adding a document outline to the PDF file."); o->listItem("Adding headers and footers to the PDF file."); o->listItem("Generating a table of contents."); o->listItem("Adding links in the generated PDF file."); o->listItem("Printing using the screen media-type."); o->listItem("Disabling the smart shrink feature of webkit."); o->endList(); o->endSection(); } /*! Explain the page breaking is somewhat broken \param o The outputter to output to */ void PdfCommandLineParser::outputPageBreakDoc(Outputter * o) const { o->beginSection("Page Breaking"); o->paragraph( "The current page breaking algorithm of WebKit leaves much to be desired. " "Basically Webkit will render everything into one long page, and then cut it up " "into pages. This means that if you have two columns of text where one is " "vertically shifted by half a line. Then Webkit will cut a line into to pieces " "display the top half on one page. And the bottom half on another page. " "It will also break image in two and so on. If you are using the patched version of " "QT you can use the CSS page-break-inside property to remedy this somewhat. " "There is no easy solution to this problem, until this is solved try organizing " "your HTML documents such that it contains many lines on which pages can be cut " "cleanly."); o->endSection(); } /*! Output documentation about headers and footers \param o The outputter to output to */ void PdfCommandLineParser::outputHeaderFooterDoc(Outputter * o) const { o->beginSection("Footers And Headers"); o->paragraph("Headers and footers can be added to the document by the --header-* and --footer* " "arguments respectfully. In header and footer text string supplied to e.g. --header-left, " "the following variables will be substituted."); o->verbatim( " * [page] Replaced by the number of the pages currently being printed\n" " * [frompage] Replaced by the number of the first page to be printed\n" " * [topage] Replaced by the number of the last page to be printed\n" " * [webpage] Replaced by the URL of the page being printed\n" " * [section] Replaced by the name of the current section\n" " * [subsection] Replaced by the name of the current subsection\n" " * [date] Replaced by the current date in system local format\n" " * [isodate] Replaced by the current date in ISO 8601 extended format\n" " * [time] Replaced by the current time in system local format\n" " * [title] Replaced by the title of the of the current page object\n" " * [doctitle] Replaced by the title of the output document\n" " * [sitepage] Replaced by the number of the page in the current site being converted\n" " * [sitepages] Replaced by the number of pages in the current site being converted\n" "\n"); o->paragraph("As an example specifying --header-right \"Page [page] of [toPage]\", " "will result in the text \"Page x of y\" where x is the number of the " "current page and y is the number of the last page, to appear in the upper " "left corner in the document."); o->paragraph("Headers and footers can also be supplied with HTML documents. As an example one " "could specify --header-html header.html, and use the following content in header.html:"); o->verbatim( "\n" "\n" " \n" " \n" " \n" " \n" "
\n" " Page of \n" "
\n" "\n" "\n" ); o->paragraph("As can be seen from the example, the arguments are sent to the header/footer " "html documents in get fashion."); o->endSection(); } void PdfCommandLineParser::outputTableOfContentDoc(Outputter * o) const { o->beginSection("Table Of Content"); o->paragraph("A table of content can be added to the document by adding a toc object " "to the command line. For example:"); o->verbatim("wkhtmltopdf toc http://qt-project.org/doc/qt-4.8/qstring.html qstring.pdf\n"); o->paragraph("The table of content is generated based on the H tags in the input " "documents. First a XML document is generated, then it is converted to " "HTML using XSLT."); o->paragraph("The generated XML document can be viewed by dumping it to a file using " "the --dump-outline switch. For example:"); o->verbatim("wkhtmltopdf --dump-outline toc.xml http://qt-project.org/doc/qt-4.8/qstring.html qstring.pdf\n"); o->paragraph("The XSLT document can be specified using the --xsl-style-sheet switch. " "For example:"); o->verbatim("wkhtmltopdf toc --xsl-style-sheet my.xsl http://qt-project.org/doc/qt-4.8/qstring.html qstring.pdf\n"); o->paragraph("The --dump-default-toc-xsl switch can be used to dump the default " "XSLT style sheet to stdout. This is a good start for writing your " "own style sheet"); o->verbatim("wkhtmltopdf --dump-default-toc-xsl"); o->paragraph("The XML document is in the namespace " "\"http://wkhtmltopdf.org/outline\" " "it has a root node called \"outline\" which contains a number of " "\"item\" nodes. An item can contain any number of item. These are the " "outline subsections to the section the item represents. A item node " "has the following attributes:"); o->beginList(); o->listItem("\"title\" the name of the section."); o->listItem("\"page\" the page number the section occurs on."); o->listItem("\"link\" a URL that links to the section."); o->listItem("\"backLink\" the name of the anchor the the section will link back to."); o->endList(); o->paragraph("The remaining TOC options only affect the default style sheet " "so they will not work when specifying a custom style sheet."); o->endSection(); } /*! Output documentation about outlines \param o The outputter to output to */ void PdfCommandLineParser::outputOutlineDoc(Outputter * o) const { o->beginSection("Outlines"); o->beginParagraph(); o->text( "Wkhtmltopdf with patched qt has support for PDF outlines also known as " "book marks, this can be enabled by specifying the --outline switch. " "The outlines are generated based on the tags, for a in-depth " "description of how this is done see the "); o->sectionLink("Table Of Content"); o->text(" section. "); o->endParagraph(); o->paragraph( "The outline tree can sometimes be very deep, if the tags where " "spread to generous in the HTML document. The --outline-depth switch can " "be used to bound this."); o->endSection(); } /*! Output contact information \param o The outputter to output to */ void PdfCommandLineParser::outputContact(Outputter * o) const { o->beginSection("Contact"); o->beginParagraph(); o->text("If you experience bugs or want to request new features please visit "); o->link("https://github.com/wkhtmltopdf/wkhtmltopdf/issues"); o->endParagraph(); o->endSection(); } /*! Output beginning of the readme \param o The outputter to output to */ void PdfCommandLineParser::outputDocStart(Outputter * o) const { o->beginSection("wkhtmltopdf " STRINGIZE(FULL_VERSION) " Manual"); o->paragraph("This file documents wkhtmltopdf, a program capable of converting html " "documents into PDF documents."); o->endSection(); } /*! Output information on how to use read-args-from-stdin \param o The outputter to output to */ void PdfCommandLineParser::outputArgsFromStdin(Outputter * o) const { o->beginSection("Reading arguments from stdin"); o->paragraph("If you need to convert a lot of pages in a batch, and you feel that wkhtmltopdf " "is a bit to slow to start up, then you should try --read-args-from-stdin,"); o->paragraph("When --read-args-from-stdin each line of input sent to wkhtmltopdf on stdin " "will act as a separate invocation of wkhtmltopdf, with the arguments specified " "on the given line combined with the arguments given to wkhtmltopdf"); o->paragraph("For example one could do the following:"); o->verbatim("echo \"http://qt-project.org/doc/qt-4.8/qapplication.html qapplication.pdf\" >> cmds\n" "echo \"cover google.com http://en.wikipedia.org/wiki/Qt_(software) qt.pdf\" >> cmds\n" "wkhtmltopdf --read-args-from-stdin --book < cmds\n"); o->endSection(); } /*! Output information on how to install \param o The outputter to output to */ void PdfCommandLineParser::outputInstallation(Outputter * o) const { o->beginSection("Installation"); o->paragraph( "There are several ways to install wkhtmltopdf. You can download a " "already compiled binary, or you can compile wkhtmltopdf yourself. " "On windows the easiest way to install wkhtmltopdf is to download " "the latest installer. On Linux you can download the latest static " "binary, however you still need to install some other pieces of " "software, to learn more about this read the static version section " "of the manual."); o->endSection(); } /*! Output documentation about page sizes \param o The outputter to output to */ void PdfCommandLineParser::outputPageSizes(Outputter * o) const { o->beginSection("Page sizes"); o->beginParagraph(); o->text("The default page size of the rendered document is A4, but using this --page-size option" "this can be changed to almost anything else, such as: A3, Letter and Legal. " "For a full list of supported pages sizes please see "); o->link("http://qt-project.org/doc/qt-4.8/qprinter.html#PaperSize-enum"); o->text("."); o->endParagraph(); o->paragraph("For a more fine grained control over the page size the " "--page-height and --page-width options may be used"); o->endSection(); } /*! Output examples on how to use wkhtmltopdf \param o The outputter to output to */ void PdfCommandLineParser::outputExamples(Outputter * o) const { o->beginSection("Examples"); o->paragraph("This section presents a number of examples of how to invoke wkhtmltopdf."); o->paragraph("To convert a remote HTML file to PDF:"); o->verbatim("wkhtmltopdf http://www.google.com google.pdf\n"); o->paragraph("To convert a local HTML file to PDF:"); o->verbatim("wkhtmltopdf my.html my.pdf\n"); o->paragraph("Produce the eler2.pdf sample file:"); o->verbatim("wkhtmltopdf -H http://geekz.co.uk/lovesraymond/archive/eler-highlights-2008 eler2.pdf\n"); o->paragraph("Printing a book with a table of content:"); o->verbatim("wkhtmltopdf -H cover cover.html toc chapter1.html chapter2.html chapter3.html book.pdf\n"); o->endSection(); } // LocalWords: webkit bool unpatched beginList listItem endList WebKit http // LocalWords: stroustrup wkhtmltopdf commandlineparser hh QWebFrame param px // LocalWords: STRINGIZE outputter const beginSection beginParagraph QString // LocalWords: ifdef endif endParagraph endSection GPLv GPL Truelsen Mário td // LocalWords: Bouthenot PDF CSS username BNF frompage topage webpage toPage // LocalWords: html subst unescape subsubsection getElementsByClassName args // LocalWords: textContent onload readme stdin qapplication pdf cmds google // LocalWords: todo gcc openssl sudo dep libqt gui xorg wget xvf svn linux ps // LocalWords: PageSize enum eler glibc xserver xfonts libssl dev wkhtml cd // LocalWords: nomake opensource xslt