Страницы

Поиск по вопросам

Показаны сообщения с ярлыком pdf. Показать все сообщения
Показаны сообщения с ярлыком pdf. Показать все сообщения

воскресенье, 8 марта 2020 г.

Загрузка pdf файла с сервера node [закрыт]

#pdf #nodejs


        
             
                
                    
                        
                            Закрыт. Этот вопрос необходимо уточнить или дополнить
подробностями. Ответы на него в данный момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Добавьте больше подробностей
и уточните проблему, отредактировав это сообщение.
                        
                        Закрыт 3 года назад.
                                                                                
           
                
        
У меня есть сайт, серверная часть которого написана на node.js. Как мне сделать так,
что бы клиенты могли загружать pdf файлы с сайта? 
    


Ответы

Ответ 1



Любое из: Отдавайте вебсервером перед NodeJS просто как статические файлы. Скажем, nginx и директива try_files попытается по адресу отдать статический файл в указанном месте, а если не удастся, передаст запрос куда-то ещё, в зависимости от настроек. Если вы используете другой вебсервер, не nginx, смотрите его документацию. В целом, отдавать статические файлы предпочтительно минуя NodeJS, поскольку это лишний расход ресурсов, когда есть вебсерверы, расходующие ресурсы для решения такой простой задачи куда эффективнее. Отдавайте обычным HTTP-ответом (взято отсюда, правда, это про mp3, для PDF придётся заменить Content-Type): http.createServer(function(request, response) { var filePath = path.join(__dirname, 'myfile.mp3'); var stat = fileSystem.statSync(filePath); response.writeHead(200, { 'Content-Type': 'audio/mpeg', 'Content-Length': stat.size }); var readStream = fileSystem.createReadStream(filePath); readStream.pipe(response); }) .listen(2000); Комбинация: отдать файл по указанию приложения через обратный прокси. Например, nginx и X-Accel-Redirect: когда возвращающийся через прокси ответ содержит этот заголовок, nginx вместо передачи ответа дальше отдаст его клиенту файл по указанному пути. В отличие от отдачи файлов просто nginx'ом, запрос всё же дойдёт до приложения, и приложение сможет решить, отдавать ли файл вообще (можно вкрутить авторизацию), и если да, то какой (по одному пути можно отдавать разным людям разные файлы). Но в отличие от полной обработки запроса приложением, получив заголовки, обратный прокси отсоединится от приложения и будет сам отправлять то, что ему сказали. Приложение тем временем, в зависимости от архитектуры, может заняться другим запросом от пользователя. Есть и модуль для Apache, оперирует заголовком X-SENDFILE.

пятница, 28 февраля 2020 г.

Генерация PDF файлов веб страницы c svg графикой?

#javascript #html #nodejs #svg #pdf


Какие есть библиотеки которые,  создают PDF документ из веб страницы?
Желательно на стороне сервера. Передаешь URL адрес и получаешь готовый PDF файл.

Что важно:


Все прокручиваемые элементы на странице должны раскрываться и попадать в отчёт полностью.
На каждой странице pdf должна оставаться шапка(фильтры).
PDF должен корректно создавать svg элементы.
Страницы PDF не должны обрезаться. Например: если  строки таблицы переносятся, то
полностью на новую страницу, а не обрезаются.


Из тех что нашел:
 - wkhtmltopdf

Есть ли решения аналогичные wkhtmltopdf?
    


Ответы

Ответ 1



Можешь посмотреть Puppeteer. Преимущества Puppeteer над wkhtmltopdf: Качество рендринга PDF выше (больший вес соответственно) Проще в использовании Использует хорошо поддерживаемое ПО (разработан Google) Использует меньше зависимостей от Elixir Минусы Puppeteer над wkhtmltopdf: Нужен nodeJS Больший вес файлов (около 90-100 мб) Решай сам, что тебе больше подходит.

Ответ 2



также есть принц. бесплатный вкорячивает свое лого в пдф.

среда, 26 февраля 2020 г.

Не получается сохранить pdf на стороне клиента

#javascript #php #pdf #blob #mpdf


Приходит ответ с сервера. в ответе pdf-файл (содержание обрезанное):



Формирую файл на сервере (Laravel):

public function getTaskOrderLabel (Request $request) {

  $mpdf = new \Mpdf\Mpdf($props);
  $mpdf->showImageErrors = true;

  $props = [
    //'debug' => true,
    'tempDir' => '/home/mpdf',
    'format' => [100,20],
    'margin_left' => 0,
    'margin_right' => 0,
    'margin_top' => 0,
    'margin_bottom' => 0,
    'margin_header' => 0,
    'margin_footer' => 0,
  ];

  foreach ($ptfe as $el) {

    // Наполняем данными
    // ...
    // Формируем стили

    $mpdf->WriteHTML($style, \Mpdf\HTMLParserMode::HEADER_CSS);
    $mpdf->WriteHTML($page, \Mpdf\HTMLParserMode::HTML_BODY);
    $mpdf->AddPage();
  }

  $mpdf->Output();

}


Сохраняю файл:

.then(response => {
  console.log(response.data);
  let file = new Blob([response.data], {type: 'application/pdf'});
  let fileURL = URL.createObjectURL(file);
  window.open(fileURL);
 })


Файл создаётся и сохраняется, но в нём нет данных, но есть количество страниц в документе.
В чём проблема?
    


Ответы

Ответ 1



