Уменьшение содержания в PDF с помощью Java

Опубликовано: 1 Декабря, 2021

Программа для сжатия содержимого PDF-документа. Внешний файл jar требуется для импорта в программе. Ниже приведена реализация того же самого.

Подход:

1. Создайте пустой файл PDF.

  • Назначьте путь к пустому PDF-файлу строковой переменной.
  • Импортируйте PdfWriter из пакета com.itextpdf.kernel.pdf . (PdfWriter позволяет нам записывать контент в наш файл PDF)
  • PdfWriter принимает в качестве параметра строковую переменную, представляющую место назначения PDF-файла.
  • Инициализируйте объект PdfWriter, передав путь к файлу PDF.

2. Создайте документ, представляющий пустой файл PDF.

  • Импортируйте PdfDocument из пакета com.itextpdf.kernel.pdf . (PdfDocument используется для представления PDF-файла в коде. Позже его можно использовать для добавления или изменения различных функций, таких как шрифт, изображения и т. Д.)
  • PdfDocument принимает в качестве параметра объект PdfWriter или PdfReader.
  • Инициализируйте PdfDocument, передав объект PdfWriter.

3. Повторите вышеуказанные шаги для исходного PDF-файла.

  • Назначьте путь к исходному PDF-файлу строковой переменной.
  • Импортируйте PdfReader из пакета com.itextpdf.kernel.pdf . (PdfReader позволяет нам читать содержимое нашего файла PDF)
  • Передайте путь к исходному PDF-файлу конструктору PdfReader.
  • Инициализируйте PdfDocument, передав объект PdfReader.

4. Получите размер страницы из исходного PDF-файла.

  • Импортируйте PdfPage из пакета com.itextpdf.kernel.pdf . (PdfPage представляет конкретную страницу в PDF)
  • Импортируйте Rectangle из пакета com.itextpdf.kernel.geom .
  • Метод getPage (int pageNumber), присутствующий в классе t PdfDocumen, возвращает объект PdfPage конкретной указанной страницы.
  • Метод getPageSize (), присутствующий в классе PdfPage, возвращает объект Rectangle конкретного объекта PdfPage.

5. Получите размер страницы из пустого PDF-файла.

  • Невозможно получить размер страницы из пустого PDF-файла.
  • Итак, чтобы получить размер, мы добавляем новую страницу в пустой PDF-файл с помощью метода addNewPage (), присутствующего в классе PdfDocument. Методы addNewPage () возвращают объект PdfPage.
  • Метод getPageSize (), присутствующий в классе PdfPage, возвращает объект Rectangle конкретного объекта PdfPage.

6. Создание уменьшенной версии исходной страницы.

  • Импортируйте AffineTransform из пакета com.itextpdf.kernel.geom .
  • Новую масштабированную ширину можно рассчитать с помощью (emptyPageWidth / originalPageWidth) / 2.
  • Новая масштабированная высота может быть рассчитана с помощью (emptyPageHeight / originalPageHeight) / 2.
  • Статический метод getScaleInstance (двойная ширина, двойная высота), присутствующий в классе AffineTransform, возвращает объект AffineTransform с масштабированной шириной и масштабированной высотой.

7. Добавьте уменьшенную версию исходной страницы в пустой PDF-файл.

  • Импортируйте PdfCanvas из пакета com.itextpdf.kernel.pdf.canvas .
  • Инициализируйте объект PdfCanvas, передав пустую страницу в качестве параметра.
  • Добавьте созданную выше матрицу с уменьшенными размерами на пустой холст.
  • Скопируйте содержимое с исходной страницы с помощью метода copyAsFormXObject (PdfDocument shrunkenDocument) (возвращает PdfFormXObject) присутствует в классе PdfPage.
  • Добавьте скопированную страницу на холст с помощью метода addXObject (PdfXObject xObject, float x, float y).

8. Создайте документ.

  • Импорт докумен т из пакета com.itextpdf.layout.
  • Объект Document создается, чтобы сделать версию PDF-файла читаемой.
  • Один из конструкторов класса Document принимает в качестве параметров объект PdfDocument.
  • Инициализируйте объект Document, передав shrunkenDocument в качестве параметра.
  • Документ закрывается после создания объекта, чтобы предотвратить утечку памяти.

Примечание. Требуется внешний Jar-файл (загрузите, нажав здесь).

Ниже представлена реализация сжатия PDF:

Ява

// Java program to shrink the contents of a PDF
// Importing the necessary libraries required
import com.itextpdf.kernel.pdf.*;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.geom.AffineTransform;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.kernel.pdf.xobject.PdfFormXObject;
import com.itextpdf.layout.Document;
public class Main {
public static void main(String[] args)
{
// Try catch block is used to handle File Exceptions
try {
// Destination of the empty PDF
String shrunkenPath = "/home/mayur/newGFG.pdf" ;
// Creating PDF writer object
PdfWriter pdfWriter
= new PdfWriter(shrunkenPath);
// Creating a PdfDocument object for empty pdf
PdfDocument shrunkenDocument
= new PdfDocument(pdfWriter);
// Destination of the original PDF
String originalPath = "/home/mayur/GFG.pdf" ;
// Creating PDF reader object
PdfReader pdfReader
= new PdfReader(originalPath);
// Creating a PdfDocument object for original
// pdf
PdfDocument originalDocument
= new PdfDocument(pdfReader);
// Opening the first page of the original PDF
PdfPage orignalPage
= originalDocument.getPage( 1 );
// Getting the height and width of the original
// PDF
Rectangle originalPDFSizes
= orignalPage.getPageSize();
// Adding a new page to the empty PDF
PdfPage emptyPage
= shrunkenDocument.addNewPage();
// Getting the height and width of the empty PDF
Rectangle emptyPDFsizes
= emptyPage.getPageSize();
// Scaling down the original Pdf page
double width = emptyPDFsizes.getWidth()
/ originalPDFSizes.getWidth();
double height = emptyPDFsizes.getHeight()
/ originalPDFSizes.getHeight();
// Calculating the new width and height
double newWidth = width / 2 ;
double newHeight = height / 2 ;
// Creating a matrix with new width and new
// height
AffineTransform affineTransform
= AffineTransform.getScaleInstance(
newWidth, newHeight);
// Creating an empty canvas
PdfCanvas canvas = new PdfCanvas(emptyPage);
// Adding the matrix created to the empty canvas
canvas.concatMatrix(affineTransform);
// Copying the content from the original PDF
PdfFormXObject pageCopy
= orignalPage.copyAsFormXObject(
shrunkenDocument);
// Adding the copied page to the canvas
canvas.addXObject(pageCopy, ( float )newWidth,
( float )newHeight);
// Creating a Document object to make the PDF
// readable
Document doc = new Document(shrunkenDocument);
// Closing the documents to prevent memory leaks
doc.close();
originalDocument.close();
System.out.println(
"Shrunken PDF successfully created" );
}
// Catching any unwanted Exceptions
catch (Exception e) {
System.err.println(e);
}
}
}

Перед казнью:

Исходный PDF

После казни:

PDF после сжатия содержимого

Вниманию читателя! Не прекращайте учиться сейчас. Ознакомьтесь со всеми важными концепциями Java Foundation и коллекций с помощью курса "Основы Java и Java Collections" по доступной для студентов цене и будьте готовы к работе в отрасли. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .