Here's a small Python script using the old PyPdf library that does the job neatly. Save it in a script called un2up
(or whatever you like), make it executable (chmod +x un2up
), and run it as a filter (un2up <2up.pdf >1up.pdf
).
#!/usr/bin/env python
import copy, sys
from pyPdf import PdfFileWriter, PdfFileReader
input = PdfFileReader(sys.stdin)
output = PdfFileWriter()
for p in [input.getPage(i) for i in range(0,input.getNumPages())]:
q = copy.copy(p)
(w, h) = p.mediaBox.upperRight
p.mediaBox.upperRight = (w/2, h)
q.mediaBox.upperLeft = (w/2, h)
output.addPage(p)
output.addPage(q)
output.write(sys.stdout)
Ignore any deprecation warnings; only the PyPdf maintainers need be concerned with those.
If the input is oriented in an unusual way, you may need to use different coordinates when truncating the pages. See Why my code not correctly split every page in a scanned pdf?
Just in case it's useful, here's my earlier answer which uses a combination of two tools plus some manual intervention:
- Pdfjam (at least version 2.0), based on the pdfpages LaTeX package, to crop the pages;
- Pdftk, to put the left and right halves back together.
Both tools are needed because as far as I can tell pdfpages isn't able to apply two different transformations to the same page in one stream. In the call to pdftk
, replace 42 by the number of pages in the input document (2up.pdf
).
pdfjam -o odd.pdf --trim '0cm 0cm 14.85cm 0cm' --scale 1.141 2up.pdf
pdfjam -o even.pdf --trim '14.85cm 0cm 0cm 0cm' --scale 1.141 2up.pdf
pdftk O=odd.pdf E=even.pdf cat $(i=1; while [ $i -le 42 ]; do echo O$i E$i; i=$(($i+1)); done) output all.pdf
In case you don't have pdfjam 2.0, it's enough to have a PDFLaTeX installation with the pdfpages package (on Ubuntu: you need texlive-latex-recommended and perhaps (on Ubuntu: texlive-fonts-recommended ), and use the following driver file driver.tex
:
\batchmode
\documentclass{minimal}
\usepackage{pdfpages}
\begin{document}
\includepdfmerge[trim=0cm 0cm 14.85cm 0cm,scale=1.141]{2up.pdf,-}
\includepdfmerge[trim=14.85cm 0cm 0cm 0cm,scale=1.141]{2up.pdf,-}
\end{document}
Then run the following commands, replacing 42 by the number of pages in the input file (which must be called 2up.pdf
):
pdflatex driver
pdftk driver.pdf cat $(i=1; pages=42; while [ $i -le $pages ]; do echo $i $(($pages+$i)); i=$(($i+1)); done) output 1up.pdf
I need to create a script or reuse a script that converts PDF to PS
(Post Script) files
There are tools but there are also pros and cons for each tool.
pdf2ps is my go to tool since my needs are pretty low. It is a simple one line command.
pdf2ps [options] input.pdf [output.ps]
if you don't give a output.ps it will keep the input file name and just change the extension from pdf to ps.
pdf2ps will convert the files and the file maybe larger and will take longer then pdftops. pdf2ps converts the fonts to bitmap fonts.
Poppler's pdftops is the successor to Xpdf (poppler-utils in Ubuntu). It runs fast, represents the fonts better and has a ton of neat tools.
pdftops[options] input.pdf [output.ps]
poppler-utils is a collection of tools builds on poppler library API, to manage PDF and extract contents.
pdfdetach extract embedded documents from a PDF
pdffonts lists the fonts used in a PDF
pdfimages extract all embedded images at native resolution from a PDF
pdfinfo list all infos of a PDF
pdfseparate extract single pages from a PDF
pdftocairo convert single pages from a PDF to vector or bitmap formats using cairo
pdftohtml convert PDF to HTML format retaining formatting
pdftoppm convert a PDF page to a bitmap
pdftops convert PDF to printable PS format
pdftotext extract all text from PDF
pdfunite merges several PDF
I use wget instead of curl not because wget is better, but because I learned wget first. I do use many of the poppler's tools.
To make it a bash script to convert all pdf to ps converting the extensions only:
#1/bin/bash
clear
find . -type f -iname '*.pdf' -print0 |
while IFS= read -r -d '' file
do pdftop "${file}" "${file%.*}.ps"
done
Best Answer
Not sure how exactly it works if you convert from a markdown file, but for converting html to pdf using latex, I could make the pdf be landscape by adding this flag to the command:
-V geometry:landscape
So the complete command in your case could then be:
pandoc test.MD -V geometry:landscape -f markdown -o test.pdf
Note, as I said I used latex to convert, so I only can confirm that this one here will work:
pandoc test.html -V geometry:landscape -t latex -o test.pdf
Hope this is useful.