Как программно открыть вложенный в pdf файл
Перейти к содержимому

Как программно открыть вложенный в pdf файл

  • автор:

как программно открыть PDF-файл, защищенный паролем?

Adobe IFilter не предоставляет механизма для предоставления пароля для открытия PDF-файла, защищенного паролем, поэтому его нельзя использовать для открытия файлов, защищенных паролем.

Мне было интересно, существует ли относительно простой способ программно получить фактические зашифрованные данные внутри файла PDF, расшифровать их с помощью стандартного API криптографии, а затем создать новый файл PDF с расшифрованными данными?

2 ответа

Чтобы открыть PDF-файл, защищенный паролем, вам необходимо разработать как минимум парсер, дешифратор и генератор PDF. Однако я бы не рекомендовал это делать. Это далеко не простая задача.

С помощью библиотеки PDF все намного проще. Вы можете попробовать библиотеку Docotic.Pdf для выполнения этой задачи (отказ от ответственности: я работаю на поставщика библиотека).

Вот пример для вашей задачи:

Если вы используете SpirePDF, вы можете получить изображения страниц из зашифрованного PDF-файла следующим образом:

Как программно открыть вложенный в pdf файл

Обзор C# библиотек для работы с PDF

topic image
На написание данной статьи меня подтолкнул топик HTML в PDF, правда по причине того, что он посвящен языку php, лично мне он был мало полезен, т.к. весь опыт работы с php у меня сводился в переводе нескольких скриптов на C#, поэтому я решил сделать небольшой обзор того, что доступно для работы с pdf по средствам языка C#.

Быстрый старт с помощью iTextSharp

var doc = new Document();
PdfWriter.GetInstance(doc, new FileStream (Application.StartupPath + @»\Document.pdf» , FileMode .Create));
doc.Open();
iTextSharp.text.Image jpg = iTextSharp.text.Image.GetInstance(Application.StartupPath + @»/images.jpg» );
jpg.Alignment = Element.ALIGN_CENTER;
doc.Add(jpg);
PdfPTable table = new PdfPTable(3);
PdfPCell cell = new PdfPCell( new Phrase( «Simple table» ,
new iTextSharp.text. Font (iTextSharp.text. Font .FontFamily.TIMES_ROMAN, 16,
iTextSharp.text. Font .NORMAL, new BaseColor(Color.Orange))));
cell.BackgroundColor = new BaseColor(Color.Wheat);
cell.Padding = 5;
cell.Colspan = 3;
cell.HorizontalAlignment = Element.ALIGN_CENTER;
table.AddCell(cell);
table.AddCell( «Col 1 Row 1» );
table.AddCell( «Col 2 Row 1» );
table.AddCell( «Col 3 Row 1» );
table.AddCell( «Col 1 Row 2» );
table.AddCell( «Col 2 Row 2» );
table.AddCell( «Col 3 Row 2» );
jpg = iTextSharp.text.Image.GetInstance(Application.StartupPath + @»/left.jpg» );
cell = new PdfPCell(jpg);
cell.Padding = 5;
cell.HorizontalAlignment = PdfPCell.ALIGN_LEFT;
table.AddCell(cell);
cell = new PdfPCell( new Phrase( «Col 2 Row 3» ));
cell.VerticalAlignment = PdfPCell.ALIGN_MIDDLE;
cell.HorizontalAlignment = PdfPCell.ALIGN_CENTER;
table.AddCell(cell);
jpg = iTextSharp.text.Image.GetInstance(Application.StartupPath + @»/right.jpg» );
cell = new PdfPCell(jpg);
cell.Padding = 5;
cell.HorizontalAlignment = PdfPCell.ALIGN_RIGHT;
table.AddCell(cell);
doc.Add(table);
doc.Close();

* This source code was highlighted with Source Code Highlighter .

Результат работы данного кода:
example

img-01.png

img-02.png

Открыть pdf на заданной странице
Здравствуйте. Как открыть pdf на определенной странице? Вот допустим я открываю так.

