问题
We have a bunch of scanned pages (about 600) for which every PDF viewer displays the image with zero margin on the right edge, but about 2 inch margin on the left. (Presumably while scanning, there was a wrong setting used...)
We want to print these pages, preferably as a booklet. Is there a way to permanently shift all page images towards the center and have the PDF display these pages also in a more pleasing way? Can Ghostscript do that? Can one do this with some other method, such as programatically with the help of some PDF processing library?
回答1:
If you don't want to write your own program code (as Nikolaus suggested), but use a Ghostscript commandline instead, you need to know 3 things:
- PostScript has a
setpagedevice
operator that takes aPageOffset
parameter; - Ghostscript will process snippets of PostScript code if you pass them with
-c ...
on the commandline; - Ghostscript can evaluate and apply (some) PostScript code even for direct PDF=>PDF conversions.
Now try this commandline to shift all page images by 1 inch (==72pt) to the left:
gswin32c.exe ^
-sDEVICE=pdfwrite ^
-o c:/path/to/output/pdf-shifted-by-1-inch-to-left.pdf ^
-dPDFSETTINGS=/prepress ^
-c "<</PageOffset [-72 0]>> setpagedevice" ^
-f c:/path/to/input/pdf-original.pdf
(The -dPDFSETTINGS=/prepress
I put in in order to not loose any picture quality of the scans...)
回答2:
you can use iText to move, scale or crop pdf-pages
you need to define a PdfReader for your source file, and a Document for your Target file then you iterate over the pages if the Reader, create a new page in the Document and add the sourcePage as a Template to the new page (shifting, scaling etc wherever you want)
PdfReader reader = new PdfReader( input );
int n = reader.getNumberOfPages();
Rectangle psize = reader.getPageSize(1);
float width = psize.getHeight();
float height = psize.getWidth();
Document document = new Document(new Rectangle(height, width));
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream( output ));
document.open();
PdfContentByte cb = writer.getDirectContent();
int i = 0;
while (i < n) {
i++;
document.newPage();
PdfImportedPage page = writer.getImportedPage(reader, i);
cb.addTemplate(page, factor, 0, 0, factor, left, down);
}
document.close();
来源:https://stackoverflow.com/questions/3447720/how-can-i-shift-page-images-in-pdf-files-more-to-the-left-or-to-the-right