Создайте одну динамическую c страницу PDF в ITextPDF Java - PullRequest
0 голосов
/ 31 марта 2020

Я искал много статей здесь об этом. Я нашел некоторые, но ни один, который работает должным образом для того, что мне нужно. Итак, давайте углубимся в это. Я создаю файл в ITextPDF, который мне нужно распечатать после этого. И содержимое файла является Dynami c. Таким образом, PDF иногда разделяет содержимое на страницы, и когда я его печатаю, разрыв между страницами отображается с большим пространством на бумаге (мне нужно печатать на термопринтере на одной странице). Итак, я провел несколько дней, пытаясь найти какие-либо решения, но пока не могу найти его. Для печати я использую PDFBox, который отлично работает. сейчас нужно правильно выровнять PDF.

PDF example 1

PDF example 2

Это две страницы PDF. Нужно сделать его единым, помня, что это динамически c, оно может быть намного длиннее.

Пример кода того, как я его создаю:

Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(pdfDirectoryPath + 
    "temp.pdf"));
writer.setStrictImageSequence(true);
document.open();

Font bold = FontFactory.getFont(FontFactory.HELVETICA_BOLD, 20, BaseColor.BLACK);

Chunk nomeFantasiaChunk = new Chunk(nomeFantasia, bold );
Paragraph paragrafoNomeFantasia = new Paragraph(nomeFantasiaChunk);
paragrafoNomeFantasia.setAlignment(Element.ALIGN_CENTER);
document.add(paragrafoNomeFantasia);

document.close();

Пример кода того, как я печатаю это (работает нормально, используя PDFBox):

private void printPDF(PrintService print, String fileName) {
    try {
        PDDocument document = PDDocument.load(new FileInputStream(Constants.pdf + fileName));
        PrinterJob job = PrinterJob.getPrinterJob();
        job.setPageable(new PDFPageable(document));

        // define custom paper
        Paper paper = new Paper();
        paper.setSize(225, 396); // 1/72 inch
        paper.setImageableArea(0, 0, paper.getWidth(), paper.getHeight()); // no margins

        // custom page format
        PageFormat pageFormat = new PageFormat();
        pageFormat.setPaper(paper);

        // override the page format
        Book book = new Book();
        // append all pages
        book.append(new PDFPrintable(document), pageFormat, document.getNumberOfPages());
        job.setPageable(book);
        job.setPrintService(print);
        job.print();
    } catch (Exception e) {
        e.printStackTrace();
    }

}

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

Вот эта, например: Создание нового одностраничного PDF-документа из одной страницы многостраничного PDF-документа

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

Если вы можете мне помочь Я благодарю тебя

1 Ответ

0 голосов
/ 01 апреля 2020

После долгих исследований я наконец-то смог решить эту проблему. Эта статья помогла мне: Объединить PDF-документы в одну страницу iText

Мне пришлось немного изменить код. Есть некоторые его части, которые я совсем не понимаю, и они не сработали должным образом.

Итак, с редактированием все закончилось так:

PdfReader reader = new PdfReader(pdfDirectoryPath + "temp.pdf");
Rectangle pageSize = reader.getPageSize(1);
Rectangle newSize = new Rectangle(pageSize.getWidth(), pageSize.getHeight() * 
    reader.getNumberOfPages());
Rectangle unitSize = new Rectangle(pageSize.getWidth(), pageSize.getHeight());
int n = (int)Math.pow(2, reader.getNumberOfPages());
int r = (int)Math.pow(2, reader.getNumberOfPages() / 2);
int c = n / r;

Document document2 = new Document(newSize);
PdfWriter writer2 = PdfWriter.getInstance(document2, new 
     FileOutputStream(pdfDirectoryPath + fileName));
document2.open();
document2.newPage();
PdfContentByte cb = writer2.getDirectContent();
PdfImportedPage page;

float offsetY, factor;
for (int i = 1; i <= reader.getNumberOfPages(); i++) {
     page = writer2.getImportedPage(reader, i);
     Rectangle currentSize = reader.getPageSize(i);
     factor = Math.min(
     unitSize.getWidth() / currentSize.getWidth(),
     unitSize.getHeight() / currentSize.getHeight());
     offsetY = newSize.getHeight() - (unitSize.getHeight() * (((i % n) / c) + 1))
              + (unitSize.getHeight() - (currentSize.getHeight() * factor)) / 2f;
     if (i > 1) {
        offsetY += 150;
     }
     cb.addTemplate(page, factor, 0, 0, factor, 0, offsetY);
}
document2.close();
reader.close();

Теперь работает как шарм. Весь контент, который у меня был на двух страницах, теперь находится на одной динамической c странице без пробелов между содержимым разных страниц.

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