В вашем случае в переменной response.data скорее всего содержится base64 строка с содержимым файла, так как у вас pdf-файл (бинарный), то и Blob объект нужно создавать из бинарных данных. Используйте параметр responseType для того чтобы указать в какой формат axios должен конвертировать ваш ответ от сервера. Ниже я привёл 2 варианта конвертации base64 в файл. Вариант 1) responseType: 'blob' - axios сам создаст Blob файл и запишет его в переменную response.data. Вариант 2) responseType: 'arraybuffer' - axios преобразует ответ в бинарные данные, объект ArrayBuffer и запишет его в переменную response.data. // use responseType: 'blob' axios({ url: 'http://localhost/download_pdf', method: 'GET', responseType: 'blob', // <-- }).then(response => { const blob_file = response.data; const file_url = URL.createObjectURL(blob_file); window.open(file_url); // open file in new tab }); // or use responseType: 'arraybuffer' axios({ url: 'http://localhost/download_pdf', method: 'GET', responseType: 'arraybuffer', // <-- }).then(response => { const url = window.URL.createObjectURL(new Blob([response.data])); const link = document.createElement('a'); link.href = url; link.setAttribute('download', 'custom_filename.pdf'); // set custom file name document.body.appendChild(link); link.click(); // force download file without open new tab }); // backend on the Laravel (for example) // file web.php Route::get('/download_pdf', function () { $filename = 'labels.pdf'; $pathToFile = public_path().'/'.$filename; return Response::make(file_get_contents($pathToFile), 200, [ 'Content-Type' => 'application/pdf', 'Content-Disposition' => 'inline; filename="'.$filename.'"' ]); }); // несколько ссылок с простыми pdf для тренировок // http://www.orimi.com/pdf-test.pdf // http://www.pdf995.com/samples/pdf.pdf // https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf // http://www.africau.edu/images/default/sample.pdf Подробнее.

понедельник, 24 февраля 2020 г.

Конвертировать текст на русском из pdf в txt python

#python #pdf


Пытаюсь конвертировать кирилицу из pdf в txt c помощью PyPDF2 в Python:

import PyPDF2
pdf_file = open('mail_cir.pdf', 'rb')
read_pdf = PyPDF2.PdfFileReader(pdf_file)
number_of_pages = read_pdf.getNumPages()
page = read_pdf.getPage(0)
page_content = page.extractText()
print (page_content.encode('utf-8'))


Ошибки не выдает, но и текст не видит.

Пыталась изменить:

 pdf_file = codecs.open('mail_cir.pdf', 'rb', encoding='utf-8')


Тогда выдается ошибка: 


  TypeError: Can't convert 'bytes' object to str implicitly


И другой вопрос:

Если конвертировать стих, то после окончания строки на пустом месте выводится \n
\n. Как избавиться от этих символов?
    


Ответы

Ответ 1



Можно воспользоваться PDFMiner, чтобы текст, включающий русские буквы, из pdf достать: #!/usr/bin/env python import sys import pdfminer.high_level # $ pip install pdfminer.six with open('mail_cir.pdf', 'rb') as file: pdfminer.high_level.extract_text_to_fp(file, sys.stdout) pdf2txt.py показывает как эта функция может быть использована—можно много опций передать. Ввод (в pdf) English 🇬🇧 На русском 🇷🇺 Smiley: ☺ non-BMP smiley: 😂 Вывод (текст в консоли) English На русском Smiley: ☺non-BMP smiley: Русский текст нормально извлёкся, но non-BMP смайлик 😂 (U+1F602) и флаги 🇬🇧 (U+1F1EC U+1F1E7), 🇷🇺 (U+1F1F7 U+1F1FA) потерялись при конвертации. Код с PyPDF2, похожий на приведённый в вопросе, смог извлечь только символы в ASCII диапазоне.

воскресенье, 16 февраля 2020 г.

Конвертировать текст на русском из pdf в txt python

#python #pdf


Пытаюсь конвертировать кирилицу из pdf в txt c помощью PyPDF2 в Python:

import PyPDF2
pdf_file = open('mail_cir.pdf', 'rb')
read_pdf = PyPDF2.PdfFileReader(pdf_file)
number_of_pages = read_pdf.getNumPages()
page = read_pdf.getPage(0)
page_content = page.extractText()
print (page_content.encode('utf-8'))


Ошибки не выдает, но и текст не видит.

Пыталась изменить:

 pdf_file = codecs.open('mail_cir.pdf', 'rb', encoding='utf-8')


Тогда выдается ошибка: 


  TypeError: Can't convert 'bytes' object to str implicitly


И другой вопрос:

Если конвертировать стих, то после окончания строки на пустом месте выводится \n
\n. Как избавиться от этих символов?
    


Ответы

Ответ 1



Можно воспользоваться PDFMiner, чтобы текст, включающий русские буквы, из pdf достать: #!/usr/bin/env python import sys import pdfminer.high_level # $ pip install pdfminer.six with open('mail_cir.pdf', 'rb') as file: pdfminer.high_level.extract_text_to_fp(file, sys.stdout) pdf2txt.py показывает как эта функция может быть использована—можно много опций передать. Ввод (в pdf) English 🇬🇧 На русском 🇷🇺 Smiley: ☺ non-BMP smiley: 😂 Вывод (текст в консоли) English На русском Smiley: ☺non-BMP smiley: Русский текст нормально извлёкся, но non-BMP смайлик 😂 (U+1F602) и флаги 🇬🇧 (U+1F1EC U+1F1E7), 🇷🇺 (U+1F1F7 U+1F1FA) потерялись при конвертации. Код с PyPDF2, похожий на приведённый в вопросе, смог извлечь только символы в ASCII диапазоне.

воскресенье, 26 января 2020 г.

iTextSharp, PDF, печать

#c_sharp #pdf #printing #itextsharp


Приветствую, коллеги.
Использую iTextSharp для генерации PDF-документов в своем проекте. Создаю акты и
счета-фактуры для бухгалтерии. 
В документах использую шрифт Tahoma, объявляю базовый шрифт таким образом:
private static void PrepareFonts()
{
    _baseTahoma = BaseFont.CreateFont("c:/windows/fonts/tahoma.ttf", BaseFont.IDENTITY_H,
BaseFont.EMBEDDED);
    _tahomaBold = new Font(_baseTahoma, 10, Font.BOLD);
    _tahoma = new Font(_baseTahoma, 10, Font.NORMAL);
    _tahoma16Bold = new Font(_baseTahoma, 18, Font.BOLD);
    _tahomaSmall = new Font(_baseTahoma, 8, Font.NORMAL);
}

