С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/25: Рейтинг темы: голосов - 25, средняя оценка - 4.72
3 / 3 / 3
Регистрация: 11.03.2017
Сообщений: 37

ITextPDF и кодировка

12.12.2017, 13:04. Показов 5129. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Пишу небольшой сервис по заполнению готовой PDF формы с редактируемыми текстовыми полями. Для взаимодействия с доком использую iTextPDF библиотеку. Процесс достаточно тривиальный: Есть страничка с формой, с помощью Ajax она летит на контроллер (SpringMVC), контроллер получает HttpServletRequest и передает его в метод, где собсна он разбирается и инфа заносится в необходимые поля документа. Документ на польском языке и составлен в Польше, данные заносятся на латинице, кириллице и польском. В методе для заполнения текстовых полей PDF документа сначала выполняется подгрузка документа, затем форматирование полей prepareFields(AcroFields fields)(получаю массив имен полей и в цикле применяю для каждого форматирование), затем уже начинается непосредственно заполнение. После заполнения, готовая форма сохраняется в отдельном PDF документе.
Вот код метода с заполнением:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package by.kartapolaka.kpportal.pdfclasses;
 
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
 
import javax.servlet.http.HttpServletRequest;
 
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
 
public class Entry {
 
    public static void firstKp(HttpServletRequest request) throws FileNotFoundException, DocumentException, IOException {
        //Подгружаю необходимый документ
        PdfReader reader = new PdfReader("E:\\SITE - Dev\\Dynamic_kp\\Kp-Portal\\src\\main\\resources\\form.pdf");
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(new File("E:\\SITE - Dev\\Dynamic_kp\\Kp-Portal\\src\\main\\resources\\ready_form.pdf")));
        AcroFields form = stamper.getAcroFields();
        
        //Выполняю форматирование текстовых полей (код метода ниже)
        prepareFields(form);
        
        //Тут начинается само заполнение
        form.setField(WniosekCheckBoxNames.A_GET_FIRST_KP_CHECKBOX, "Tak");
        form.setField(WniosekTextFieldsNames.A_SURNAME_TEXT, request.getParameter("name").toUpperCase());
        form.setField(WniosekTextFieldsNames.A_NAME_TEXT, request.getParameter("sname").toUpperCase());
 
        Boolean dataInPoland = Boolean.valueOf(request.getParameter("dataInPoland"));
        if (dataInPoland) {
            form.setField(WniosekCheckBoxNames.A_DO_NAME_SURNAME_IN_POLAND_CHECKBOX, "Tak");
            form.setField(WniosekTextFieldsNames.A_NAME_IN_POLAND_TEXT, request.getParameter("nameInPoland").toUpperCase());
            form.setField(WniosekTextFieldsNames.A_SURNAME_IN_POLAND_TEXT, request.getParameter("snameInPoland").toUpperCase());
        }
 
        String[] dateBirth = dateTransform(request.getParameter("birthDate"));
        form.setField(WniosekTextFieldsNames.A_BIRTH_DAY_TEXT, dateBirth[0]);
        form.setField(WniosekTextFieldsNames.A_BIRTH_MONTH_TEXT, dateBirth[1]);
        form.setField(WniosekTextFieldsNames.A_BIRTH_YEAR_TEXT, dateBirth[2]);
 
        if (request.getParameter("sex").equals("man")) {
            form.setField(WniosekCheckBoxNames.A_SEX_MAN_CHECKBOX, "Tak");
        }
        if (request.getParameter("sex").equals("wooman")) {
            form.setField(WniosekCheckBoxNames.A_SEX_WOMAN_CHECKBOX, "Tak");
        }
 
        form.setField(WniosekTextFieldsNames.A_BIRTH_PLACE_TEXT, request.getParameter("birthPlace").toUpperCase());
        form.setField(WniosekTextFieldsNames.A_CITIZENSHIP_TEXT, request.getParameter("citizenship").toUpperCase());
        form.setField(WniosekTextFieldsNames.A_NATIONALITY_TEXT, "POLSKA");
 
