PDF.RotatePDF.java Source code

Java tutorial

Introduction

Here is the source code for PDF.RotatePDF.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package PDF;

import ArmyLeave.LeaveFormDMPO;
import java.awt.geom.AffineTransform;
import java.io.IOException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileNameExtensionFilter;
import org.apache.pdfbox.cos.COSArray;
import org.apache.pdfbox.cos.COSBase;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.exceptions.COSVisitorException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.COSStreamArray;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.edit.PDPageContentStream;

/**
 *
 * @author this class rotate given pdf file
 */
public class RotatePDF {
    private String FILENAME;

    public RotatePDF() throws IOException, COSVisitorException {
        final JFileChooser fc = new JFileChooser();
        FileNameExtensionFilter filter = new FileNameExtensionFilter("*.pdf", "pdf");
        fc.setFileFilter(filter);
        // fc.setSelectedFile(new File("New1.xlsx"));
        fc.setDialogTitle("Select a pdf file...");
        int response = fc.showOpenDialog(null);
        if (response == JFileChooser.APPROVE_OPTION) {
            FILENAME = fc.getSelectedFile().toString();
        }
    }

    public void rotate(double degree) throws IOException, COSVisitorException {
        if (FILENAME != null) {
            String destFileName = FILENAME.replace(".PDF", ".pdf");
            destFileName = FILENAME.replace(".pdf", "_rotated.pdf");
            final PDDocument document = PDDocument.load(FILENAME);
            final AffineTransform transform = AffineTransform.getRotateInstance(degree);//
            List<PDPage> pages = document.getDocumentCatalog().getAllPages();//
            for (PDPage page : pages) {
                transformPage(document, page, transform);
            }
            document.save(destFileName);
            JOptionPane.showMessageDialog(null, "The pdf file is successfully rotated.");
        }
    }

    private void transformPage(PDDocument document, PDPage page, AffineTransform at)
            throws IOException, COSVisitorException {
        PDRectangle cropBox = page.findCropBox();
        float xOffset = (cropBox.getUpperRightX() + cropBox.getLowerLeftX()) / 2f;
        float yOffset = (cropBox.getUpperRightY() + cropBox.getLowerLeftY()) / 2f;
        AffineTransform transform = AffineTransform.getTranslateInstance(xOffset, yOffset);
        transform.concatenate(at);
        transform.concatenate(AffineTransform.getTranslateInstance(-xOffset, -yOffset));

        PDPageContentStream stream = new PDPageContentStream(document, page, true, false);
        stream.concatenate2CTM(transform);
        stream.close();

        COSBase contents = page.getCOSDictionary().getDictionaryObject(COSName.CONTENTS);
        if (contents instanceof COSStreamArray) {
            COSStreamArray contentsArray = (COSStreamArray) contents;
            COSArray newArray = new COSArray();
            newArray.add(contentsArray.get(contentsArray.getStreamCount() - 1));

            for (int i = 0; i < contentsArray.getStreamCount() - 1; i++) {
                newArray.add(contentsArray.get(i));
            }

            COSStreamArray newStreamArray = new COSStreamArray(newArray);
            page.getCOSDictionary().setItem(COSName.CONTENTS, newStreamArray);
        }
    }
}