8 / 8 / 4
Регистрация: 11.03.2015
Сообщений: 212
1

Создание титульного листа силами iTextSharp для PDF

05.07.2016, 16:58. Показов 4721. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго дня. Есть задача создать титульный лист. Я использую библиотеку iTextSharp. Возникает вопрос как это сделать? Как добавить пробелы, отступы и тому подобное? Гуглил интернет и понял, что можно использовать силы html для решения такой задачи, но как понял, что и iTextSharp вполне неплохо справится, но кода займет это больше. Создал табличный html файлик где основные поля для титульного листа:
HTML5
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
<!DOCTYPE html>
    <head>
        <meta http-equiv="Content-Type"content="text/html;charset=utf-8">
        <title>Отчет</title>
    </head>
    <body>
    <table border="1">
        <tr>
            <td><h1 align="center">Организация *********</h1></td>
        </tr>
        <tr>
            <td>
                <p align="center">Тема:</p>
                <p align="center">"***********"</p>
            
            </td>
        </tr>
        <tr>
            <td>        
                <div align="right">
                    <p>Выполнил:</p>
                    <p>*********************</p>
                    <br>
                </div>
            </td>
        </tr>
        <tr>
            <td><p align="center">Город, год****************<p></td>
        </tr>       
    </table>
    </body>
</html>
Возникает вопрос как его добавить в pdf файл с заменой полей? Так же вопрос, стоит ли игра свеч с html, может стоит сделать как-то иначе? Читал, что как-то можно сделать html "маску" в которую можно будет всё подставлять, но не могу найти и понять как и куда?

А так же вопрос как сделать титульный лист силами только библиотеки iTextSharp?

Прошу подсказать как это сделать и как лучше.
Заранее спасибо.
0
Лучшие ответы (1)
05.07.2016, 16:58
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.07.2016, 16:58
Ответы с готовыми решениями:

Создание PDF файла. Русские символы не воспринимаются в iTextSharp
Доброго времени суток. Создаю PDF документ силами библиотеки iTextSharp, но возникла проблема, осознал, что проблема этой библиотекой со...

Создание титульного листа
помогите создать программу, которая введет данные в уже созданном ворде.например у меня есть шаблон титульного листа и там не введены фио,...

Создание титульного листа
Всем добрый вечер. Имею до вас просьбу одну, а именно: Имеется оболочка из Delphi для электронного учебного пособия. Слева - навигация по...

10
8 / 8 / 4
Регистрация: 11.03.2015
Сообщений: 212
06.07.2016, 19:09  [ТС] 2
Совсем нет никого, кто может подсказать?
0
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
07.07.2016, 04:12 3
Лучший ответ Сообщение было отмечено Naomis как решение

Решение

Однозначно не надо использовать html, формат pdf имееет много элементов для форматирования, в предыдущей теме я показывал в примере как работать с таблицей. Подробней здесь https://sourceforge.net/projec... #resources
1
8 / 8 / 4
Регистрация: 11.03.2015
Сообщений: 212
07.07.2016, 11:47  [ТС] 4
DataPlanner, Спасибо большое!