Как открыть *.doc или *.pdf на определенной странице
Необходимо из кода программы запустить документ *.doc или *.pdf, но в зависимости от условий.

Как по клику на кнопку, открыть вложенный PDF файл на определенной странице?

Как можно открыть вложенный документ именно на ОПРЕДЕЛЕННОЙ странице?

  • 22.09.2012
  • #2

Ответ: Как по клику на кнопку, открыть вложенный PDF файл на определенной странице?

teatral
Участник
  • 22.09.2012
  • #3

Ответ: Как по клику на кнопку, открыть вложенный PDF файл на определенной странице?

Возможно я не совсем точно выразился.
У меня в документе куча кнопок, каждая из которых должна открывать вложенный файл на своей странице.

  • 22.09.2012
  • #4

Ответ: Как по клику на кнопку, открыть вложенный PDF файл на определенной странице?

teatral
Участник
  • 23.09.2012
  • #5

Ответ: Как по клику на кнопку, открыть вложенный PDF файл на определенной странице?

Открытие файла пдф на сервере

1) Сервер и клиент физически разные компьютеры?
2) АдресКФайлуНаПК = "c:\123.pdf"; //Лежит на локальном компьютере
или
АдресКФайлуНаПК = "\\server\mydoc\123.pdf"; //Лежит в сети, доступен учетке от которой крутится 1с на сервере

В общем код должен быть примерно таким

&НаКлиенте
Процедура ПрочитатьФайлНаКлиенте()
Диалог=Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выберите файл PDF";
Диалог.ПолноеИмяФайла = "";
Диалог.ПредварительныйПросмотр = Истина;
//Диалог.Фильтр="" — тут свой формат pdf можете прописать
ВыбранФайл=Диалог.Выбрать();
Если ВыбранФайл Тогда
Файл=Новый Файл(Диалог.ПолноеИмяФайла);
ДД=Новый ДвоичныеДанные(Диалог.ПолноеИмяФайла);
Адрес=ПоместитьВоВременноеХранилище(ДД,УникальныйИдентификатор);
ЗагрузитьФайлНаСервере(Адрес);
КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ЗагрузитьФайлНаСервере(Адрес)

ДД=ПолучитьИзВременногоХранилища(Адрес);
Поток=ДД.ОткрытьПотокДляЧтения();
ЗаписьПДФ = Новый ЗаписьPDF();
ЗаписьПдф.Открыть(Поток);

(31) это все http запрос. выполняется все на сервере, как я понял.
Функция GetcustomersListGetCustomersList(Запрос)

ПутьКФайлыПодписанный = "\\192.168.50.104\обмен\contract_offer-29-51 — копия.pdf"; //пробовал закинуть в общую папку
//ДД = Новый ДвоичныеДанные("C:/Users/New/Desktop/contract.pdf"); // это получаю с пк
//КопироватьФайл("C:/Users/New/Desktop/contract_offer-29-51.pdf", ПутьКФайлыПодписанный);
Адрес = ПоместитьВоВременноеХранилище(ПутьКФайлыПодписанный);
ДанныеСертификата = ДанныеСертификата();
Штамп = Штамп(ДанныеСертификата.Наименование, ДанныеСертификата.ДанныеСертификата);
ПутьКаталога = КаталогВременныхФайлов() + ".pdf";

МенеджерКриптографии = Новый МенеджерКриптографии(ДанныеСертификата.ИмяПрограммы, "", ДанныеСертификата.ТипПрограммы);
МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = "145236";

ПодписьPDF = Новый ОписаниеПодписиPDF;
ПодписьPDF.Имя = "ПодписьДоговора";

ПодписьPDF.Сертификат = Новый СертификатКриптографии(ДанныеСертификата.ДанныеСертификата);
ПодписьPDF.ТипПодписи = ТипПодписиPDF.Сертифицирующая;
ПодписьPDF.БлокировкаДокумента = Истина;
ПодписьPDF.Верх = 5;
ПодписьPDF.Лево = 70;
ПодписьPDF.НомерСтраницы = 1;