Когда документ готов я запускаю печать файла, находя путь к Adobe Reader в реестре
и далее с помощью аргументов "/p /h" и пути к файлу запускаю на печать:
        RegistryKey adobe = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\App
Paths\AcroRd32.exe");

        if (adobe != null)
        {
            string path = adobe.GetValue("").ToString();

            GenerateDocuments();

            Process proc = new Process();

            proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            proc.StartInfo.Verb = "print";

            string pdfFileName = _invoice.FullName;

            proc.StartInfo.FileName = path;
            proc.StartInfo.Arguments = @"/p /h " + pdfFileName;
            proc.StartInfo.UseShellExecute = false;
            proc.StartInfo.CreateNoWindow = true;

            proc.Start();
            proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            if (proc.HasExited == false)
            {
                if (!proc.WaitForExit(5000))
                    proc.Kill();
            }

            proc.EnableRaisingEvents = true;
            proc.Close();
        }

Но напечатанный документ выходит вообще без каких-либо символов и без цифр. Только
линии таблиц есть на бумаге.
В ТЗ на проект написано, что должна использоваться "тихая печать", т.е. документы
создаются и печатаются по одной кнопке, т.е. чтобы не надо было заходить в Adobe Reader
и мухлевать в  "Параметрах печати", в том числе ставить галочку "Print as image".
Так вот если просто открыть документ и поставить "Print as image" в Advanced свойствах,
то все символы есть, а если делается "тихая печать", то их нет.
Кто-нибудь сталкивался с подобным? Как это возможно решать.
P.S. Во втором листинге метод GenerateDocuments как раз генерирует файлы, если Adobe
Reader вообще установлен на компьютере.
Пример файла, который должен быть распечатан по ссылке: http://ge.tt/2WCRmpS/v/0    


Ответы

Ответ 1



Все оказалось просто. Принтер Kyocera, на котором пытаюсь отпечатать, - старая модель. Не очень корректно воспринимает практически все шрифты. На новых моделях принтеров - все отлично, даже без "Print as image".

Открытие PDF файла в Android

#pdf #android #java


Здравствуйте!
Подскажите, пожалуйста, как можно открыть PDF файл внутри приложения, а не использовать
сторонние программы. В интернете много примеров, но они все одинаковые и открывают
pdf в сторонних программах, а мне нужно, чтобы pdf открылось внутри моего приложения. 
Может кто знает или делал?    


Ответы

Ответ 1



Используйте библиотеку iText

четверг, 23 января 2020 г.

c# jquery ajax сохранение pdf

#c_sharp #ajax #pdf


Имеется метод в контроллере, который возвращает FileContentResult:

return File(pdfBytes, "application/pdf", "DownloadName.pdf");


Проблема в том, как с помощью jquery ajax в клиентской части получить и сохранить
файл в формате pdf.
Как решить данную проблему?
    


Ответы

Ответ 1



