Разделить одну страницу PDF на две - PullRequest
7 голосов
/ 27 октября 2010

Я хочу разделить одну широкую страницу PDF на две страницы PDF.Моя исходная страница имеет ширину двух страниц формата А4, но высота нормальная (для формата А4).Я пытаюсь использовать IText, но без последствий.Спасибо за внимание.

Ответы [ 5 ]

2 голосов
/ 17 июля 2012

Вы также можете использовать Ghostscript (с добавлением фрагмента кода PostScript к вызову) для этого. Требуемые командные строки:

Выведите левую сторону:

 gs \
   -o left-half.pdf \
   -sDEVICE=pdfwrite \
   -g5950x8420 \
   -dFIXEDMEDIA \
   -PDFFitPage \
   -dAutoRotatePages=/None \
   -c "<</PageOffset [0 0]>> setpagedevice" \
    doubleup.pdf

Выведите на правую сторону:

 gs \
   -o left-half.pdf \
   -sDEVICE=pdfwrite \
   -g5950x8420 \
   -dFIXEDMEDIA \
   -PDFFitPage \
   -dAutoRotatePages=/None \
   -c "<</PageOffset [-595 0]>> setpagedevice" \
    doubleup.pdf

Эти командные строки могут быть легко переведены на Java или любой другой код для использования соответствующих вызовов GS API ...

2 голосов
/ 27 октября 2010

Я не знаю API iText, но вы можете выполнить следующие шаги, чтобы получить:

Создайте две новые копии существующей страницы.Это означает, что у вас есть те же ресурсы, тот же ContentStream и т. Д.

Получите MediaBox для первой страницы, которая представляет собой массив, заданный как [llx lly urx ury].

if MediaBox[2] - MediaBox[0] == long edge of A4 page then
    HalfPageWidth = MediaBox[2] - MediaBox[0];
    PageCopy1.CropBox = [MediaBox[0] MediaBox[1] (MediaBox[0] + HalfPageWidth) MediaBox[3]]
    PageCopy2.CropBox = [(MediaBox[0] + HalfPageWidth) MediaBox[1] MediaBox[2] MediaBox[3]]
else
    HalfPageHeight = MediaBox[3] - MediaBox[1];
    PageCopy1.CropBox = [MediaBox[0] MediaBox[1] MediaBox[2] (MediaBox[1] + HalfPageHeight)]
    PageCopy2.CropBox = [MediaBox[0] (MediaBox[1] + HalfPageHeight)] MediaBox[2] MediaBox[3]]

Удалить исходную страницу и сохранить эти две страницы.По сути, вы делаете две идентичные копии страницы и обрезаете каждую до половины страницы.Вам также может понадобиться установить поворот страницы.

1 голос
/ 16 февраля 2014

try Briss !

Простой пользовательский интерфейс позволяет точно определить область обрезки, поместив прямоугольник на визуально наложенных страницах.

Соединяет четные и неровные страницы и разделяет выбранные пользователем страницы.Вы можете рассчитать точное соотношение A4 и ввести значения вручную, а не рисовать прямоугольник, и / или выровнять области обрезки.

1 голос
/ 17 июля 2012

Пример кода на c #, но очень похож. Я использовал его, чтобы разделить одну страницу A3 на 2 страницы A4, вам просто нужно поиграть со значениями x, y.

    private void CreatePdf(string saveLocation, string bigPageSource)
    {
        Document document = new Document(PageSize.A4);
        PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(saveLocation, FileMode.Create));

        document.Open();

        PdfContentByte cb = writer.DirectContent;

        PdfReader reader = new PdfReader(bigPageSource);
        PdfImportedPage page = writer.GetImportedPage(reader, 1);

        document.NewPage();
        cb.AddTemplate(page, 0, 0);

        document.NewPage();
        cb.AddTemplate(page, -PageSize.A4.Width, 0);

        document.Close();
    }
1 голос
/ 27 октября 2010

Я бы хотел создать копию исходного PDF с измененной страницей, а не обновлять существующую, так будет проще работать в iText, и вы всегда можете переименовать файл в кормовой части.

Посмотрите на пример HelloWorldCopy здесь .

Единственное, что вам нужно изменить, - это вызов разделить широкую страницу на две страницы. Поэтому сделайте то же самое, что и в примере HelloWorldCopy для всех страниц, кроме той, которую вы хотите разделить - для этой страницы взгляните на альтернативный метод PDfCopy.addPage(), который позволяет вам указать прямоугольник, который определяет размер вновь создаваемой страницы.

Так что это должно позволить вам разбить широкую страницу на две новые страницы правильного размера. Теперь вам нужно убедиться, что левая часть широкой страницы переходит на первую новую страницу, а правая часть переходит на вторую новую страницу. Для этого вы должны взглянуть на метод PdfImportedPage.setMatrix (PdfImportedPage - это объект, возвращенный из copy.getImportedPage() в примере.

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