ЗаписьPDF = Новый ЗаписьPDF();
ЗаписьPDF.Открыть(ПутьКаталога);
//
//ЗаписьPDF.ЗаписатьПодпись(МенеджерКриптографии, ПодписьPDF, Штамп);
//ЗаписьPDF.Закрыть();

Массив = Новый Массив;
Массив.Добавить("ываываыв");

ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Массив);
СтрокаДляОтвета = ЗаписьJSON.Закрыть();

Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-type", "application/JSON; charset=utf-8");
Ответ.УстановитьТелоИзСтроки(СтрокаДляОтвета, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Возврат Ответ;

В общем на каталог временных фалов тоже ругается.

НаборЗаписей = РегистрыСведений.БК_РегистрСведений1.СоздатьНаборЗаписей();
НаборЗаписей.Прочитать();
ИмяВремХранилища = КаталогВременныхФайлов() + "namefile.pdf";
Строка = НаборЗаписей[0];
ДвочиныйФайл = Строка.Файл.Получить();

Если ДвочиныйФайл <> Неопределено Тогда

(54) в общем сделал и то и то, не пашет. Текущий код:
НаборЗаписей = РегистрыСведений.БК_РегистрСведений1.СоздатьНаборЗаписей();
НаборЗаписей.Прочитать();

ИмяВремХранилища = КаталогВременныхФайлов() + "namefile.pdf";
Строка = НаборЗаписей[0];
ДвочиныйФайл = Строка.Файл.Получить();

Каталог = КаталогВременныхФайлов();
ИмяФайла = Строка(Новый УникальныйИдентификатор) + ".pdf";
ИмяПромеж = Каталог + ИмяФайла;
ДвочиныйФайл.Записать(ИмяПромеж);

ДанныеСертификата = ДанныеСертификата();
Штамп = Штамп(ДанныеСертификата.Наименование, ДанныеСертификата.ДанныеСертификата);

МенеджерКриптографии = Новый МенеджерКриптографии("Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider", "", 80);
МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = "145";

ПодписьPDF = Новый ОписаниеПодписиPDF;
ПодписьPDF.Имя = "ПодписьДоговора";
ПодписьPDF.Сертификат = Новый СертификатКриптографии(ДанныеСертификата.ДанныеСертификата);
ПодписьPDF.ТипПодписи = ТипПодписиPDF.Сертифицирующая;
//ПодписьPDF.БлокировкаДокумента = Истина;
//ПодписьPDF.Верх = 5;
//ПодписьPDF.Лево = 70;
//ПодписьPDF.НомерСтраницы = 1;

ЗаписьPDF = Новый ЗаписьPDF();
ЗаписьPDF.Открыть(ИмяПромеж);
ЗаписьPDF.ЗаписатьПодпись(МенеджерКриптографии, ПодписьPDF, Штамп);
ЗаписьPDF.Закрыть();

Массив = Новый Массив;
Массив.Добавить("ываываыв");

ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Массив);
СтрокаДляОтвета = ЗаписьJSON.Закрыть();

Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-type", "application/JSON; charset=utf-8");
Ответ.УстановитьТелоИзСтроки(СтрокаДляОтвета, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Возврат Ответ;

из ДД собираю док. Уже ОТКРЫВАЕТ но, не хочет записывать, права на папку и файлы я дал.
Вылетает при выполнении кодманды "ЗаписьPDF.ЗаписатьПодпись(МенеджерКриптографии, ПодписьPDF, Штамп);"
он создает файл. Сохраняет его отображает штамп. Но не доподписывает. подпись оставляет но при проверке пишет что подпись недействительна.
если это все подписывать обработкой то все норм. Кстати, после того как http сервис вываливает с этой ошибкой "Ошибка при вызове метода контекста (ЗаписатьПодпись)" . Нужно чистить кеш иначе даже обработка выдает ошибку 0х00000000 тип оне находит контейнер сетрификата.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *