Полезный совет
Как вставить JavaScript-код в PDF-файл
Задача изначально была поставлена следующим образом: необходимо увеличить базу клиентов с помощью PDF. Собственно, решается данная задача вставкой в PDF-документ модального окна с формой подписки.
Делать мы все это будем с помощью C#, WPF и библиотеки iTextSharp. Интерфейс программы сейчас выглядит вот так:
Надо заметить, что эта программа - несколько урезанная версия веб-сервиса, делающего, по сути, то же самое.
В программе используются 2 плана: бесплатный и платный. Бесплатный - с рекламой, платный - без рекламы. Мы будем компилировать программу для бесплатного аккаунта.
1./// <summary>2./// План аккаунта3./// </summary>4.enum Plan { free, hard };5.const Plan option = Plan.free;1.//2.string fileWithJavaScript = "JSSubscribe.dat";1.string directory = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);2.fileWithJavaScript = System.IO.Path.Combine(directory, fileWithJavaScript);3.if (!IsUTF8File(fileWithJavaScript)) RecodeFileToUTF8(fileWithJavaScript);01./// <summary>02./// Проверяет, является ли кодировка файла UTF-803./// </summary>04./// <param name="path">Имя файла</param>05./// <returns>Кодировка UTF-8?</returns>06.static bool IsUTF8File(string path)07.{08.Utf8Checker checker = new Utf8Checker();09.using (Stream stream = File.OpenRead(path)) return (checker.IsUtf8(stream));10.}11./// <summary>12./// Перекодирует файл в UTF-813./// </summary>14./// <param name="fileName">Имя файла</param>15.static void RecodeFileToUTF8(string fileName)16.{17.string tempStringWithText;18.using (StreamReader reader = new StreamReader(File.OpenRead(fileName), Encoding.GetEncoding(1251))) tempStringWithText = reader.ReadToEnd();19.FileInfo f = new FileInfo(fileName);20.f.Delete();21.using (StreamWriter writer = new StreamWriter(File.OpenWrite(fileName), Encoding.UTF8)) writer.Write(tempStringWithText);22.}01.private void OpenCmdExecuted(object sender, ExecutedRoutedEventArgs e)02.{03.statBarText.Text = "Ждите";04.// Создать диалоговое окно открытия файла, отображающее только файлы Excel05.OpenFileDialog openDlg = new OpenFileDialog();06.openDlg.Filter = "Файлы PDF |*.pdf";07.if (true == openDlg.ShowDialog())08.{09.// Загрузить название файла10.string filename = openDlg.FileName;11.// Отобразить строку в TextBox12.txtData.Text = filename;13.}14.statBarText.Text = "Готово";15.}01.private void SaveCmdExecuted(object sender, ExecutedRoutedEventArgs e)02.{03.statBarText.Text = "Ждите, идет обработка данных";04.// Сохранить данные из TextBox в файле с тем же именем05.if (IsValidForm(sender))06.{07.string stringWithJavaScript = CustomizeFileWithJavaScript(fileWithJavaScript, int.Parse(uid.Text),int.Parse(did.Text), offerInForm.Text, buttonTextInForm.Text, option);08.SaveFileDialog saveDlg = new SaveFileDialog();09.saveDlg.Filter = "Файлы PDF |*.pdf";10.if (true == saveDlg.ShowDialog())11.{12.// Загрузить название файла13.string filename = saveDlg.FileName;14.try15.{16.IncludeJSInFile(stringWithJavaScript, txtData.Text, filename);17.}18.catch (Exception ex)19.{20.MessageBox.Show(ex.Message);21.}22.}23.statBarText.Text = "Вставка формы подписки в pdf завершена.";24.}25.}26./// <summary>27./// Вставляет JavaScript в pdf28./// </summary>29./// <param name="stringWithJavaScript">Строка с кодом JavaScript, который необходимо вставить</param>30./// <param name="inputPDFpath">Pdf, в который нужно вставить JavaScript</param>31./// <param name="outputPDFpath">Pdf со вставленным JavaScript</param>32.static void IncludeJSInFile(string stringWithJavaScript, string inputPDFpath, string outputPDFpath)33.{34.PdfReader reader = new PdfReader(inputPDFpath);35.Document document = new Document();36.PdfWriter writer;37.try38.{39.writer = PdfWriter.GetInstance(document, new FileStream(outputPDFpath, FileMode.Create));40.}41.catch (IOException ex)42.{43.Exception error = new Exception("Закройте файл", ex);44.throw error;45.}46.document.Open();47.PdfContentByte cb = writer.DirectContent;48.PdfImportedPage page;49.for (int i = 1; i <= reader.NumberOfPages; i++)50.{51.document.SetPageSize(reader.GetPageSizeWithRotation(i));52.document.NewPage();53.page = writer.GetImportedPage(reader, i);54.cb.AddTemplate(page, 0, 0);55.}56.PdfAction jAction = PdfAction.JavaScript(stringWithJavaScript, writer, true);57.writer.AddJavaScript(jAction);58.document.Close();59.Console.WriteLine("Вставка JavaScript в pdf завершена.");60.}Интерфейс с заполненными полями будет выглядеть вот так:
Пример PDF со вставленным JavaScript можно скачать по ссылке:Пример файла с JavaScript.pdf http://seesharp.ru/wp-content/uploads/2012/11/%D0%9A%D0%B0%D0%BA-%D1%81%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-%D1%80%D0%B5%D0%B7%D1%8E%D0%BC%D0%B5.pdf . Надо заметить, что JavaScript будет работать только в Adobe PDF Reader.
Комментариев нет:
Отправить комментарий