Браузеры (и соответственно, jQuery) не умеют корректно сохранять файлы, приходящие в ответ на ajax-запрос. Если файл нужно отдавать в ответ на POST-запрос и нужно поддерживать старые браузеры, то единственный надежный вариант - делать обычный полноэкранный POST. Если файл нужно отдавать в ответ на GET-запрос, то достаточно просто заменить ajax вызов обычным GET-ом: window.location.href = <ссылка на файл>; Если в ответ на такое с сервера придет файл - он просто скачается, и пользователь останется на текущей странице. В более новых браузерах файл, пришедший в ответ на ajax, можно сохранить через FileAPI. На всякий случай проверьте таблицу поддержки FileAPI - вдруг вам нужно поддерживать какой-нибудь IE9. Решение через FileAPI (честно скопировано с enSO): var xhr = new XMLHttpRequest(); xhr.open('POST', url, true); xhr.responseType = 'arraybuffer'; xhr.onload = function () { if (this.status === 200) { var filename = ""; var disposition = xhr.getResponseHeader('Content-Disposition'); if (disposition && disposition.indexOf('attachment') !== -1) { var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/; var matches = filenameRegex.exec(disposition); if (matches != null && matches[1]) filename = matches[1].replace(/['"]/g, ''); } var type = xhr.getResponseHeader('Content-Type'); var blob = new Blob([this.response], { type: type }); if (typeof window.navigator.msSaveBlob !== 'undefined') { // IE workaround for "HTML7007: One or more blob URLs were revoked by closing the blob for which they were created. These URLs will no longer resolve as the data backing the URL has been freed." window.navigator.msSaveBlob(blob, filename); } else { var URL = window.URL || window.webkitURL; var downloadUrl = URL.createObjectURL(blob); if (filename) { // use HTML5 a[download] attribute to specify filename var a = document.createElement("a"); // safari doesn't support this yet if (typeof a.download === 'undefined') { window.location = downloadUrl; } else { a.href = downloadUrl; a.download = filename; document.body.appendChild(a); a.click(); } } else { window.location = downloadUrl; } setTimeout(function () { URL.revokeObjectURL(downloadUrl); }, 100); // cleanup } } }; xhr.send($.param(params));

Ответ 2



Схема с максимальной поддержкой браузеров Посылаешь запрос на сервер, в ответ скрипту приходит некий id и имя файла. Скрипт выполняет такое: window.location.href = 'http://some.site.ru/any/' + id + '/' + filename Сервер посылает файл, не забыв указать content-disposition: attachment Браузер скачивает файл, оставаясь на той же страницы. Почему имя файла url, а не в заголовке ответа? Потому что filename* понимают не все, энкодинг понимают не все, можно указать только одно из filename и filename*, иначе будет запрос пользователю про множественные файлы. В общем, проще упихать имя в url, чем разгребать, что за браузер послал запрос и каким заголовком на него ответить. На что ещё обратить внимание? У тебя pdf-файл. Это может оказаться существенным для хрома. Он считает себя особенным и пытается открывать pdf сам, даже если делается попытка открыть уже скачанный файл. Обязательно проверить, как современные хромы реагируют на вышеописанный способ.

Ищу библиотеку .NET для работы с PDF

#net #pdf


Необходимы следующие возможности:


Конвертация различных форматов в PDF: HTML, Word (doc/x), Excel
(xls/x), картинки (jpeg, tiff).
работа с Office форматами без установленного Office
Split-Merge документов


Из необязательного:


произвольная генерация PDF 
Просмотр PDF - PDF-Viewer
извлечение текста/каринок
можно комерческие решения


На что стоит посмотреть?
    


Ответы

Ответ 1



В "Управление пакетами NuGet" по запросу pdf, отображается замечательная библиотека от Apitron, так же для pdf есть библиотека от ABC, опять же ни-кто не отменял библиотеки самого Adobe Acrobat. Вопрос просто цены использования. Если нужно что то, вроде GNU или GPL тогда стоит подумать о Ghostscript. Для офиса, как уже говорили, стоит взглянуть в сторону OpenOffice.

Ответ 2



iTextSharp - хорошая библиотека! Но всех перечисленных задач она не выполнмит. docx UseOffice .Net Aspose

Ответ 3



Можно посмотреть на библиотеку PdfSharp. Библиотека для генерации pdf в .Net. Здесь находится документация в читаемом виде. Работа с office возможна в .Net из коробки. Необходимо добавить библиотеку вида Microsoft.Office.Interop.*.dll (Microsoft.Office.Interop.Excel.dll для Excel соответственно) в зависимости проекта. Скорее всего для конвертации форматов в PDF придётся их предварительно парсить.

суббота, 11 января 2020 г.

Преобразование SVG в векторные PDF,PS

#batik #pdf #php #imagemagick #svg


Добрый день, сообщество!
Что имеется: программно сформированный на сервере валидный SVG, внутри в основном
path. Серверный код на php, поэтому решение предпочтительно для php.
Что требуется: получить PDF, PS, а также PSD(по возможности) содержащие ВЕКТОРНЫЙ
рисунок такой же как в исходном SVG. В случае PDF это будет встроенный SVG, для остальных
не знаю.
Что пробовал: MagickWand(ImageMagick) - с удовольствием конвертирует, практически
что угодно и во что угодно, особенно удачно получается PNG (даже с прозрачностью).
Но есть одна большая проблема, которая все плюсы сводит на нет. При конвертации SVG
в PDF, EPS, PS, PSD, растрирует исходный рисунок.
Что уже посмотрел: но не совсем разобрался:
 1. Apache Batik, не совсем понятно как работать и что будет на выходе. Можно конечно
через exec запускать яву, но как к этому отнесется хостер, пока не известно.

Apache FOP, очень интересный инструмент, уже практически разобрался со всеми преобразованиями
и почти получил файл .fo, все примитивы преобразуются кроме, нужного path, которого,
почему-то не было в найденной схеме. И что дальше делать, снова exec и java?

В общем, может кто уже сталкивался с подобной темой, буду очень благодарен за инфу.    


Ответы

Ответ 1



Обратите внимание на TCPDF TCPDF является PHP-классом генерации PDF-документов, не требующим внешних расширений. Этот класс встраивает SVG непосредственно в векторном виде в PDF, но при желании можно и преобразовать его в растр с помощью того же ImageMagic. Пример использования класса. Пример полученного PDF-документа с SVG-графикой.

пятница, 10 января 2020 г.

Прослушивание PDF

#linux #pdf


Поставил сегодня "лучшую программу синтеза речи Festival, разрабатываемую в Центре
изучения речевых технологий в Эдинбургском университете (Шотландия). Она поддерживает
множество различных языков и голосов, может читать текст из файла либо из командной
строки и записывать результат синтеза в звуковой файл формата wav, включает в себя
плагин для pidgin, проговаривающий входящие сообщения":$sudo apt-get install festvox-ruИ
теперь мой кранч стал хорошо говорящим по русски:$ echo "Привет" | festival --language
russian --ttsИ можно прослушать книжку в текстовом формате:$ festival --language russian
--tts path/to/file.txtУ меня вопрос к тем, кто уже не первый день знаком с этой программой,
можно ли заставить читать ее pdf? (Если да, то как?)    


Ответы

Ответ 1



Думается, самый простой выход - это преобразовать pdf в txt, а затем прослушивать этот txt. В Linux это делается такpdftotext from to

Казахские буквы в iText

#java #pdf #itext


Пишу что-то вроде:

Document document = new Document(PageSize.A4, 50, 50, 50, 50);
BaseFont baseFont = BaseFont.createFont("Helv Kaz.ttf", "cp1251", BaseFont.EMBEDDED);
Font font = new Font(baseFont, Font.DEFAULTSIZE, Font.NORMAL);
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("test.pdf"));
document.open();
document.add(new Phrase("Жәбірейіл",font));
document.close();


В результате получаю, например, Жбірейіл вместо Жәбірейіл, что я делаю не так?
    


Ответы

Ответ 1



попробуй так : public static void main(String[] args) throws IOException, DocumentException { Document document = new Document(PageSize.A4, 50, 50, 50, 50); final String FONT = "c:/windows/fonts/arial.ttf"; BaseFont baseFont = BaseFont.createFont(FONT, BaseFont.IDENTITY_H, true); Font font = new Font(baseFont); PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("Z:/test.pdf")); document.open(); document.add(new Phrase("Жәбірейіл", font)); document.close(); }

четверг, 9 января 2020 г.

iText PDF: запись HTML в PDF в кодировке UTF-8

#java #pdf #itext


Задача: из переданного HTML создать что-то наподобие печати (в заданных координатах)
внутри существующего PDF-документа.
Я нашел два варианта перекидывания HTML в PDF. 
Первый метод createPdfUtf8() поддерживает UTF-8, но нет возможности задать координаты.
Второй метод createPdf() без возможности задать кодировку, но позволяет играть с координатами.
Нет ли возможности задать первому методу координаты или же второму кодировку? Спасибо.

public static void main(String[] args) throws IOException, DocumentException {
    String html_S = "ЗАО «ПК «Рога и Копыта»"
            + "
Сертифицирован
" + "
Сх. № ПР-RR-00011-18
" + "
от 10.04.2018
"; createPdfUtf8("C:\\1.pdf", html_S); } public static void createPdfUtf8(String file, String html_S) throws IOException, DocumentException { Document document = new Document(); PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file)); document.open(); XMLWorkerHelper worker = XMLWorkerHelper.getInstance(); InputStream is = new ByteArrayInputStream(html_S.getBytes("UTF-8")); worker.parseXHtml(writer, document, is, Charset.forName("UTF-8")); document.close(); } public static void createPdf(String file, String html_S) throws IOException, DocumentException { Document document = new Document(); PdfWriter.getInstance(document, new FileOutputStream(file)); document.open(); PdfPTable table = new PdfPTable(2); table.addCell("Some rich text:"); PdfPCell cell = new PdfPCell(); for (Element e : XMLWorkerHelper.parseToElementList(html_S, null)) { cell.addElement(e); } table.addCell(cell); document.add(table); document.close(); } Первый метод отрабатывает сейчас так:


Ответы

Ответ 1



Первый вариант не позволяет вам работать с "координатами" так как он парсит html страницу и конвертирует её в pdf. Второй же позволяет вам работать с таблицами и не как не с "координатами". А теперь к решению. Вынесите весь ваш html в отдельный файл и там уже форматируйте страницу как вам удобно. После чего конвертируйте её в pdf. Вот пример:
ЗАО «ПК «Рога и Копыта»
Сертифицирован

Сх. № ПР-RR-00011-18

от 10.04.2018
Сам метод создания pdf файла ничем не отличается, лишь тем что html content читается из файла. public static void createPdfUtf8(String file) throws IOException, DocumentException { Document document = new Document(); PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file)); document.open(); XMLWorkerHelper worker = XMLWorkerHelper.getInstance(); InputStream is = Main.class.getResourceAsStream("file.html"); worker.parseXHtml(writer, document, is, Charset.forName("UTF-8")); document.close(); } Результат

понедельник, 30 декабря 2019 г.

Как программно проверить наличие установленного Adobe Reader?

#c_sharp #pdf #com #windowsinstaller


У нас в программу встроен элемент управления Adobe Reader с помощью AcroPdfLib. Если
не стоит Adobe Reader, конструктор формы падает с ошибкой. Хотелось бы реализовать
такое поведение: если не установлен Adobe Reader, не открывать pdf-документ в нашей
программе, а предложить пользователю, сохранить его.
Еще лучшим вариантом было бы использование для отображения pdf-документов такой библиотеки,
которая не требует установки чего бы то ни было, чтобы можно было просто положить сборку
в дистрибутив - и всё работает.    


Ответы

Ответ 1



Проверка записи в реестре: RegistryKey adobe = Registry.LocalMachine.OpenSubKey("Software").OpenSubKey("Adobe"); if (adobe != null) { RegistryKey acrobatReader = adobe.OpenSubKey("Acrobat Reader"); if (acrobatReader != null) { // TODO: ... } } Проверка GUID для инсталлятора, если GUID известны: bool installed = codes.Any(guid => { var code = "{" + guid.ToString().ToUpper() + "}"; var state = MsiQueryProductState(code); return state == 3 || state == 5); }); Здесь codes - это guid для версий Acrobat Reader. Варианты просмотра pdf-файлов на C# без установленного софта от Adobe: View PDF files in C# using the Xpdf and muPDF library, Print PostScript. PDF Viewer Control Without Acrobat Reader Installed.

суббота, 21 декабря 2019 г.

Конвертация HTML в PDF средствами C#

#c_sharp #html #pdf


Имеется HTML-страница, состоящая из 3х таблиц(пустых), которые заполняются с помощью
JavaScript с определенной периодичностью(данные таблиц обновляются). Страница простматривается
с помощью WebBrowser в WPF приложениии. Необходимо сформировать PDF документ, в котором
будет содержимое страницы в определенный момент времени (заполненные таблицы). Какими
библиотеками это можно выполнить?

Пробовал выполнить 2мя способами первый через ExecWB

IOleServiceProvider sp = Browser.Document as IOleServiceProvider;
if (sp != null)
{
    Guid IID_IWebBrowserApp = new Guid("0002DF05-0000-0000-C000-000000000046");
    Guid IID_IWebBrowser2 = new Guid("D30C1661-CDAF-11d0-8A3E-00C04FC9E26E");
    const int OLECMDID_PRINT = 6;
    const int OLECMDEXECOPT_DONTPROMPTUSER = 2; const short PRINT_WAITFORCOMPLETION = 2;

    dynamic wb; 
    sp.QueryService(IID_IWebBrowserApp, IID_IWebBrowser2, out wb);
    if (wb != null)
    {
        wb.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, PRINT_WAITFORCOMPLETION,null,null);
    }
}


Вместо null-ов можно подставить in и out параметры, при попытке указать путь сохранения
получаю UnautorisedAccessException 

Второй способ через PdfSharp, но там я получаю в файле только ту часть WebBrowser,
которую вижу на экране, а не всю страницу целиком

Альтернативным решением может являться получение чистого Html файла, после выполнения
JavaScript 
    


Ответы

Ответ 1



Есть замечательный сервис для конвертации HTML в PDF средствами C#: http://wkhtmltopdf.org Так же есть небольшая библиотека для ускорения работы: https://github.com/codaxy/wkhtmltopdf Думаю сможете разобраться.

Ответ 2



Можете попробовать использовать библиотеку для c# iTextsharp, является портом с java itext. Библиотека имеет большой функционал, а так же поддерживает метод перегонки из HTML в PDF. Вот небольшой кусок моего кода, может поможет. html >

Акционерное общество «одуванчик»

Тема:

[THEME]

Выполнил:

[AUTHOR]

[CITY] [YEAR]г.

c# // Read in the contents of the html file... StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append(File.ReadAllText(@"..\..\TitlePage.html")); //string contents = File.ReadAllText(@"..\..\TitlePage.html"); // Replace the placeholders with the user-specified text stringBuilder = stringBuilder.Replace("[THEME]", theme); stringBuilder = stringBuilder.Replace("[AUTHOR]", authorName); stringBuilder = stringBuilder.Replace("[CITY]", plase); stringBuilder = stringBuilder.Replace("[YEAR]", year); // Step 4: Parse the HTML string into a collection of elements... //var parsedHtmlElements = HTMLWorker.ParseToList(new StringReader(contents), null); //Path to our font string arialuniTff = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "ARIALUNI.TTF"); //Register the font with iTextSharp iTextSharp.text.FontFactory.Register(arialuniTff); //Create a new stylesheet iTextSharp.text.html.simpleparser.StyleSheet ST = new iTextSharp.text.html.simpleparser.StyleSheet(); //Set the default body font to our registered font's internal name ST.LoadTagStyle(HtmlTags.BODY, HtmlTags.FACE, "Arial Unicode MS"); //Set the default encoding to support Unicode characters ST.LoadTagStyle(HtmlTags.BODY, HtmlTags.ENCODING, BaseFont.IDENTITY_H); List list = HTMLWorker.ParseToList(new StringReader(stringBuilder.ToString()), ST); foreach (var element in list) { doc.Add(element); } Сама библиотека https://sourceforge.net/projects/itextsharp/

пятница, 12 июля 2019 г.

Как PDF, полученный в Base64-строке открыть и распечатать?

Создаю на стороне сервера уже готовый отчёт PDF со средствами Jasperreports, и кодирую в Base64. Дальше передаю всё это клиенту.
В клиенте:

$.ajax({url: "reports/pdfCurStateByOwner", data: {p: document.getElementsByClassName('active')[0].dataset.idrju}, success: function (data) { console.log(data); //window.print(atob(data)); }, dataType: "text" })
Что я получаю: и сервер и console.log(data) выдают одинаковую строку, и с помощью онлайн декодеров base64 тоже проверил получил желанный pdf файл.
Теперь мне надо этот полученный байт-код распечатать и вот тут получаю не то, что получил в качестве данных, а всю страницу... Что делаю не так?


Ответ

Во-первых, вы совсем не «байт-код» с сервера отдаёте, а PDF, закодированный в BASE64-СТРОКУ. Во-вторых, вы получаете при распечатке именно то, что вызвали – а именно распечатку текущего окна. В-третьих, в функцию window.print() нельзя передать НИЧЕГО, т.к. она ничего не ожидает. Учитесь пользоваться документацией, пожалуйста.
РЕШЕНИЕ:
Современные обозреватели сети имеют ограничения безопасности на открытие всплывающих окон.
Для IE:
Согласно документации IE не поддерживает data:URL protocol для PDF. Поэтому в отличии от остальных для него следующий код работать не будет:
var newWin = window.open('data:application/pdf;base64,' + pdfInBase64, '_blank', 'width=500,height=300,menubar=yes,scrollbars=yes');
Также в IE действуют ограничения безопасности на открытие всплывающих окон. Обойти их очень непросто и поэтому для IE отдельное решение через navigator.msSaveOrOpenBlob
Для остальных обозревателей сети:
Для того, чтобы всплывающие окна открывались надо в адресной строке нажать на кнопку-оповещении о всплывающих окнах и выбрать выпадающее меню "Всегда разрешать всплывающие окна с «адрес в сети»". Такая кнопка появляется лишь тогда, если вы ещё такую кнопку для данной страницы не нажимали.
ИТАК РЕШЕНИЕ:
//pdfInBase64 соответствует «data» в строке «success: function (data)» var pdfInBase64 = 'JVBERi0xLjMKMyAwIG9iago8PC9UeXBlIC9QYWdlCi9QYXJlbnQgMSAwIFIKL1Jlc291cmNlcyAyIDAgUgovQ29udGVudHMgNCAwIFI+PgplbmRvYmoKNCAwIG9iago8PC9GaWx0ZXIgL0ZsYXRlRGVjb2RlIC9MZW5ndGggMzQ0Pj4Kc3RyZWFtCnicdZI7buRADERznaJOQDT/3VfYY9jBJrOJE1/fRQ1geIB1IomNalY9UoY/15JsfPIVrXg+VdZa+Ph72WmpQLXKVvy7/KRsR2mKGh5XrBBVlB2JQqwjmqhIiUAoOx9UqRzH+xVqsqbXlrBbu6llw+W4+xz088o7fbakoa2moe9zV7HENrx7wnSy762tmgxdLnXgc7zRbdIL7jVmTU8vat+un4DP7/9g6qGA0d0n3IM1Mzex2TRhqhIHOdEXzLaUIjfvjoWRvgNZW9pgDGfJas2h7ZYuZO6n1jkEm7oms/uakSQHZg2PM3zJTBY3Jocbt48RbOcMMw/5HK9rGcyfgL9ivk7ncbnWWPS+CexwJ82qRTesXXSxMkkdzOQ25y6XQa3b0Hb10Jr2/A7fG7Jlk7lp144ZLgfWIzLoJjszEcSTWqUB6atzdq3bhdkrXVzxupbB/ALY/Id+CmVuZHN0cmVhbQplbmRvYmoKMSAwIG9iago8PC9UeXBlIC9QYWdlcwovS2lkcyBbMyAwIFIgXQovQ291bnQgMQovTWVkaWFCb3ggWzAgMCA1OTUuMjggODQxLjg5XQo+PgplbmRvYmoKMiAwIG9iago8PAovUHJvY1NldCBbL1BERiAvVGV4dCAvSW1hZ2VCIC9JbWFnZUMgL0ltYWdlSV0KL0ZvbnQgPDwKPj4KL1hPYmplY3QgPDwKPj4KPj4KZW5kb2JqCjUgMCBvYmoKPDwKL1Byb2R1Y2VyIChGUERGIDEuNikKL0NyZWF0aW9uRGF0ZSAoRDoyMDA5MDUwODEyMjkxMSkKPj4KZW5kb2JqCjYgMCBvYmoKPDwKL1R5cGUgL0NhdGFsb2cKL1BhZ2VzIDEgMCBSCi9PcGVuQWN0aW9uIFszIDAgUiAvRml0SCBudWxsXQovUGFnZUxheW91dCAvT25lQ29sdW1uCj4+CmVuZG9iagp4cmVmCjAgNwowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDA1MDEgMDAwMDAgbiAKMDAwMDAwMDU4OCAwMDAwMCBuIAowMDAwMDAwMDA5IDAwMDAwIG4gCjAwMDAwMDAwODcgMDAwMDAgbiAKMDAwMDAwMDY4MiAwMDAwMCBuIAowMDAwMDAwNzU3IDAwMDAwIG4gCnRyYWlsZXIKPDwKL1NpemUgNwovUm9vdCA2IDAgUgovSW5mbyA1IDAgUgo+PgpzdGFydHhyZWYKODYwCiUlRU9GCg==';
var URL = window.URL || window.webkitURL, byteChars = atob(pdfInBase64), bytes = [], i = 0;
for (; i < byteChars.length; i++) bytes[i] = byteChars.charCodeAt(i);
var blob = new Blob([new Uint8Array(bytes)], {type: 'application/pdf'}); // создаём object URL из Blob var downloadUrl = URL.createObjectURL(blob);
if(window.navigator && window.navigator.msSaveOrOpenBlob) window.navigator.msSaveOrOpenBlob(blob); else { var newWin = window.open(downloadUrl, '_blank', 'width=500,height=300,menubar=yes,scrollbars=yes,status=yes,resizable=yes'); newWin.focus(); newWin.print();//чтобы эта строка сработала страница должна быть в сети, т.е. НЕ локально. URL.revokeObjectURL(downloadUrl); }
Этот код здесь через snippet не работает из-за ограничений в snippet. Пользователь @Other поделился поэтому ссылкой на этот пример на jsfiddle.net
Обратите внимание на то, что открытие в текущем окне при помощи перемены window.location или с помощью window.open вам не подойдёт, т.к. распечатать в этих окнах уже не получится, т.к. они в этом случае перезаписываются открываемой страницей.
Можете также посмотреть: PDF Reader на JavaScript от Мozilla. Но для этого нужен уже отдельный вопрос.

суббота, 27 апреля 2019 г.

Конвертировать текст на русском из pdf в txt python

Пытаюсь конвертировать кирилицу из pdf в txt c помощью PyPDF2 в Python
import PyPDF2 pdf_file = open('mail_cir.pdf', 'rb') read_pdf = PyPDF2.PdfFileReader(pdf_file) number_of_pages = read_pdf.getNumPages() page = read_pdf.getPage(0) page_content = page.extractText() print (page_content.encode('utf-8'))
Ошибки не выдает, но и текст не видит.
Пыталась изменить:
pdf_file = codecs.open('mail_cir.pdf', 'rb', encoding='utf-8')
Тогда выдается ошибка:
TypeError: Can't convert 'bytes' object to str implicitly
И другой вопрос:
Если конвертировать стих, то после окончания строки на пустом месте выводится

. Как избавиться от этих символов?


Ответ

Можно воспользоваться PDFMiner, чтобы текст, включающий русские буквы, из pdf достать:
#!/usr/bin/env python import sys import pdfminer.high_level # $ pip install pdfminer.six
with open('mail_cir.pdf', 'rb') as file: pdfminer.high_level.extract_text_to_fp(file, sys.stdout)
pdf2txt.py показывает как эта функция может быть использована—можно много опций передать.
Ввод (в pdf)
English 🇬🇧 На русском 🇷🇺 Smiley: ☺ non-BMP smiley: 😂
Вывод (текст в консоли)
English На русском Smiley: ☺non-BMP smiley:
Русский текст нормально извлёкся, но non-BMP смайлик 😂 (U+1F602) и флаги 🇬🇧 (U+1F1EC U+1F1E7), 🇷🇺 (U+1F1F7 U+1F1FA) потерялись при конвертации.

Код с PyPDF2, похожий на приведённый в вопросе, смог извлечь только символы в ASCII диапазоне.

пятница, 15 марта 2019 г.

c# jquery ajax сохранение pdf

Имеется метод в контроллере, который возвращает FileContentResult:
return File(pdfBytes, "application/pdf", "DownloadName.pdf");
Проблема в том, как с помощью jquery ajax в клиентской части получить и сохранить файл в формате pdf. Как решить данную проблему?


Ответ

Браузеры (и соответственно, jQuery) не умеют корректно сохранять файлы, приходящие в ответ на ajax-запрос.
Если файл нужно отдавать в ответ на POST-запрос и нужно поддерживать старые браузеры, то единственный надежный вариант - делать обычный полноэкранный POST.
Если файл нужно отдавать в ответ на GET-запрос, то достаточно просто заменить ajax вызов обычным GET-ом:
window.location.href = <ссылка на файл>;
Если в ответ на такое с сервера придет файл - он просто скачается, и пользователь останется на текущей странице.

В более новых браузерах файл, пришедший в ответ на ajax, можно сохранить через FileAPI. На всякий случай проверьте таблицу поддержки FileAPI - вдруг вам нужно поддерживать какой-нибудь IE9.
Решение через FileAPI (честно скопировано с enSO):
var xhr = new XMLHttpRequest(); xhr.open('POST', url, true); xhr.responseType = 'arraybuffer'; xhr.onload = function () { if (this.status === 200) { var filename = ""; var disposition = xhr.getResponseHeader('Content-Disposition'); if (disposition && disposition.indexOf('attachment') !== -1) { var filenameRegex = /filename[^;=
]*=((['"]).*?\2|[^;
]*)/; var matches = filenameRegex.exec(disposition); if (matches != null && matches[1]) filename = matches[1].replace(/['"]/g, ''); } var type = xhr.getResponseHeader('Content-Type');
var blob = new Blob([this.response], { type: type }); if (typeof window.navigator.msSaveBlob !== 'undefined') { // IE workaround for "HTML7007: One or more blob URLs were revoked by closing the blob for which they were created. These URLs will no longer resolve as the data backing the URL has been freed." window.navigator.msSaveBlob(blob, filename); } else { var URL = window.URL || window.webkitURL; var downloadUrl = URL.createObjectURL(blob);
if (filename) { // use HTML5 a[download] attribute to specify filename var a = document.createElement("a"); // safari doesn't support this yet if (typeof a.download === 'undefined') { window.location = downloadUrl; } else { a.href = downloadUrl; a.download = filename; document.body.appendChild(a); a.click(); } } else { window.location = downloadUrl; }
setTimeout(function () { URL.revokeObjectURL(downloadUrl); }, 100); // cleanup } } };
xhr.send($.param(params));

суббота, 9 марта 2019 г.

Преобразование SVG в векторные PDF,PS

Добрый день, сообщество! Что имеется: программно сформированный на сервере валидный SVG, внутри в основном path. Серверный код на php, поэтому решение предпочтительно для php. Что требуется: получить PDF, PS, а также PSD(по возможности) содержащие ВЕКТОРНЫЙ рисунок такой же как в исходном SVG. В случае PDF это будет встроенный SVG, для остальных не знаю. Что пробовал: MagickWand(ImageMagick) - с удовольствием конвертирует, практически что угодно и во что угодно, особенно удачно получается PNG (даже с прозрачностью). Но есть одна большая проблема, которая все плюсы сводит на нет. При конвертации SVG в PDF, EPS, PS, PSD, растрирует исходный рисунок. Что уже посмотрел: но не совсем разобрался: 1. Apache Batik, не совсем понятно как работать и что будет на выходе. Можно конечно через exec запускать яву, но как к этому отнесется хостер, пока не известно. Apache FOP, очень интересный инструмент, уже практически разобрался со всеми преобразованиями и почти получил файл .fo, все примитивы преобразуются кроме, нужного path, которого, почему-то не было в найденной схеме. И что дальше делать, снова exec и java? В общем, может кто уже сталкивался с подобной темой, буду очень благодарен за инфу.


Ответ

Обратите внимание на TCPDF TCPDF является PHP-классом генерации PDF-документов, не требующим внешних расширений. Этот класс встраивает SVG непосредственно в векторном виде в PDF, но при желании можно и преобразовать его в растр с помощью того же ImageMagic. Пример использования класса. Пример полученного PDF-документа с SVG-графикой.

пятница, 1 марта 2019 г.

iText PDF: запись HTML в PDF в кодировке UTF-8

Задача: из переданного HTML создать что-то наподобие печати (в заданных координатах) внутри существующего PDF-документа. Я нашел два варианта перекидывания HTML в PDF. Первый метод createPdfUtf8() поддерживает UTF-8, но нет возможности задать координаты. Второй метод createPdf() без возможности задать кодировку, но позволяет играть с координатами. Нет ли возможности задать первому методу координаты или же второму кодировку? Спасибо.
public static void main(String[] args) throws IOException, DocumentException { String html_S = "ЗАО «ПК «Рога и Копыта»" + "
Сертифицирован
" + "
Сх. № ПР-RR-00011-18
" + "
от 10.04.2018
";
createPdfUtf8("C:\\1.pdf", html_S);
} public static void createPdfUtf8(String file, String html_S) throws IOException, DocumentException { Document document = new Document(); PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file)); document.open();
XMLWorkerHelper worker = XMLWorkerHelper.getInstance(); InputStream is = new ByteArrayInputStream(html_S.getBytes("UTF-8")); worker.parseXHtml(writer, document, is, Charset.forName("UTF-8")); document.close();
}
public static void createPdf(String file, String html_S) throws IOException, DocumentException { Document document = new Document(); PdfWriter.getInstance(document, new FileOutputStream(file)); document.open();
PdfPTable table = new PdfPTable(2); table.addCell("Some rich text:"); PdfPCell cell = new PdfPCell(); for (Element e : XMLWorkerHelper.parseToElementList(html_S, null)) { cell.addElement(e); } table.addCell(cell); document.add(table); document.close(); }
Первый метод отрабатывает сейчас так:


Ответ

Первый вариант не позволяет вам работать с "координатами" так как он парсит html страницу и конвертирует её в pdf. Второй же позволяет вам работать с таблицами и не как не с "координатами". А теперь к решению.
Вынесите весь ваш html в отдельный файл и там уже форматируйте страницу как вам удобно. После чего конвертируйте её в pdf. Вот пример:

ЗАО «ПК «Рога и Копыта»
Сертифицирован

Сх. № ПР-RR-00011-18

от 10.04.2018

Сам метод создания pdf файла ничем не отличается, лишь тем что html content читается из файла.
public static void createPdfUtf8(String file) throws IOException, DocumentException { Document document = new Document(); PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file)); document.open();
XMLWorkerHelper worker = XMLWorkerHelper.getInstance(); InputStream is = Main.class.getResourceAsStream("file.html"); worker.parseXHtml(writer, document, is, Charset.forName("UTF-8")); document.close(); }
Результат