Как разделить pdf файл на одну страницу и удалить неиспользуемые объекты (оптимизировать) - PullRequest
0 голосов
/ 05 апреля 2019

Мне нужно разделить большие документы (несколько тысяч страниц и 1-2 Гб), используя itext 7

Я уже пытался разделить PDF, используя эту ссылку https://itextpdf.com/en/resources/examples/itext-7/splitting-pdf-file а также делать что-то вроде этого:

try (PdfDocument pdfDoc = new PdfDocument(new PdfReader(outputPdfPath.toString()))) {
        Files.createDirectories(Paths.get(destFolder));

        int numberOfPages = pdfDoc.getNumberOfPages();
        int pageNumber = 0;

        while (pageNumber < numberOfPages) {
            try (PdfDocument document = new PdfDocument(
                    new PdfWriter(destFolder + pages.get(pageNumber++).id + ".pdf"))) {
                pdfDoc.copyPagesTo(pageNumber, pageNumber, document);
            }
        }
        log.info("Provided PDF has been split into multiple.");
    }

Оба примера отлично работают, но созданные документы имеют большой размер и содержат множество неиспользуемых шрифтов, изображений и объектов. Как я могу удалить все эти неиспользуемые объекты, чтобы вновь созданные одностраничные PDF-файлы весили меньше.

1 Ответ

1 голос
/ 08 апреля 2019

Проблема с вашим документом заключается в следующем: каждая страница разделяет много (возможно, даже все) шрифтов / xobjets документа.Копируя страницы, iText не знает, нужны ли ресурсы на странице: он просто копирует их, и поэтому вы получаете такие огромные PDF-файлы.

Опция, которую вы ищете - iText pdfSweep.

Общим назначением является редактирование содержимого какой-либо страницы, однако помимо этого pdfSweep также оптимизирует страницы при редактировании.

Итак, как решить проблему?

a) Укажите область редактирования как вырожденный прямоугольник

b) Очистите страницы (разделенных документов или исходного документа).):

    PdfCleanUpLocation dummyLocation = new PdfCleanUpLocation(1, new Rectangle(0, 0, 0, 0), null);
        PdfDocument pdfDocument = new PdfDocument(new PdfReader(input), new PdfWriter(output));

    PdfCleanUpTool cleaner = (cleanUpLocations == null)
            ? new PdfCleanUpTool(pdfDocument, true)
            : new PdfCleanUpTool(pdfDocument, cleanUpLocations);
    cleaner.cleanUp();

    pdfDocument.close();

Я пробовал этот подход для обработки первого из ваших результирующих документов (который представляет первую страницу).

Размер документа до pdfSweep обработка: 9282 КБ.

Размер документа после pdfSweep обработка: 549 КБ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...