Установка гиперссылок в 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.

См. также

Внешние источники данных Программист Бизнес-аналитик Пользователь Платформа 1С v8.3 Управляемые формы Анализ и прогнозирование Конфигурации 1cv8 Узбекистан Беларусь Кыргызстан Молдова Россия Казахстан Платные (руб)

Готовое решение для автоматической выгрузки данных из 1С 8.3 в базу данных ClickHouse, PostgreSQL или Microsoft SQL для работы с данными 1С в BI-системах. «Экстрактор данных 1С в BI» работает со всеми типовыми и нестандартными конфигурациями 1С 8.3 и упрощает работу бизнес-аналитиков. Благодаря этому решению, специалистам не требуется быть программистами, чтобы легко получать данные из 1С в вашей BI-системе.

28500 руб.

15.11.2022    21615    22    49    

39

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

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

84000 руб.

24.04.2017    51862    104    165    

91

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

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

120000 руб.

19.08.2020    25695    25    1    

27

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

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

84000 руб.

05.10.2022    11282    13    8    

15

Розничная торговля Внешние источники данных Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Бухгалтерский учет 1С:Бухгалтерия 3.0 Фармацевтика, аптеки Россия Бухгалтерский учет Платные (руб)

Внешняя обработка загрузки данных из файла-выгрузки, сформированного в программе F3 TAIL версии 3.4 (и выше) или еФарма версии 2.1, в базу конфигурации 1С: Бухгалтерия предприятия 8, ред. 3.0 (базовая, ПРОФ, КОРП, ФРЕШ).

13200 руб.

19.12.2016    47775    88    105    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Razrab1c 42 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 42 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 300 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 312 23.03.23 17:44 Сейчас в теме
отличное решение - а главное простое и надежное ибо a-href )
17. Dalglish 26 02.06.23 10:37 Сейчас в теме
Сформировал по вашему механизму PDF. Если открываю готовый файл на винде или андроиде - ссылка кликабельна, всё отлично. Но на продуктах Apple(iMac, iPhone) ссылка не работает, не нажимается(
Оставьте свое сообщение