Создание PDF документов (new!)

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Реакции
1 269
Баллы
113
88283

KAxeYbOCMRNOr8.jpg

Доброе время суток форумчане. Сегодня завершается наша трилогия по работе с документами разного формата из ZennoPoster. Word-http://zennolab.com/discussion/threads/sozdanie-word-dokumentov.15666/ Excel - http://zennolab.com/discussion/threads/sozdanie-excel-fajlov.15797/
___________________________________________________________________________
Работать мы будем конечно же с долгожданным форматом PDF
Качаем библиотеку PDFsharp по ссылке https://pdfsharp.codeplex.com/

88284
zAN0ea8HBKRRm9.jpg

RmzXYbWt0OyWAO.jpg

Открываем архив, заходим в папку GDI+ и переносим файл PdfSharp.dll папку ExternalAssemblies. Если такой папки нет - просто создаем. У меня демо версия зеннки, поэтому такой путь.

88285

Vm6ya90HD7ZErZ.jpg

Добавляем ссылку на библиотеку через элемент Ссылки на GAC

88286

l2ZvLlBUwe4J2J.jpg

Добавляем в элемент Директивы using
C#:
Развернуть Свернуть Копировать
using PdfSharp.Drawing;
using PdfSharp.Pdf;
using System.IO;
using System.Diagnostics;

88287

nAyzYbVcY3oXrZ.jpg

Теперь открываем элемент Свой c# код и вставляем данный код. Думаю комментарии излишне

88288

V2Vn5d1Txv6J2v.jpg

C#:
Развернуть Свернуть Копировать
// Создаем новый PDF документ
PdfDocumnet document = new PdfDocumnet();

// Создаем пустую страницу
PdfPage page = document.AddPage();

// Получаем объект XGraphics для "рисования" элементов на странице
XGraphics gfx = XGraphics.FromPdfPage(page);

// Специальная опция для шрифта. Это чтобы русский текст нормально отображался
XPdfFontOptions options = new XPdfFontOptions(PdfFontEncoding.Unicode, PdfFontEmbedding.Always);

// Создаем шрифта
Xfont font = new XFont("Times New Roman", 40, XFontStyle.Bold, options);

// Рисуем текст. Да да) вы не ослышались. Рисуем текст в указанных координатах
gfx.DrawString("Здесь был водяной знак", font, brush,
    new XRect(0, 0, page.Width, page.Height),
XStringFormat.Center);

string filename = "Test.pdf";

// Сохраняем файл под названием Test.pdf
document.Save(filename);
// ... и запускам сразу в программе просмотра pdf файлов
Process.Start(filename);
Как вы видите есть один существенный недостаток - нужно указывать координаты. Но у PDFsharp есть младший брат - MigraDoc, который упростит нам работу со стилями в документе. Работу с MigraDoc рассмотрим чуть позже)
Итак, что нам еще нужно бывает при работе с PDF?
1) Защита документа от редактирования
2) Добавление водяного знака
3) Преобразование картинки в PDF

Пример редактирования политик защиты

88289

4Ak3z8biyROxAq.jpg

C#:
Развернуть Свернуть Копировать
PdfSecuritySettings securitySettings = document.SecuritySettings;

// Пароль для открытия документа
securitySettings.UserPassword = ""; // Пустой пароль

// Пароль для редактирования документа
securitySettings.OwnerPasswod = "superpassword1";

// Печать с высоким разрешением
securitySettings.PermitFullQualityPrint = false;

// Изменения документа
securitySettings.PermitModifyDocument = false;

// Комментирование
securitySettings.PermitAnnotations = false;

// Заполнение полей форм или подписание
securitySettings.PermitFormsFill = false;

// Компоновка документа
securitySettings.PermitAssembleDocument = false;

// Копирование содержимого
securitySettings.PermitExtractContent = false;

// Расширенный доступ к содержимому
securitySettings.PermitAccessibilityExtractContent = false;

// Сохраняем файл под название Test.pdf
document.Save(filename);
Добавления водяного знака

88290

KAgKYPph49Q5Al.jpg

C#:
Развернуть Свернуть Копировать
// Создаем шрифт
Xfont font = new XFont("Times New Roman", 40, XFontStyle.Bold, options);

// Функции поворота теста
gfx.TranslateTransform(page.Width / 2, page.Height / 2);
gfx.RotateTransform(-Math.Atan(page.Height / page.Width) * 180 / Math.PI);
gfx.TranslateTransform(-page.Width / 2, -page.Height / 2);

// Создаем полупрозрачную кисть для более реалистичного вида
XBrush brush = new XSolidBrudh(XColor.FromArgb(128, 255, 0, 0));

// Рисуем водяной знак
gfx.DrawString("Здесь был водяной знак", font, brush,
    new XRect(0, 0, page.Width, page.Height),
XStringFormat.Center);
Конвертация Jpeg в PDF

88291

J2be4D7CXoPlm6.jpg