        System.out.println(request.getParameter("name").toUpperCase());
        System.out.println(request.getParameter("sname").toUpperCase());
        System.out.println(request.getParameter("liveRegion").toUpperCase());
        if (!request.getParameter("liveRegion").equals("null")) {
            form.setField(WniosekTextFieldsNames.B_OBWOD_TEXT, "OBWÓD");
            form.setField(WniosekTextFieldsNames.B_REGION_TEXT, request.getParameter("liveRegion").toUpperCase());
        }
 
        form.setField(WniosekTextFieldsNames.B_POST_INDEX_TEXT, request.getParameter("zipCode"));
        form.setField(WniosekTextFieldsNames.B_CITY_TEXT, request.getParameter("liveCity").toUpperCase());
 
        if (request.getParameter("liveStreet") != null) {
            form.setField(WniosekTextFieldsNames.B_STREET_TEXT, request.getParameter("liveStreet").toUpperCase());
        }
 
        String houseCorpApart = request.getParameter("liveHouse");
        if (request.getParameter("liveCasing") != null) {
            houseCorpApart = houseCorpApart + "/" + request.getParameter("liveCasing");
        }
        if (request.getParameter("liveApartment") != null) {
            houseCorpApart = houseCorpApart + "/" + request.getParameter("liveApartment");
        }
        form.setField(WniosekTextFieldsNames.B_HOUSE_CORP_APARTAMENT_TEXT, houseCorpApart);
        form.setField(WniosekTextFieldsNames.B_LIVE_COUNTRY_TEXT, request.getParameter("liveCountry").toUpperCase());
 
        form.setField(WniosekTextFieldsNames.C_DOCUMENT_NAME_TEXT, "PASZPORT");
 
        String documentSerNumb = request.getParameter("serPassport").toUpperCase()
                + request.getParameter("numPassport").toUpperCase();
        form.setField(WniosekTextFieldsNames.C_DOCUMENT_SERIES_NUMBER_TEXT, documentSerNumb);
 
        String[] dateGetPass = dateTransform(request.getParameter("getPassportDate"));
        form.setField(WniosekTextFieldsNames.C_DOCUMENT_GET_DAY_TEXT, dateGetPass[0]);
        form.setField(WniosekTextFieldsNames.C_DOCUMENT_GET_MONTH_TEXT, dateGetPass[1]);
        form.setField(WniosekTextFieldsNames.C_DOCUMENT_GET_YEAR_TEXT, dateGetPass[2]);
 
        String[] dateEndPass = dateTransform(request.getParameter("lossPassportDate"));
        form.setField(WniosekTextFieldsNames.C_DOCUMENT_END_DAY_TEXT, dateEndPass[0]);
        form.setField(WniosekTextFieldsNames.C_DOCUMENT_END_MONTH_TEXT, dateEndPass[1]);
        form.setField(WniosekTextFieldsNames.C_DOCUMENT_END_YEAR_TEXT, dateEndPass[2]);
 
        form.setField(WniosekCheckBoxNames.D_FIRST_KINSMAN_LEVEL_GRANDFATHER_CHECKBOX, "Tak");
        form.setField(WniosekCheckBoxNames.E_POLISH_ORGANIZATION_NO_CHECKBOX, "Tak");
        form.setField(WniosekCheckBoxNames.E_POLISH_LANGUAGE_YES_CHECKBOX, "Tak");
        form.setField(WniosekCheckBoxNames.H_YOUNG_16_YEARS_YES_CHECKBOX, "Tak");
 
        stamper.close();
    }
 
           private static String[] dateTransform(String dateIn) {
        String[] dateOut;
        char[] day = { dateIn.charAt(0), dateIn.charAt(1) };
        char[] month = { dateIn.charAt(3), dateIn.charAt(4) };
        char[] year = { dateIn.charAt(6), dateIn.charAt(7), dateIn.charAt(8), dateIn.charAt(9) };
        dateOut = new String[] { new String(day), new String(month), new String(year) };
        return dateOut;
    }
Тут метод, который выполняет форматирование полей:

Java
1
2
3
4
5
6
7
8
9
10
private static void prepareFields(AcroFields fields) throws DocumentException, IOException {
        BaseFont times = BaseFont.createFont(BaseFont.COURIER, BaseFont.WINANSI, BaseFont.EMBEDDED);
 
        String[] fieldsNames = WniosekTextFieldsNames.getTextFieldsNames();
 
        for (int i = 0; i < fieldsNames.length - 1; i++) {
            fields.setFieldProperty(fieldsNames[i], "textsize", new Float(16), null);
            fields.setFieldProperty(fieldsNames[i], "textfont", times, null);
        }
    }
