Установка гиперссылок в PDF

06.04.17

Интеграция - Внешние источники данных

Установка гиперссылок в PDF. Решение задачи по проставлению ссылок в файл PDF.

У многих возникала задача, когда необходимо в какую-либо печатную форму, сохраняемую в 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 

1С в PDF гиперссылки в PDF форматирование PDF форматирование Excel гиперссылки в Excel.

См. также

Перенос данных из Парус 8 в ЗГУ 3

Зарплата Внешние источники данных Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 8 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

84000 руб.

19.08.2020    22459    19    1    

22

Перенос данных из Парус 10 в ЗГУ ред.3

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Обмен между базами 1C Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 10 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

60000 руб.

05.10.2022    9217    9    8    

10

Перенос данных из Парус 7.хх в ЗГУ ред.3

Внешние источники данных Зарплата Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 7.хх учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

24000 руб.

24.04.2017    48712    96    163    

86

Перенос начальных остатков из Парус 7.71 в БГУ

Внешние источники данных Взаиморасчеты Учет ОС и НМА Логистика, склад и ТМЦ Бюджетный учет Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 2.0 1С:Бухгалтерия государственного учреждения Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Перенос словарей и начальных остатков из ПП Парус-Бухгалтерия Бюджет 7.71 в 1Сv8 БГУ2. Заполнение словарей и документов по вводу начальных остатков. Не требуется установка ПП Парус7. Возможна дозагрузка. Позволит автоматически и наиболее полно ввести данные в программу для начала работы. 

15600 руб.

08.12.2011    81578    128    123    

147

Перенос данных из Парус 10 (Торнадо) в ЗГУ ред.3 через Excel

Внешние источники данных Загрузка и выгрузка в Excel Зарплата Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате из Парус 10(Торнадо) учреждений через файлы Excel в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ). В принципе, обработка может быть использована для загрузки из файлов Excel, полученных из любых информационных систем.

24000 руб.

16.11.2018    30006    20    31    

21

Загрузка спецификаций в УНФ из системы Базис-мебельщик

Производство готовой продукции (работ, услуг) Внешние источники данных Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 Лесное и деревообрабатывающее хозяйство Россия Управленческий учет Платные (руб)

Обработка предназначена для загрузки файлов, выгруженных из системы Базис-мебельщик, в справочник "Спецификации" для последующих процессов учета и диспетчирования полуфабрикатов и изделий.

7200 руб.

24.06.2021    19133    52    50    

29
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Razrab1c 41 10.04.17 09:01 Сейчас в теме
Круто, очень полезно, спасибо!
В своей время на решение этой задачи убил уйму времени, шарясь по куче форумов, в том числе и зарубежных по Excel, собирая информацию по крупинкам.
BuhBuhov; +1 Ответить
8. Oleeeg 18.04.17 11:38 Сейчас в теме
Подскажите пожалуйста.
Не получается назначить гиперссылку картинке в ексель.
Собственно сама печатная форма сохраняется,
далее этот файл открывается из 1с, и при попытке назначить урл картинке:

MySheet.Hyperlinks.Add(MySheet.Shapes(1),"http://www.ya.ru/");

И подвисает все.
2. BuhBuhov 12.04.17 11:36 Сейчас в теме
Хорошая публикация.
Но возник вопрос. Если пользователь использует сочетание клавиш Ctrl+Break, то есть запустит процедуру ОбработкаПрерыванияПользователя(); то работа программы прервется и экземпляр Exel останется в памяти. Это конечно лучше чем зависшая наглухо программа, но мне просто любопытно, как автор борется с оставшимся в памяти процессом?
5. semenich_b 172 13.04.17 09:32 Сейчас в теме
(2) На УФ ctrl+break если не прописана обработка прерывания, работать не будет :)
Не пишите и не будет прерывания процесса.
3. sbcode 13 12.04.17 13:23 Сейчас в теме
Open(Libre) Office все умеет "из коробки".
Константин С.; +1 1 Ответить
4. semenich_b 172 13.04.17 09:31 Сейчас в теме
(3) А вы сами то пробовали работать "от пользователя" Open Office? Дерьмо, извиняюсь, это редкостное, большинство пользователей отказывается переходить с MS Office. Или всем параллельно ставить ещё и его?
Это раз. А во вторых, если внимательнее почитать публикацию, окажется, внезапно, что MS Office то же всё умеет "из коробки", просто этим нужно воспользоваться никаких дополнительных установок в статье нет.
6. sbcode 13 15.04.17 01:37 Сейчас в теме
(4)В смысле пробовал? Я на Libre уже 5 лет. MSO нет ни работе, ни дома. Я вам вообще ничего не предлагал, ни устанавливать, ни давать оценки тому чем не пользуетесь, ни обвинять меня, внезапно, в неумении читать. Либре, говорю, со ссылками нормально сохраняет. Не думал что от этой фразы вас так пронесет.
7. semenich_b 172 18.04.17 11:07 Сейчас в теме
(6)
ре, г