Добавлено через 24 минуты
DataPlanner, А не подскажите, на счёт создания полноценного содержания с переходами по нему в документе, это где можно посмотреть?
0
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
07.07.2016, 15:49 5
Цитата Сообщение от Naomis Посмотреть сообщение
А не подскажите
Простите, с удовольствием помогу, но у меня нет на это времени, скачайте книжку iText in Action, сами знаете где, там все это есть.
1
8 / 8 / 4
Регистрация: 11.03.2015
Сообщений: 212
07.07.2016, 16:05  [ТС] 6
DataPlanner, Спасибо!
0
8 / 8 / 4
Регистрация: 11.03.2015
Сообщений: 212
04.08.2016, 16:38  [ТС] 7
DataPlanner, что-то я совсем в ступоре, не подскажите?
Пытался использовать следующую конструкцию:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
                    PdfContentByte cb = writer.DirectContent;
 
                    cb.BeginText();
                        // we draw some text on a certain position
                        cb.SetFontAndSize(baseFont, 14);
                        cb.SetTextMatrix(40, 800);
                        cb.ShowText("Акционерное общество «Российская самолётостроительная корпорация „МиГ“»");
                    cb.EndText();
 
                    cb.BeginText();
                        // we draw some text on a certain position
                        cb.SetFontAndSize(baseFont, 14);
                        cb.SetTextMatrix(280, 650);
                        cb.ShowText("Тема:" + "\n" + theme);
                    cb.EndText();
 
                    cb.BeginText();
                        // we draw some text on a certain position
                        cb.SetFontAndSize(baseFont, 14);
                        cb.SetTextMatrix(285, 35);
                        cb.ShowText(plase + " " + year);
                    cb.EndText();
она даже работает, но мне кажется, что это не совсем верный путь, задавать каждой строчки через x и y где стоять. Так же появляется вопрос, как выделить под страницу с титульным листом отдельный лист, что бы на него не заезжали последующие данные?

Добавлено через 30 минут
Попробовал сделать с помощью HTML, кое что вышло, но снова появились проблемы. Не читает кириллицу. Как такое можно исправить?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
                   // Read in the contents of the Receipt.htm file...
                    string contents = File.ReadAllText(@"..\..\TitlePage.html");
                    // Replace the placeholders with the user-specified text
                    contents = contents.Replace("[THEME]", theme);
                    contents = contents.Replace("[AUTHOR]", authorName);
                    contents = contents.Replace("[CITY]", plase);
                    contents = contents.Replace("[YEAR]", year);
 
                    // Step 4: Parse the HTML string into a collection of elements...
                    var parsedHtmlElements = HTMLWorker.ParseToList(new StringReader(contents), null);
                    // Enumerate the elements, adding each one to the Document...
                    foreach (var htmlElement in parsedHtmlElements)
                        doc.Add(htmlElement as IElement);
HTML таковой:
HTML5
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
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type"content="text/html;charset=utf-8">
        <title>Отчет</title>
    </head>
    <body>
        <table border="1">
            <tr>
                <td><h1 align="center">ООО Божий одуванчик</h1></td>
            </tr>
            <tr>
                <td>
                    <p align="center">Тема:</p>
                    <p align="center">[THEME]</p>
                </td>
            </tr>
            <tr>
                <td>        
                    <div align="right">
                        <p>Выполнил:</p>
                        <p>[AUTHOR]</p>
                    </div>
                </td>
            </tr>
            <tr>
                <td><p align="center">Город: [CITY], год: [YEAR]</p></td>
            </tr>       
        </table>
    </body>
</html>
Добавлено через 2 часа 35 минут
Теперь читает всё нормально, исправил. Немного переписал код.
C#
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
StringBuilder stringBuilder = new StringBuilder();
                    stringBuilder.Append(File.ReadAllText(@"..\..\TitlePage.html"));
                    //string contents = File.ReadAllText(@"..\..\TitlePage.html");
                    // Replace the placeholders with the user-specified text
                    stringBuilder = stringBuilder.Replace("[THEME]", theme);
                    stringBuilder = stringBuilder.Replace("[AUTHOR]", authorName);
                    stringBuilder = stringBuilder.Replace("[CITY]", plase);
                    stringBuilder = stringBuilder.Replace("[YEAR]", year);
 
                    // Step 4: Parse the HTML string into a collection of elements...
                    //var parsedHtmlElements = HTMLWorker.ParseToList(new StringReader(contents), null);
 
                    //Path to our font
                    string arialuniTff = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "ARIALUNI.TTF");
                    //Register the font with iTextSharp
                    iTextSharp.text.FontFactory.Register(arialuniTff);
 
                    //Create a new stylesheet
                    iTextSharp.text.html.simpleparser.StyleSheet ST = new iTextSharp.text.html.simpleparser.StyleSheet();
                    //Set the default body font to our registered font's internal name
                    ST.LoadTagStyle(HtmlTags.BODY, HtmlTags.FACE, "Arial Unicode MS");
                    //Set the default encoding to support Unicode characters
                    ST.LoadTagStyle(HtmlTags.BODY, HtmlTags.ENCODING, BaseFont.IDENTITY_H);
 
 
                    List<IElement> list = HTMLWorker.ParseToList(new StringReader(stringBuilder.ToString()), ST);
 
                    foreach (var element in list)
                    {
                        doc.Add(element);
                    }
