Как экспортировать JPanel в pdf с помощью iText7 со встроенным шрифтом, представленным в JPanel, асимметричными полями бумаги и позиционированием точек

У меня нет предыдущего опыта работы с iText 5, но я начал читать о iText 7 менее месяца назад. У меня довольно сложная задача по преобразованию дисплеев JPanel в главном JTabbedPane в pdf с несколькими одновременными требованиями. Я использую Swing, чтобы указать шрифт, и мне нужно встроить шрифт в PDF-файл. Мне нужно указать асимметричные поля PDF и равномерно распределить верхнее и нижнее, а также левое и правое поля, чтобы каждая панель JPanel динамически оставалась открытой на альбомной бумаге США. Моя универсальная программа на Java использует позиционирование всех компонентов JComponent по пикселям x и y, и программа динамически знает экстенты x и y каждого завершенного отображения JPanel в зависимости от содержимого данных нескольких составных JTables на каждой панели JPanel. При использовании 100 пикселей на дюйм мои панели JPanel не нуждаются в масштабировании, чтобы соответствовать бумаге формата Letter в альбомной ориентации с использованием указанных мной полей.

Я сделал три отдельных поиска на сайте developers.itextpdf.com с запросами «экспортировать JTable в pdf», «экспортировать JPanel в pdf» и «экспортировать JFrame в pdf», но не нашел результатов независимо от того, фильтрую я с помощью iText 5 или 7. То же запросы, введенные в обычное поле поиска интернет-браузера, дали несколько результатов из переполнения стека (например, How2: добавить JPanel в документ, а затем экспортировать в PDF) и другие источники. Однако все решения зависят от iText 5, потому что все они используют PdfTemplate и PdfContentByte, которых нет в iText 7, и другую версию PdfWriter с методом getInstance. Однако iText7 экспорт JPanel в pdf не показывает результатов в Stackoverflow. Поскольку я начал после того, как был представлен iText 7, я предпочитаю кодировать преобразование JPanel в pdf с помощью iText 7, если кто-то может указать мне, как это сделать.

Даже с решением iText 5, как я могу быть уверен, что мой единственный шрифт Java, указанный в моих JComponents, будет передан в промежуточный Graphics2D (если iText 7 также его использует) и правильно связан с вызовом встраивания шрифта iText. Дополнительные вещи, с которыми мне нужно повозиться, - это преобразование 100 пикселей на дюйм в JPanel в 72 точки на дюйм в PDF и размещение медиа-бокса PDF для правильных полей. Я надеюсь, что простая математика с особым вниманием к округлению - это все, что нужно для этой части. Пожалуйста, позвольте мне заранее поблагодарить за любую ближайшую помощь.


person Ting    schedule 12.12.2016    source источник
comment
Потратив некоторое время на обучение и кодирование в iText 5, я случайно наткнулся на stackoverflow.com/documentation/itext/5792/, в котором сравниваются способы создания файла pdf с помощью iText 5 и iText 7. Я думаю, что попытаюсь собрать воедино бэкэнд преобразования JPanel в pdf и надеюсь, что это будет работать с iText 7.   -  person Ting    schedule 01.01.2017
comment
Не повезло. На задней панели отсутствует PdfGraphics2D.   -  person Ting    schedule 01.01.2017


Ответы (1)


У меня была аналогичная проблема, но я выбрал гораздо более простое решение. Компонент Swing очень легко преобразовать в изображение Java, почти так же, как вы сделали бы снимок экрана работающего приложения. Если у вас есть большой BufferedImage, содержащий ваше JPanel содержимое, вы можете записать его прямо в PDF-документ. Тогда вам вообще не нужно имитировать какой-либо код Swing, используемый для заполнения JTabbedPane.

Вот несколько фрагментов кода, которые могут вам помочь. Предположим, ваше приложение создает панель JPanel, содержащую элементы Swing, такие как JLabel и т.п. Чтобы записать это как изображение Java, вы можете сделать:

JPanel myPan = createPanelForTab1();   <<  your main app code does this

// Take a snapshot of myPan as a Java image
BufferedImg jImg = new BufferedImmage(myPan.getWidth(),
                                      myPan.getHeight(),
                                      BufferedImage.TYPE_INT_ARGB);
myPan.paint(jImg.createGraphics());

Затем преобразуйте изображение Java в изображение iText (это разные вещи). Вы также можете немного уменьшить это изображение, чтобы оно поместилось на странице:

itextpdf.layout.element.Image itextImg = new Image(
                                            ImageDataFactory.create(jImg, null));
itextImg.scaleToFit(400.0f, 9999.9f);     // (if it's too big)

Добавить этот img в PDF-документ так же просто, как:

itextImg.setHorizontalAlignment(HorizontalAlignment.CENTER);
document.add(new Paragraph(iTextImg));

Возможно, это правильный путь? (Примечание: поскольку вы делаете снимок экрана, вам не нужно беспокоиться о требованиях к шрифту в PDF-файле. С другой стороны, в PDF-файле нет текста из приложения Java, поэтому вы не можете выполнять поиск по нему, Например.)

person Vernon    schedule 28.03.2017
comment
Ваше предложение - это более автоматизированная версия моих ручных действий, которые состоят из повторения снимка экрана Linux для захвата отдельных файлов PNG JTabbedpane. Libreoffice Draw может экспортировать png в одноэкранные файлы pdf, а затем объединить его с pdftk. Преобразованный файл pdf объявляет весь стандартный шрифт или встроенный шрифт, но показывает пустые имена шрифтов. Я могу встраивать шрифты с помощью iText5, но мне нужно обойти проблемы с повторением или не отображением iText5 отдельного содержимого JTabbedpane, о чем я писал ранее на этом обмене. Спасибо. Тинг - person Ting; 29.03.2017