Quick and dirty PDF reports for Plain Text Accounting
Say you want to hand out financial reports (such as a balance sheet and an income statement) to a non-techie someone. Most likely that means handing out the statements on paper. Given that I’m doing Plain Text Accounting, what is an easy way to generate decent looking output on paper?
hledger has two convenient commands to generate a balance sheet and an income statement. Let’s use the demo.journal from the hledger web site as an example for this:
$ hledger balancesheet -f demo.journal --empty --value
Balance Sheet 2017/12/31-2020/03/06
|| 2020/03/06
===================++===============
Assets ||
-------------------++---------------
Asset || 52,661.92 USD
Cash || 300.00 USD
Bank || 25,336.71 USD
JP Morgan || 22,651.48 USD
Weels Fargo || 2,275.23 USD
Wells Fargo || 410.00 USD
Online Account || 125.21 USD
Apple Pay || 41.97 USD
Paypal || 83.24 USD
Stocks || 26,900.00 USD
JP Morgan || 26,900.00 USD
-------------------++---------------
|| 52,661.92 USD
===================++===============
Liabilities ||
-------------------++---------------
Liabilities || 0
Credit Card || 0
Visa Platinum || 0
-------------------++---------------
|| 0
===================++===============
Net: || 52,661.92 USD
And similarly for the income statement
$ hledger incomestatement -f demo.journal
Income Statement 2017/12/31-2020/03/06
|| 2017/12/31-2020/03/06
================================++=======================
Revenues ||
--------------------------------++-----------------------
Revenue:Capital Gain in stocks || 300.00 USD
Revenue:Fx Revenue || 213.00 USD
Revenue:Riding App || 300.00 USD
Revenue:Salary || 21,600.00 USD
--------------------------------++-----------------------
|| 22,413.00 USD
================================++=======================
Expenses ||
--------------------------------++-----------------------
Expenses:Car:Gas || 78.37 USD
Expenses:Clothing || -1,944.00 USD
Expenses:Housing:Maintenance || -110.00 USD
Expenses:Housing:Property Tax || 300.00 USD
Expenses:Housing:Rental || 5,850.00 USD
Expenses:Leisure:Events || 275.00 USD
Expenses:Leisure:Travel || 2,678.00 USD
Expenses:Products:Clothing || 80.00 USD
Expenses:Products:Food || 1,148.33 USD
--------------------------------++-----------------------
|| 8,355.70 USD
================================++=======================
Net: || 14,057.30 USD
This is all fine and dandy, but how do I get this to print out nicely?
Export the report as CSV (using the -O csv
option) and then perform
some magic to convert this to LaTeX? People have apparently done this
using the pgfplotstable package.
Another method would be to generate HTML with the -O html
option,
style the result and hope that it prints out half decently.
Yet another quick hack involves pandoc to convert the tables to LaTeX:
$ hledger balancesheet -f demo.journal -O html | pandoc -f html -t latex
Unfortunately pandoc doesn’t seem to recognize the table in the html output and doesn’t convert them to LaTeX tables.
Instead I propose a simpler and admittedly dirtier method: Create an org-mode file that contains the auxiliary text around the reports. Then generate the reports using an org-mode source code block. The csv output is converted to an org-mode table which in the end will be exported to a neatly formatted LaTeX table.
#+BEGIN_SRC shell :exports results
hledger balancesheet -f demo.journal -O csv --empty --value
#+END_SRC
Make sure you use the booktabs
package for good looking LaTeX tables
and optionally the siunitx
package to align the numbers
nicely1.
Then use the org-mode export facilities to generate a LaTeX
file2. Enhance the result as you wish, for example you most
likely will add some horizontal lines using \toprule
, \midrule
and
\bottomrule
, possibly you will remove some superfluous lines from
the csv export, maybe you’ll change the names of some of the top-level
accounts to your locale and quite likely you’ll trim the empty
columns3.
I admit this approach is hackish and bites you if you do the conversion often. However if you consider that you’ll probably be doing the financial reports only once a year, IMHO this doesn’t justify the effort to pack this up into a script.
For more details have a look at the complete org-mode file, the generated LaTeX file and the drop dead gorgeous PDF output.
-
siunitx
comes with a new column type, theS
column. That lets you do things like\begin{tabular}{lS}
and have the numbers align on the decimal point. For me this worked great as long as no currencies were involved. As the output does contain currencies and I didn’t want to remove them I dropped the use ofsiunitx
. ↩︎ -
by typing
C-c C-e l l
(in case your muscle memory is failing you). ↩︎ -
The csv export has a small bug in that it creates a few empty columns that need to be cleaned. Thanks to Simon Michael the bug has been fixed in master. ↩︎