Package com.chenshuo.pdf

Source Code of com.chenshuo.pdf.PdfHack

package com.chenshuo.pdf;

import java.io.FileOutputStream;

import com.itextpdf.text.Document;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfDictionary;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfName;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfRectangle;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.PdfWriter;

public class PdfHack {

    static final float kTextWidth = Float.parseFloat(System.getProperty("TextWidth", "370"));
    static final float kTextHeight = Float.parseFloat(System.getProperty("TextWidth", "590"));
    static final float kMargin = Float.parseFloat(System.getProperty("Margin", "10"));
    static final float kOffset = Float.parseFloat(System.getProperty("Offset", "0"));

    private static void help() {
        System.out.println("Usage: PdfHack command input_pdf");
        System.out.println("command is one of 'crop', 'twoup', 'booklet'");
    }

    private static void crop(String input) throws Exception {
        String output = input.replace(".pdf", "-crop.pdf");
        PdfReader reader = new PdfReader(input);
        final int n = reader.getNumberOfPages();
        Rectangle pageSize = reader.getPageSize(1);

        System.out.println("Input page size: " + pageSize);
        float left = (pageSize.getWidth() - kTextWidth) / 2 - kMargin;
        float right = pageSize.getWidth() - left;
        float bottom = (pageSize.getHeight() - kTextHeight) / 2;
        float top = pageSize.getHeight() - bottom;
        PdfRectangle rect = new PdfRectangle(left, bottom + kOffset, right, top + kOffset);
        for (int i = 1; i <= n; i++) {
            PdfDictionary pageDict = reader.getPageN(i);
            pageDict.put(PdfName.CROPBOX, rect);
        }
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(output));
        stamper.close();
    }

    private static PdfImportedPage getPage(PdfWriter writer, PdfReader reader, int page) {
        if (page > 0 && page <= reader.getNumberOfPages())
            return writer.getImportedPage(reader, page);
        else
            return null;
    }

    private static void twoup(String input) throws Exception {
        String output = input.replace(".pdf", "-twoup.pdf");
        PdfReader reader = new PdfReader(input);
        int n = reader.getNumberOfPages();
        Rectangle pageSize = reader.getPageSize(1);

        System.out.println("Input page size: " + pageSize);
        Document doc = new Document(PageSize.A4.rotate(), 0, 0, 0, 0);
        PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream(output));
        doc.open();
        // splitLine(doc, writer);
        PdfContentByte cb = writer.getDirectContent();
        float bottom = (doc.top() - pageSize.getHeight()) / 2 + kOffset;
        float left = doc.right() / 2 - (pageSize.getWidth() + kTextWidth) / 2 - kMargin;
        float right = doc.right() / 2 - (pageSize.getWidth() - kTextWidth) / 2 + kMargin;

        for (int i = 0; i <= n;) {
            PdfImportedPage page = getPage(writer, reader, i++);
            if (page != null)
                cb.addTemplate(page, left, bottom);

            page = getPage(writer, reader, i++);
            if (page != null)
                cb.addTemplate(page, right, bottom);

            doc.newPage();
        }
        doc.close();
    }

    private static void splitLine(Document doc, PdfWriter writer) {
        PdfContentByte cb = writer.getDirectContentUnder();
        cb.moveTo(doc.right() / 2, doc.bottom());
        cb.lineTo(doc.right() / 2, doc.top());
        cb.stroke();
    }

    private static void booklet(String input) throws Exception {
        String output = input.replace(".pdf", "-booklet.pdf");
        PdfReader reader = new PdfReader(input);
        int n = reader.getNumberOfPages();
        Rectangle pageSize = reader.getPageSize(1);

        System.out.println("Input page size: " + pageSize);
        Document doc = new Document(PageSize.A4.rotate(), 0, 0, 0, 0);
        PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream(output));
        doc.open();
        splitLine(doc, writer);
        int[] pages = new int[(n + 3) / 4 * 4];
        int x = 1, y = pages.length;
        for (int i = 0; i < pages.length;) {
            pages[i++] = y--;
            pages[i++] = x++;
            pages[i++] = x++;
            pages[i++] = y--;
        }
        PdfContentByte cb = writer.getDirectContent();
        float bottom = (doc.top() - pageSize.getHeight()) / 2 + kOffset;
        float left = doc.right() / 2 - (pageSize.getWidth() + kTextWidth) / 2 - kMargin;
        float right = doc.right() / 2 - (pageSize.getWidth() - kTextWidth) / 2 + kMargin;

        for (int i = 0; i < pages.length;) {
            PdfImportedPage page = getPage(writer, reader, pages[i++]);
            if (page != null)
                cb.addTemplate(page, left, bottom);

            page = getPage(writer, reader, pages[i++]);
            if (page != null)
                cb.addTemplate(page, right, bottom);

            doc.newPage();
        }
        doc.close();
    }

    public static void main(String[] args) {
        if (args.length >= 2) {
            String cmd = args[0];
            String input = args[1];

            try {
                if (cmd.equals("crop")) {
                    crop(input);
                } else if (cmd.equals("twoup")) {
                    twoup(input);
                } else if (cmd.equals("booklet")) {
                    booklet(input);
                } else {
                    help();
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        } else {
            help();
        }
    }

}
TOP

Related Classes of com.chenshuo.pdf.PdfHack

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.