но проблема в том, что таблица не растягивается на весь экран. Это можно как-то поправить? Или есть ли какая другая возможность сделать подобное?
0
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
05.08.2016, 02:10 8
Цитата Сообщение от Naomis Посмотреть сообщение
Это можно как-то поправить?
Конвертировать из HTML плохая идея. Попробуй так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private static void Main(string[] args)
        {
            using (FileStream fs = new FileStream("file.pdf", FileMode.Create, FileAccess.Write))
            {
                Document doc = new Document(PageSize.A4);
                PdfWriter writer = PdfWriter.GetInstance(doc, fs);
                doc.Open();
                PdfContentByte cb = writer.DirectContent;
                cb.Rectangle(10f, 10f, doc.PageSize.Width - 20f, doc.PageSize.Height - 20f);
                cb.SetFontAndSize(FontFactory.GetFont(FontFactory.HELVETICA_BOLD).BaseFont, 40);
                cb.BeginText();
                cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, "DOCUMENT TITLE", 300f, doc.PageSize.Height - 100f, 0);
                cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, DateTime.Now.ToLongDateString(), 200f, 100f, 0);
                cb.EndText();
                cb.Stroke();
                doc.Close();
            }
        }
1
8 / 8 / 4
Регистрация: 11.03.2015
Сообщений: 212
05.08.2016, 16:25  [ТС] 9
DataPlanner, У Вас в пдф файле две строчки, да рамка, а уже какая красота! Спасибо большое! Пойду дальше курить мануалы!

Добавлено через 1 час 42 минуты
DataPlanner, Тут возникает вопрос, а если текста слишком много, от чего он уходит за рамки pdf файла, как такое можно решить? Искал и нашёл, что в chank можно вписать символ \n или вписать newline метод, но как я понимаю, здесь такой номер не проходит. Как такое можно поправить?

Добавлено через 2 часа 27 минут
На данный момент, разбил фразу на несколько и поставил, но это не совсем верно, ведь придётся генерировать автоматически и текст может вылезти за границу файла. Как такую проблему можно решить?
0
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
06.08.2016, 02:18 10
Спасибо, попробуй ColumnText:
C#
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
private static void Main(string[] args)
        {
            using (FileStream fs = new FileStream("file.pdf", FileMode.Create, FileAccess.Write))
            {
                Document doc = new Document(PageSize.A4);
                PdfWriter writer = PdfWriter.GetInstance(doc, fs);
                doc.Open();
 
                string ttf = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "ARIAL.TTF");
                BaseFont bf = BaseFont.CreateFont(ttf, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
 
                PdfContentByte cb = writer.DirectContent;
                cb.Rectangle(10f, 10f, doc.PageSize.Width - 20f, doc.PageSize.Height - 20f);
                cb.SetFontAndSize(bf, 40);
                cb.BeginText();
                cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, "DOCUMENT TITLE", 300f, doc.PageSize.Height - 100f, 0);
                cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, DateTime.Now.Year.ToString("#### г."), 300f, 100f, 0);
                cb.EndText();
                cb.Stroke();
 
                Font f = new Font(bf, 14);
                ColumnText ct = new ColumnText(cb);
                string text = "На дощатой террасе вблизи можжевельника, жена небезызвестного местного подьячего веснушчатая Аграфена Саввична исподтишка потчевала коллежского асессора Аполлона Филипповича моллюсками и винегретом под  аккомпанемент аккордеона и виолончели.";
                ct.SetSimpleColumn(new Phrase(new Chunk(text, f)),40, 600, doc.PageSize.Width - 40f, 0, 30, Element.ALIGN_LEFT | Element.ALIGN_TOP);
                ct.Go();
                
                doc.Close();
            }
        }
