Как XML преобразовать в PDF, WORD или TXT
Бесплатный PDF-конвертер
Редактируйте и преобразуйте PDF-файлы онлайн в браузере. Выберите нужный инструмент:
Отредактируйте PDF-файл
Редактировать PDF
Инструмент для редактирования PDF-файлов онлайн. Вы можете добавить или удалить текст, выделить предложение, вставить изображение и не только.
Объединить PDF
Наш инструмент позволяет объединять PDF-файлы в любом порядке.
Разделить PDF
Извлеките страницы или разбейте PDF-файл на несколько одностраничных документов.
Сортируйте и удаляйте страницы PDF-файла
Инструмент для сортировки страниц PDF-файла. Вы также можете удалить страницы из PDF-файла.
Повернуть страницы PDF-файла
Поворачивайте и сохраняйте страницы PDF-файла. Например, можно перевернуть изображения, отсканированные «вверх ногами».
Инструмент для создания PDF
Создайте пустой PDF и начните его наполнять.
Улучшайте PDF-файлы
Сжать PDF
Уменьшите размер PDF-файла онлайн. Доступны разные параметры сжатия.
Защитить PDF
Установите пароль на PDF. Выберите подходящий способ защиты файла.
Разблокировать PDF
Разблокируйте защищённый PDF-файл. Просто укажите пароль и мы снимем защиту с файла.
Изменить размер страниц PDF-файла
Измените формат листа PDF-файла, например, формат «letter» на A4.
Восстановить PDF
Попробуйте восстановить повреждённый PDF при помощи бесплатного инструмента. Спасите свои документы.
Оптимизировать PDF для веб
Этот мощный инструмент позволит оптимизировать PDF-файл для веб. Используйте «PDF для веб», чтобы упростить и ускорить публикацию PDF в сети.
Добавьте в PDF функцию поиска
Добавьте в PDF функцию поиска с помощью бесплатного инструмента для создания PDF. Ищите в тексте PDF ключевые слова, цифры и не только.
Конвертировать из PDF
Конвертировать из PDF
Универсальный инструмент для преобразования PDF-файлов в другие форматы.
PDF в Word
Преобразуйте PDF-файл в формат DOC или DOCX. Конвертер позволяет создавать и редактировать текстовые документы из PDF-файлов.
PDF в JPG
Этот конвертер позволяет извлечь изображение из PDF-файла и сохранить его в формате JPG.
PDF в PowerPoint
Простой и удобный инструмент для создания презентаций формата PPT и PPTX из PDF-файлов.
PDF в Excel
Преобразуйте PDF в XLS или Microsoft Excel в XLSX. С помощью этого конвертера вы можете создавать электронные таблицы из документов.
PDF в текстовый документ
Конвертируйте PDF в текстовые файлы. Функция OCR позволяет получить редактируемый текст даже из отсканированной книги в формате PDF.
Конвертировать в PDF
Конвертировать в PDF
Качественный конвертер для преобразования любых форматов в PDF.
Word в PDF
Конвертер позволяет преобразовать документы DOC и DOCX в файлы формата PDF.
JPG в PDF
Конвертер JPG в PDF с возможностью объединения нескольких JPG-файлов в один PDF.
Презентацию в PDF
Конвертер презентаций в PDF для преобразования файлов PPT или PPTX в формат PDF.
Excel в PDF
Преобразуйте Excel в PDF при помощи онлайн-конвертера. Создавайте PDF-файлы из таблиц формата XLS и XLSX.
EPUB в PDF
Конвертер EPUB в PDF для преобразования электронных книг в формат PDF.
DJVU в PDF
Бесплатный онлайн-инструмент для преобразования DJVU в PDF. Здесь можно преобразовать .djvu в документ PDF.
Оставайтесь на связи:
- Закладка
- Нравится 85k
- поделиться 2k
- твитнуть
Редактируйте и конвертируйте PDF-файлы онлайн
бесплатно в любом месте
Как пользоваться PDF2Go
Вы пришли на PDF2Go в поисках онлайн-редактора для PDF-файлов. То есть вы уже знаете, что хотите сделать с файлом. Вы можете преобразовать файл в PDF, повернуть страницы, объединить несколько файлов в один, добавить или удалить пароль и не только.
Выберите действие, которое хотите выполнить с PDF-файлом, и мы перенаправим вас на страницу с доступными функциями. Отредактируйте PDF онлайн, а всё остальное сделаем мы.
Да, это действительно просто!
Конвертируйте PDF-файлы онлайн
Конвертировать из PDF:
Конвертируйте PDF-файлы в документы MS Word, презентации или изображения.
Конвертировать в PDF:
Конвертировать изображения в формат PDF так же просто, как презентации или другие документы. Например, можно сделать PDF-файл из текстового документа в формате Word
Редактируйте PDF-файлы онлайн
Отредактировать PDF-документ — простая задача, требующая простого решения. PDF2Go позволяет редактировать PDF-файлы быстро и легко.
Поворачивайте, разделяйте и объединяйте PDF-файлы, уменьшайте их размеры и соотношения сторон — это удобно и просто. Вы также можете защитить PDF-файл паролем.
Ваши файлы в полной безопасности!
Все загружаемые файлы удаляются через 24 часа. Мы не делаем резервных копий. Наш сервис полностью автоматизирован, то есть все операции выполняются автоматически.
За вами сохраняются все авторские права и право собственности на файл. Ваши данные защищены от доступа третьих лиц, но вы можете делиться уникальной ссылкой на скачивание преобразованного документа.
Поддерживаемые форматы файлов
PDF, Microsoft Word, OpenOffice, TXT, RTF, EPUB и другие
Изображения:
JPG, PNG, BMP, TIFF, GIF, SVG и другие
Презентации:
PPT, PPTX, ODP и другие
PDF-редактор всегда с вами!
Название PDF2Go говорит само за себя. Вы можете конвертировать PDF-файлы в Word или поворачивать страницы документа на любом устройстве в любом браузере. Вам не надо ничего скачивать или устанавливать.
Редактируйте PDF-файлы в любом удобном для вас месте на компьютере, смартфоне или планшете — подойдёт любая операционная система, будь то Windows, Mac или Linux. Просто откройте браузер — и вперёд!
Конвертация текстовых документов в xml на С#
Недавно мне пришлось столкнуться с необходимостью достать текст из офисных документов (docx, xlsx, rtf, doc, xls, odt и ods). Задача осложнялась требованием представить текст в формате xml без мусора с максимально удобной для дальнейшего парсинга структурой.
Решение использовать Interop сразу отпало по причине его громоздкости, во многом избыточности, а также необходимости устанавливать на сервер MS Office. В результате, решение было найдено и воплощено на внутреннем проекте. Однако, поиск оказался настолько сложен и не тривиален в силу отсутствия каких-либо общедоступных мануалов, что мной было принято решение написать в свободное от работы время библиотеку, которая решала бы указанную задачу, а также создать написать что-то вроде инструкции, чтобы разработчики прочитав ее смогли, хотя бы поверхностно, разобраться в вопросе.
Прежде, чем перейти к описанию найденного решения, предлагаю ознакомиться с некоторыми выводами, которые были сделаны в результате моих изысканий:
- Для платформы .Net не существует какого-либо готового решения для работы со всеми перечисленными форматами, что заставит нас местами кастылизовывать наш солюшн.
- Не пытайтесь в сети найти хороший мануал по работе с Microsoft OpenXML: чтобы разобраться с этой библиотекой придется изрядно покрасноглазить, покурить StackOverflow и поиграться с отладчиком.
- Да, мне все таки, удалось приручить дракона.
Сразу оговорюсь, что в настоящий момент библиотека еще не готова, но она активно пишется (на столько, на сколько это позволяет свободное время). Предполагается, что будут написаны отдельные посты для каждого формата и параллельно, вместе с их публикацией, будет обновляться репозиторий на гитхабе, откуда можно будет получить исходники.
Работа с xlsx и docx
.xlsx
Наверняка, раз вы читаете эту статью, то уже в курсе, что docx и xlsx фактически являются zip-архивами, в которых лежит множество разных xml. Если нет, то убедиться в этом не составит труда: меняем расширение файла на zip и открываем любым архиватором. Так, наши листы документа будут лежать по следующему пути: xlworksheets .
У меня уже есть подготовленный excel документ, и, если открыть какой-нибудь лист по указанному ранее пути, то мы увидим примерно следующее содержимое:
Обратите внимание на то, что в ячейках, которые содержат формулы, записаны формулы (внутри тега <f> ) и результат (внутри тега <v> ). Также, ячейки с повторяющимся содержимым отмечены как shared и содержат ссылку на строку в файле sharedStrings.xml, расположенного по пути xl .
Пока просто имейте ввиду эти особенности: как обрабатывать их будет показано ниже.
Прежде, чем писать наши классы-конвертеры, создадим интерфейс IConvertable:
Теперь все наши классы, должны будут реализовывать два метода: string Convert(Stream stream) для работы с потоком (может быть очень полезным, если необходимо получить какую-то информацию из файла без его сохранения на хосте), а также string ConvertByFile(String path) для конвертации непосредственно файла.
Создаем класс XlsxToXml , реализующий интерфейс IConvertable и подключаем через Nuget DocumentFormat.OpenXml (на момент написания, актуальной являлась версия 2.10.0).
Логику обработки документа поместим в отдельный приватный метод string SpreadsheetProcess(Stream memStream) , который будет вызываться в string Convert(Stream stream) .
Как видно, сама логика реализована в методе *string SpreadsheetProcess(Stream memStream)* :
Итак, в методе string SpreadsheetProcess(Stream memStream) происходит следующее:
В блоке using открываем документ excel из потока. За работу с xlsx в библиотеке DocumentFormat.OpenXml отвечает класс SpreadsheetDocument.
Устанавливаем каретку в начало потока и создаем объект StringBuilder sb (сразу на 1000 символов. Используем StringBuilder вместо строк, чтобы несколько оптимизировать процесс и избежать порождения лишних сущностей в виде не нужных стрингов. Также, заранее задаем начальный размер стрингбилдера, чтобы немного сэкономить времени на инициализации и выделении памяти.
Выше я писал про shared ячейки (в которых хранятся повторяемые значения). Так вот, из объекта класса SpreadsheetDocument их можно получить так:
SharedStringTable sharedStringTable = doc.WorkbookPart.SharedStringTablePart.SharedStringTable .
Далее создаем переменную, в которой будет храниться номер листа и запускаем цикл
в котором выполняется обработка каждого листа с помощью вызываемого метода
WorkSheetProcess(sb, sharedStringTable, worksheetPart, doc, sheetIndex); :
Пожалуй, в данной функции больше всего вопросов вызывает строчка:
string sheetName = doc.WorkbookPart.Workbook.Descendants<Sheet>().ElementAt(sheetIndex).Name.ToString();
То, что таким образом мы получаем имя листа, думаю понятно. Но вот, чтобы добраться до нее придется воспользоваться отладчиком и методом научного тыка. Поэтому не стесняемся, ставим точку остановки, жмакаем shift+F9(или как там у вас), открываем переменную doc (в которой лежит наш документ)->WorkbookPart->Workbook и вызываем метод Descendants(), который вернет коллекцию всех дочерних элементов типа Sheet . Ну а дальше остается по индексу получить конкретный лист, вытащить его имя и преобразовать в строку (что и сделано в коде). Как это примерно выглядит показано на рисунке ниже:
Далее по коду в цикле foreach получаем данные из листа, которые представляют собой коллекцию строк. Если внутри объекта sheetData есть какие-то элементы, то это строки, каждую из которых мы обработаем методом RowProcess :
В методе void RowProcess(Row row, StringBuilder sb, SharedStringTable sharedStringTable) происходит следующее:
В цикле foreach (Cell cell in row.Elements<Cell>()) проверяем каждую ячейку на предмет наличия в ней записанной формулы:
Если формула обнаружена, то получаем значение, вычисленное по формуле ( cellValue = cell.CellValue.InnerText; ) и переходим к следующей ячейке.
Если ячейка не содержит формулы, то мы проверяем, является ли она shared: если является, то берем значение по индексу из ранее полученной коллекции с повторяющимися значениями:
В противном случае, мы просто получаем значение из ячейки.
.docx
Начнем с того, что парсинг документов word представляет из себя куда более не тривиальную задачу по сравнению с парсингом excel-файлов.
Так, разработчику предстоит решить проблему не только парсинга содержимого, но и сохранения структуры, что подразумевает, как минимум, сохранение абзацев, обработку списков и таблиц. Так как мои рабочие задачи не подразумевали обработку графики, сносок, оглавления и т.д., в данной статье они разобраны не будут, но, я не исключаю, что когда-нибудь мне придется столкнуться с такой задачей и, я обязательно обновлю и статью, и репозиторий.
Итак, для начала пара слов о внутреннем устройстве документа. Предлагаю снова проделать процедуру с переименованием расширения файла в zip и открыть его любым архиватором. Внутри мы увидим несколько папок. Открываем папку word и находим файл document. Да, внутри лежит еще куча файлов, но они, по большому счету, для решения нашей задачи не нужны. Однако, никто вам не запрещает в них поковыряться: вдруг вам потребуется вытащить какие-нибудь стили из документа.
Как мы видим, содержимое каждого абзаца находится внутри тега w:t, который лежит внутри w:r, который также находится внутри w:p. По большому счету, эта структура является ключевой для всех документов docx, независимо от их содержимого. Обратите внимание на списки: каждый элемент также находится внутри описанной структуры, но с добавлением тегов w:numPr, внутри которого определяется уровень вложенности списка (w:ilvl) и id списка, которому принадлежит данный элемент (w:numId).
Также, хочу обратить внимание, что индексы элементов списка не хранятся в виде значения в данном файле, а, как мне кажется (во всяком случае, других версий я не нашел), формируются динамически, в зависимости от id списка, которому принадлежит элемент, уровня вложенности и порядкового номера элемента.
Аналогичная история со вложенными списками, которые отличаются от простых списков лишь тем, что у них не нулевой уровень вложенности:
Более того, данная структура сохраняется и для таблиц. Правда теперь она упакована в теги w:tr (строка) и w:tc(ячейка).
Прежде, чем начать кодить, хочу обратить внимание на один очень важный ньюанс (да-да, как в анекдоте про Петьку и Василия Ивановича). При разборе списков, особенно это касается вложенных, может возникнуть ситуация, когда пункты списка разделены какой-то вставкой текста, изображения или вообще чего угодно. Тогда возникает вопрос, когда же нам ставить закрывающий тег списка? Мое предложение попахивая костылезацией и велосипедостроением сводится к добавлению словаря, ключами которого будут выступать id списков, а значение будет соответствовать id параграфа (да, оказывается каждый параграф в документе имеет свой уникальный id), который одновременно является последним в каком-то списке. Пожалуй, написано довольно сложно, но, думаю, когда посмотрите на реализацию, станет несколько понятнее:
Dictionary<int, string> listEl = new Dictionary<int, string>(); — словарь в котором будет храниться информация о последних элементах каждого из списков.
using (WordprocessingDocument doc = WordprocessingDocument.Open(memStream, false)) — создаем объект doc класса WordprocessingDocument, в котором находится содержимое нашего документа word, но уже в структурированном (на столько, на сколько это позволяет библиотека OpenXML) виде.
StringBuilder sb = new StringBuilder(1000); — наша будущая строка с легко читаемым содержимым в формате xml.
Body docBody = doc.MainDocumentPart.Document.Body; — получаем содержимое нашего документа, с которым мы дальше и будем работать
Вызываем функцию CreateDictList(listEl, docBody); , которая пробегается в цикле foreach по всем элементам документа, и ищет последний абзац для каждого списка:
GetFirstChild<ParagraphProperties>().GetFirstChild<NumberingProperties>().GetFirstChild<NumberingId>().Val; — написание подобного рода страшных конструкций является отнюдь не результатом штудирования документации (можете перейти на сайт мелкомягких https://docs.microsoft.com/ru-ru/office/open-xml/open-xml-sdk и попытаться раскурить их мануал), а представляет собой порождение научного тыка в режиме дебага. Если есть люди, которые владеют методологией изучения подобных библиотек с аналогичной детализацией документации, буду рад, если поделитесь своим опытом)
После того, как наш словарь создан, в цикле foreach перебираем все элементы в документе. На каждой итерации цикла выясняем к какому типу относится наш элемента: абзац или таблица. Если абзац, то мы должны произвести проверку, а не является ли наш абзац частью списка. И если он является элементом списка, то нужно выяснить в какой части списка находится данный абзац (начало, конец или середина) для того, чтобы корректно расставить открывающиеся и закрывающиеся теги для нашего списка. Помимо этого, также важно идентифицировать к какому именно списку относится наш элемент. В коде эта задача решается так:
Блок try-catch используется в связи с тем, что существует вероятность наличия в документе какого-то элемента, который не предусмотрен в блоке switch-case (в нашем случае, мы производим обработку только абзацев, списков и таблиц). Таким образом, если в документе есть что-то неопознанное и нами не предвиденное, то программа просто проигнорирует такой кейс.
Если элемент является частью списка, то он обрабатывается с помощью метода ListParagraph(sb, (Paragraph)element); :
По большому счету данный метод всего лишь упаковывает содержимое параграфа в теги <ul> , дополняя его информацией об id списка и уровне вложенности.
Если же, текущий элемент не является списком или таблицей, то он обрабатывается с помощью метода SimpleParagraph(sb, (Paragraph)element); :
То есть, содержимое текста просто оборачивается в тег <p>
Таблица обрабатывается в методе Table(sb, (Table)element); :
Обработка такого элемента вполне тривиальна: считываем строки, разбиваем на ячейки, из ячеек берем значения, оборачиваем в теги <cell> , которые запаковываем в в теги <row> и все это помещаем внутрь <table> .
На этом, поставленную задачу предлагаю считать решенной для документов формата docx и xlsx.
3 бесплатных программ для конвертации документов
Форматы ввода: CSV, DJVU, DOC, DOCX, EML, EPS, KEY, KEY.ZIP, MPP, MSG, NUMBERS, NUMBERS.ZIP, ODP, ODS, ODT, PAGES, PAGES.ZIP, PDF, PPS, PPSX, PPT , PPTX, PS, PUB, RTF, TXT, VSD, WKS, WPD, WPS, XLR, XLS, XLSX и XPS
2. FileZigZag
- Простой интерфейс и простой в использовании.
- Поддерживает размеры файлов до 180 МБ для зарегистрированных пользователей, 100 МБ для незарегистрированных.
- Регистрация не требуется.
- Возможность немедленно удалить оригинальный загруженный файл с сервера после конвертации.
- Преобразование файлов может быть намного медленнее, чем другие в этом списке.
- Зарегистрированные пользователи получают приоритет для конверсий.
- Адрес электронной почты необходим для получения преобразованных файлов.
- Невозможно конвертировать более одного файла одновременно.
Форматы ввода: ODT, SXW, DOC, RTF, XHTML, TXT, HTML, HTM, OTT, STW, SDW, SXC, ODS, XLS, OTS, STC, XLT, SDC, ODG, OTG, SDA, SXI, ODP, PDF , PPT, POT, STI, OTP, EPS, DOCX, DOCM, DOTX, DOTM, XLSB, XLSM, XLSX, XLTM, XLTX, PPTM, PPTX, POTM и POTX
Выходные форматы: CSV, DOC, EPS, HTML, ODG, ODP, ODS, ODT, OTG, OTP, OTS, OTT, PDF, POT, PPT, RTF, SDA, SDC, SDW, STC, STI, STW, SXC, SXD , SXI, SXW, TXT, VOR, XHTML, XLS и XLT
7 самых удобных конвертеров PDF
У этого сервиса простой и понятный интерфейс. Достаточно перетащить файл XLS, DOC, PPT, JPG, PNG, BMP, TIFF или GIF в поле для загрузки, и он будет конвертирован в PDF. Кроме того, можно превращать PDF в другие форматы. Готовые файлы сохраняются на ваш жёсткий диск либо в Dropbox или Google Drive.
В бесплатной версии можно делать только две операции в час. За 6 долларов в месяц вы сможете пользоваться сервисом без рекламы, а также обрабатывать сразу несколько PDF.
2. To PDF
Простенький сервис, способный превращать в PDF документы, презентации, электронные таблицы и изображения. Приятная возможность — одновременная конвертация нескольких (вплоть до 20) PDF. Готовые файлы сохраняются на ваш жёсткий диск в ZIP-архиве.
3. PDFCandy
PDFCandy может преобразовывать в PDF изображения, электронные книги и документы более 20 форматов: JPG, TIFF, EPUB, MOBI, FB2, CBR, CBZ, DOC, PPT, XLS, ODT и так далее.
Кроме того, сервис может обрезать, поворачивать, сортировать страницы, изменять размер PDF.
4. PDF.io
Симпатичный и очень простой сервис. Конвертирует документы, электронные таблицы и картинки в PDF и обратно. Помимо этого, вы сможете разделять, склеивать и сжимать готовые документы PDF, добавлять нумерацию страниц. Поддерживается загрузка файлов с жёсткого диска, по ссылке, а также из облачных хранилищ Dropbox или Google Drive.
5. PDF2Go
Универсальный инструмент, позволяющий редактировать и конвертировать PDF. Преобразовывает в PDF документы DOC, ODT, TXT, RTF, EPUB, картинки JPG, PNG, BMP, TIFF, GIF, SVG и презентации PPT и ODP. Встроенное распознавание текста может преобразовать в редактируемый файл даже PDF из склеенных изображений.
В числе прочих функций — сортировка и удаление страниц, изменение размера листа и восстановление повреждённых PDF.
В бесплатном варианте ограничен размер загружаемых файлов и доступ к некоторым функциям, а также показывается реклама. Подписка за 6 долларов в месяц устраняет эти неудобства.
6. iLovePDF
iLovePDF по большей части дублирует возможности предыдущих сервисов. С ним можно преобразовывать в PDF файлы Excel, Word, PowerPoint, а также различные изображения. Кроме того, сервис может сжимать, разделять, объединять PDF и накладывать на страницы ваш водяной знак — пригодится, если вы хотите защитить свои авторские права.
7. Free PDF Convert
Проверенный временем и чрезвычайно популярный сервис: у него аж 10 миллионов пользователей. Для конвертации достаточно перетащить документ в окно браузера и выбрать нужный формат. Можно также выбрать исходный файл из Dropbox или Google Drive либо загрузить его по ссылке.
Бесплатная версия сервиса ограничивает размер загружаемых документов. Решить проблему можно за 9 долларов в месяц.