Простите, если задел. Не хотел никого обвинять/обижать.
з.ы. я всё таки за массовое решение. Но спасибо за инфу.
9. semenich_b 172 18.04.17 16:08 Сейчас в теме
а конкретно какой урл пытаетесь назначить? в статье, разумеется был от балды написан
10. geka-geka 3 11.05.17 15:33 Сейчас в теме
По-моему, все гораздо проще. Можно установить свойство ячейки "Гиперссылка".
Прикрепленные файлы:
12. Razrab1c 41 12.05.17 10:38 Сейчас в теме
(10) а вы попробуйте : ) потом расскажете результат : )
11. v3rter 11.05.17 15:48 Сейчас в теме
Или использовать range вместо shapes, во всяко случае в записанном макросе ворда используется range
Razrab1c; +1 Ответить
13. alex_1c_vedi 21.06.22 17:44 Сейчас в теме
Вариант рабочий. Но в нашем случае внешний вид сильно страдал.
Может кому поможет, использовали этот же подход, но сохраняли в html, а потом в нем заменяли текст ссылки на тег "ссылка"
"Ссылка";
14. METAL 289 31.08.22 21:06 Сейчас в теме
(13) Поделитесь наработками, пожалуйста, если сохранились
15. alex_1c_vedi 01.09.22 09:47 Сейчас в теме
(14)
Формируем стандартный табличный документ (печатную форму)
Поля, которые будут "кликабельными" ссылками Выводим в таком виде ""========"+СтрокаТЗ.Ссылка1+"========""
Сохраняем табличный документ в html ТабДокумент.Записать(ИмяФайла,ТипФайлаТабличногоДокумента.HTML5);
И новом документе делаем ссылки:
ДокЧтениеТекста = Новый ЧтениеТекста;
	//ДокЗаписьТекста = новый ЗаписьТекста;
	ДокЗаписьТекста = новый ТекстовыйДокумент;

	
	ДокЧтениеТекста.Открыть(ИмяФайла);
	
	ДлинаВставки = СтрДлина("========");
	
	Стр = ДокЧтениеТекста.ПрочитатьСтроку();
	Пока Стр <> Неопределено Цикл // строки читаются до символа перевода строки
		НашелНачало = СтрНайти(Стр,"========");
		Если НашелНачало Тогда
			НашелНачало = НашелНачало + ДлинаВставки;
			НашелКонец = СтрНайти(Стр,"========",НаправлениеПоиска.СКонца);
			СсылкаТекст = сред(Стр,НашелНачало,НашелКонец-НашелНачало);
			СсылкаИтог = "Ссылка";
			Стр = СтрЗаменить(Стр,"========"+СсылкаТекст+"========",СсылкаИтог);
		КонецЕсли;
		
		ДокЗаписьТекста.ДобавитьСтроку(Стр);
		
		Стр = ДокЧтениеТекста.ПрочитатьСтроку();
		
	КонецЦикла;
	
	
	ДокЧтениеТекста.Закрыть();
	
	ДокЗаписьТекста.Записать(ИмяФайла);
Показать
antonio_i; rozer; +2 Ответить
16. rozer 306 23.03.23 17:44 Сейчас в теме
отличное решение - а главное простое и надежное ибо a-href )
17. Dalglish 27 02.06.23 10:37 Сейчас в теме
Сформировал по вашему механизму PDF. Если открываю готовый файл на винде или андроиде - ссылка кликабельна, всё отлично. Но на продуктах Apple(iMac, iPhone) ссылка не работает, не нажимается(
Оставьте свое сообщение