C#:
Развернуть Свернуть Копировать
// Создаем новый PDF документ
PdfDocument doc = new PdfDocument();

// Добавляем пустую страницу
doc.Pages.Add(new PdfPage());

Xgraphics xgr = XGraphics.FromPdfPage(doc.Pages[0]);

// Указываем путь к картинке
XImage img = XImage.FromFile(@"D:\123.jpg");

// Координаты начала вставки картинки
xgr.DrawImage(img, 0, 0);

// Сохраняем PdfDocument
doc.Save("Zenno.pdf");

doc.Close();

Process.Start("Zenno.pdf");
Жду пожеланий по поводу добавления дополнительных плюшек)
 
Номер конкурса статей
  1. Второй конкурс статей
Тема статьи
  1. Другое
Последнее редактирование модератором:
А как проще всего конвертировать уже созданные html документы в pdf ?
В которых есть стили и картинки ? И которые лежат в локальной папке ?
 
Генерация PDF из HTML

Рассмотрим сегодня создание pdf из html файлов. Для этого надо скачать программу wkhtmltopdf по ссылке http://sourceforge.net/projects/wkhtmltopdf/?source=typ_redirect
____________________________________________________________________________

52a1nv4s4BK320.jpg


Указываем путь установки. Дальше он нам пригодится
823OLzZCJMeb2O.jpg

L21LWXyi8nYomX.jpg

Открываем элемент Свой c# код и вставляем следующий код
C#:
Развернуть Свернуть Копировать
Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.StartInfo.FileName =@"C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe"; // Путь к программе
p.StartInfo.Arguments = "-l K:\\1.html TestPDF.pdf"; // -l это спец.ключ для быстрой генерации. Теряем качество
p.Start();
p.WaitForExit(99999);

RmzXYbWt0QoqAO.jpg

VrwoYbOuOb17rX.jpg
gmvRYbotL8kxma.jpg

Вуаля) Вот и весь код. 5 Страниц данной темы весят ~2,6 Мб. Это с ключом -l. Без него весит побольше ну и генерация тоже занимает больше времени
И напоследок генерация пдф файлов из нескольких html-файлов в папке
KAgKYPph4jpEAl.jpg

После того как запустим программу получаем
YmEVy9Et0eNG26.jpg

pS Просьба к админам добавить в конкурсную тему) Ну и этот пост сделать продолжением первого поста
 
  • Спасибо
Реакции: Cop, caine и AlisaZ
Radzhab, круто! Продолжай в том же духе!
 
  • Спасибо
Реакции: Radzhab
  • Спасибо
Реакции: Axel и Radzhab
очень хорошая тема, а кто может подсказать,можно сделать прин скрин и добавить в PDF ? и как это сделать ?
 
У вас всегда очень качественные и класные статьи, приятно читать .
 
  • Спасибо
Реакции: Radzhab
рад что у тебя есть чувство юмора )))
 
  • Спасибо
Реакции: GHU
ну кто не буди подскажите где надо сделать изменение в этом коде?

  1. // Создаем новый PDF документ
  2. PdfDocument doc = new PdfDocument();

  3. // Добавляем пустую страницу
  4. doc.Pages.Add(new PdfPage());

  5. Xgraphics xgr = XGraphics.FromPdfPage(doc.Pages[0]);

  6. // Указываем путь к картинке
  7. XImage img = XImage.FromFile(@"D:\123.jpg");

  8. // Координаты начала вставки картинки
  9. xgr.DrawImage(img, 0, 0);

  10. // Сохраняем PdfDocument
  11. doc.Save("Zenno.pdf");

  12. doc.Close();

  13. Process.Start("Zenno.pdf");
 
Сделал все, как написанно в статье и не работает ничего (
 
все канешь хорошо, но есть вопрос .
для чего это нужно в зенно?
какое практическое применение?
индексация документов вам ни чего не говорит?) а там сами думайте...
 
Radzhab нужна ваша помощь. У меня ZennoPoster v5.1.2.0. Генерирую pdf файлы из нескольких html. Немного переделал эту строку в шаблоне:
Код:
Развернуть Свернуть Копировать
p.StartInfo.Arguments = string.Format("-l {0} D:\\siteru\\" + System.IO.Path.GetFileNameWithoutExtension(file) + ".pdf", file);

Подготовил к генерированию 1155 html файлов. Но, после создания 563 pdf файлов, шаблон останавливается. Zennoposter не вылетает:
download


Я вот что заметил: у меня все файлы на немецком языке. И скорее всего эта проблема связана с умлаутами. 563 файла, это файлы в названии которых нет этих бля....их умлаутов. Там где они есть, pdf файлы не генерируются.
Как жить дальше? :bn:
 
Скажите, можно ли открыть pdf-документ, чтобы в него внести водяные знаки?

У меня почему-то несмотря на подключение библиотеки PdfSharp функция PdfDocument.Open (...) не работает. Кто столкнулся с этой проблемой? Может есть решение?
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)