Все работает, все заполняется. Но вот появился трабл следующего плана. После выполнения, и открытия документа на выходе, поля, в которых занесены кириллические символы не отображаются (условно!!). Т.е. По факту их не видно, но когда я кликаю по полю (поле в фокусе), они появляются. Как только кликну в другом месте (убираю фокус) они опять пропадают. Тоже самое касается и некоторых польских символов. В методе prepareFields я что уже только не менял.... И кодировку менял, и путь к конкретному шрифту указывал, и раскрывал полностью шрифт и проверял на наличие этих символов. В документе есть встроеные шрифты (я не спец в pdf) с кодировками. ПОЖАЛУЙСТА!!! ПОМОГИТЕ!!! Я уже 4ю ночь засыпаю и вижу код с этим классом перед глазами. Как мне справится с этим косяком. Буду рад любому совету. За код не ругайте, экспиренс у меня маленький... Сейчас в процессе перечитки Эккеля.
Вложения
Тип файла: pdf winiosek.pdf (469.5 Кб, 6 просмотров)
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.12.2017, 13:04
Ответы с готовыми решениями:

Gradle: error: package com.itextpdf.text does not exist
Gradle: error: package com.itextpdf.text does not exist Как исправить эту ошибку, что работы программа функционировала с...

Кодировка программы и кодировка базы данных
В общем в архиве стандартный пример и одна из программ по редактированию sqlite. Проблема заклчается в следующем: при редактировании...

Кодировка в Qt
Проблема такого плана выводит в html кракозябры. void report::on_clicreport_clicked() ...

3
3 / 3 / 3
Регистрация: 11.03.2017
Сообщений: 37
12.12.2017, 13:08  [ТС]
А и да.... Забыл. Кодировка на странице UTF-8, выставлял для request charset UTF-8.. соответственно в BaseFont тож ставил UTF-8
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
12.12.2017, 13:25
Лучший ответ Сообщение было отмечено POSTAL5532 как решение

Решение

цвет попробуй поменять, или например z-index, depth, как оно там называется
или так
https://stackoverflow.com/ques... 5#18445315
https://stackoverflow.com/ques... -invisible
https://stackoverflow.com/ques... lling-form

Цитата Сообщение от POSTAL5532 Посмотреть сообщение
wooman
позабавило
1
3 / 3 / 3
Регистрация: 11.03.2017
Сообщений: 37
12.12.2017, 14:43  [ТС]
wooman))) да) неоднозначно так вышло)))

Добавлено через 38 минут
Цитата Сообщение от xoraxax Посмотреть сообщение
цвет попробуй поменять, или например z-index, depth, как оно там называется
или так
https://stackoverflow.com/ques... 5#18445315
https://stackoverflow.com/ques... -invisible
https://stackoverflow.com/ques... lling-form


позабавило
ВЫ ПРОСТО СПАСЛИ СИТУАЦИЮ!!!!! По этой ссыле https://stackoverflow.com/ques... 5#18445315 сделал все.... ЗАРАБОТАЛО!!!! Вам огромное спасибо, +99999999 в карму и отрывного Нового Года!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.12.2017, 14:43
Помогаю со студенческими работами здесь

Кодировка
Доброго времени суток. Перепробовал все варианты, не получается никак. Есть страница с формой test.php: &lt;?php header('Content-Type:...

Кодировка
Файлы выводятся из папки в виде ссылок. Название у файлов на русском языке. $dir = &quot;gf/&quot;; $name = scandir($dir); ...

Кодировка
Добрый день. Использую ms sql 2012 + php 5.6.15 На БД используется кодировка windows-1251, а в PHP utf-8. Как их можно подружить?

Кодировка
Доброе время суток. Поздравляю всех с 9 мая!!!!! Я навичек в JAVA и хоел бы попросить Вас знащих людей подсказать мне. 1) Скажите...

Кодировка
const-string v2, &quot;Вперед&quot; есть строка, но отображается вопросиками..как изменить кодировку


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru