У многих возникала задача, когда необходимо в какую-либо печатную форму, сохраняемую в PDF, установить гиперссылки на какой либо сайт. Особенно актуально при сохранении различных коммерческих предложений и печатных форм заказов. Часто заказчик хочет, что бы в документах устанавливались гиперссылки, например на конкретный товар на сайте по коду или ещё что то подобное. В данной статье я постарался представить как можно сохранить обработать табличный документ, что бы на выходе получить файл в формате PDF с программно установленными гиперссылками.Первое что надо понять, у бесплатной Adobe Acrobat Reader нет API для программного редактирования гиперссылок. Есть только у платных Fine Reader и Professional. Поэтому, для решения этой задачи придётся воспользоваться Excel который стоит на большинстве компьютерах конечных пользователей.
Статья не претендует на уникальность информации, она лишь объединяет разные разобщенную информацию по данной тематике, что позволит, вероятно, сэкономить кучу времени..
Алгоритм установки ссылок в PDF будет следующим:
1. сохраняем табличный документ в Excel стандартными методами
2. Обрабатываем получившийся файл Excel, устанавливаем гиперссылки
3. Экспортируем Excel файл в формат PDF средствами Excel
4. Удаляем ненуженый файл Excel. Можно и не удалять - кому как нравится :)
Пример кода установки гиперссылки в колонку "код":
MSExcel = Новый COMОбъект("Excel.Application");
MSExcel.Visible = ложь;
ExcelДокумент = MSExcel.WorkBooks.Open(АдресФайлаПолный);
MySheet = ExcelДокумент.Worksheets(1);
Для Каждого ПоискПозицииКолонкиКод Из MySheet.Range("A1:P100") Цикл
Если ПоискПозицииКолонкиКод.Text = "Код" Тогда
СтрокаШапкиКод = ПоискПозицииКолонкиКод.Cells.Row;
Колонка = Сред(ПоискПозицииКолонкиКод.Cells.Address,2,1); // вряд ли колонка код "убежит" куда то за двузначную нумерацию колонок AB, поэтому читаем 1 символ
xlCellTypeLastCell = 11;
Количество = MySheet.Cells.SpecialCells(xlCellTypeLastCell).Row;
НачинатьС = СтрокаШапкиКод+2;
Для Стр =НачинатьС По Количество Цикл
Количество = Количество - 1;
Попытка //попробуем перевести значение в число, если это код - сработает, если строка - нет
ЗначениеКода = Число(MySheet.Cells(Стр, Колонка).value);
Если ЗначениеКода = 0 Тогда // пустая строка
Продолжить;
КонецЕсли;
Ячейка= MySheet.Cells(Стр, Колонка);
СтрокаURL = "http://www.rambler.ru/goods/"+Формат(ЗначениеКода,"ЧГ=0")+"/";
MySheet.Hyperlinks.Add(Ячейка,СтрокаURL,,);
Исключение
Продолжить;
КонецПопытки;
КонецЦикла;
КонецЕсли;
ОбработкаПрерыванияПользователя();
КонецЦикла;
Состояние("URL адреса заполнены");
ExcelДокумент.Save();
ExcelДокумент.Close();
MSExcel.Quit();
В Excel проставить ссылки в нужные места достаточно просто, с помощью метода
Hyperlinks.Add(Ячейка,СтрокаURL,,)
Затем начинается самое интересное. Открываем Excel, видим что всё в нём хорошо, можно бы и напечатать и пересохранить в PDF. Да, но! необходимо помнить, что Excel в PDF просто так не сохраняет, по стути, происходит печать в PDF. И, как следствие, получившийся файл PDF будет выглядеть безобразно. Для того что бы этого не происходило, необходимо обработать Excel таким образом, что бы печать из него по умолчанию, без каких либо настроек принтера была верной.
В зависимости от задачи для этого можно установить в параметры печати "вписать все столбцы на одну страницу", установить узкие поля.
Пример кода:
MSExcel = Новый COMОбъект("Excel.Application");
MSExcel.Visible = ложь;
ExcelДокумент = MSExcel.WorkBooks.Open(ПутьКФайлу);
MySheet = ExcelДокумент.Worksheets(1);
MySheet.PageSetup .Zoom = False; //отключает фактический размер страницы
MySheet.PageSetup.FitToPagesWide = 1; //если поставить FitToPagesWide =1 и Zoom = False - будет "вписать лист на одну страницу", параметр FitToPagesTall в таком случае не использовать!
MySheet.PageSetup.FitToPagesTall = False; //если поставить FitToPagesWide =1 и Zoom = False и FitToPagesTall=False - будет "вписать все столбцы на одну страницу"
// а если поставить FitToPagesWide =1 и Zoom = False и FitToPagesTall=true - будет "вписать все строки на одну страницу"
///настройки "Разметка страницы - поля "узкие". Можно указывать и в сантиметрах, например, CentimetersToPoints(1,5)
/// вообще, с этими настройками можно поиграться пока файл не приобретет нужный вид
MySheet.PageSetup.LeftMargin = MSExcel.InchesToPoints(0.25); //левое
MySheet.PageSetup.RightMargin = MSExcel.InchesToPoints(0.25); //правое
MySheet.PageSetup.TopMargin = MSExcel.InchesToPoints(0.75); //верхнее
MySheet.PageSetup.BottomMargin = MSExcel.InchesToPoints(0.75); //нижнее
MySheet.PageSetup.HeaderMargin = MSExcel.InchesToPoints(0.3); //верх. колонтитул
MySheet.PageSetup.FooterMargin = MSExcel.InchesToPoints(0.3); //ниж. колонтитул
ФайлПДФ = СтрЗаменить(ПутьКФайлу, ".xlsx", ".pdf");
ExcelДокумент.ExportAsFixedFormat(0, ФайлПДФ , 0); //непосредственное сохранение в PDF. Первый параметр - тип файла (0= PDF), второй - путь к файлу и третий открывать файл после экспорта или нет
MSExcel.ActiveWorkbook.Close(0); //закрываем без записи изменений
MSExcel.Quit();
Подробно, с API и методами работы с MS Excel можно познакомиться на MSDN