1
8 / 8 / 4
Регистрация: 11.03.2015
Сообщений: 212
09.08.2016, 14:05  [ТС] 11
DataPlanner, Спасибо большое! Очень дельно. Всё работает!
0
09.08.2016, 14:05
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.08.2016, 14:05
Помогаю со студенческими работами здесь

Создание титульного листа
Недавно вы мне очень помогли с мастером слияния в ворде для автоматического создания договоров. Сэкономил себе неделю работы точно) большое...

Как в Html сделать интервал для титульного листа
вывод на Web страницу титульного листа отчета о лабораторной работе. &lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0...

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

Как убрать разметку с титульного листа
Всем привет! Подскажите пожалуйста. Когда удаляю разметку с титульного листа, она удаляется со всех страниц. Что делать?

Копирование титульного листа из одного документа в другой
Здравствуйте, как на форме или в макросе, сделать чтобы из одного целого документа он копировал титульный лист в новый пустой документ?...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Опции темы

Новые блоги и статьи
Использование кэша Laravel - полный гайд
bytestream 18.02.2025
Кэширование - один из наиболее эффективных способов повышения производительности веб-приложений. В современном мире, где скорость загрузки страниц напрямую влияет на удержание пользователей и. . .
Создаем REST API в Laravel с аутентификацией и Passport
bytestream 18.02.2025
Разработка современных веб-приложений все чаще требует создания надежного и хорошо структурированного API. REST API стал стандартом де-факто для построения взаимодействия между клиентской и серверной. . .
Пайплайны в Laravel - полный гайд
bytestream 18.02.2025
Разработка современных веб-приложений часто требует обработки сложных процессов, состоящих из множества последовательных шагов. Например, при создании системы комментариев может потребоваться. . .
Как правильно использовать @required в Symfony
bytestream 18.02.2025
При разработке приложений на Symfony мы часто сталкиваемся с необходимостью внедрения зависимостей. Фреймворк предоставляет несколько способов управления этим процессом, и одним из таких инструментов. . .
Система безопасности в Laravel: возможности и примеры
Wired 18.02.2025
Каждый день появляются новые виды атак и уязвимостей, которые могут поставить под угрозу конфиденциальные данные пользователей и функционирование всей системы. В этом контексте выбор надежного. . .
Давайте сравним Django и Laravel
Wired 18.02.2025
Django и Laravel - два мощных инструмента, которые часто сравнивают между собой. Оба фреймворка предлагают разработчикам богатый набор возможностей для создания масштабируемых веб-приложений, но. . .
Laravel или React - что лучше?
Wired 18.02.2025
В разработке веб выбор правильного инструмента часто определяет успех всего проекта. Особенно интересным представляется сравнение Laravel и React - двух популярных технологий, которые часто. . .
Laravel 11: новые возможности, гайд по обновлению
Wired 18.02.2025
Laravel 11 - это новая масштабная версия одного из самых популярных PHP-фреймворков, выпущенная в марте 2024 года. Эта версия продолжает традицию внедрения передовых технологий и методологий. . .
Миграции в Laravel
Wired 18.02.2025
Разработка веб-приложений на Laravel неразрывно связана с управлением структурой базы данных. При работе над проектом часто возникает необходимость вносить изменения в схему базы данных - добавлять. . .
Аутентификация в Laravel
Wired 18.02.2025
В современном мире веб-разработки безопасность пользовательских данных становится критически важным аспектом любого приложения. Laravel, как один из самых популярных PHP-фреймворков, предоставляет. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru