Go Daily Library 149: библиотеки, связанные с обработкой PDF-файлов
Go Daily Library 149: библиотеки, связанные с обработкой PDF-файлов

Сценарии обработки PDF:

  • pdfрендеринг
  • PDF-проверка
  • водяной знак PDF
  • pdf получить номер страницы
  • PDF-объединить
  • PDF-разделение
  • Восстановить поврежденный PDF-файл
  • PDF в PNG
  • Определить шрифты в PDF
  • расшифровка pdf...

1. Рендеринг HTML-страницы PDF

Для рендеринга PDF на основе html-страницы я использовал следующие два решения:

  • wkhtmltopdf
  • chromedp
1. Используйте wkhtmltopdf для рендеринга PDF.

wkhtmltopdfэто командная строкаинструмент,Используется для преобразования HTML-страниц в PDF на основе Qt. Реализация механизма рендеринга WebKit.

Использование относительно простое:

Язык кода:javascript
копировать
## Распечатать статическую HTML-страницу в PDF
$ wkhtmltopdf input.html output.pdf

## Распечатать веб-страницу в PDF
$ wkhtmltopdf https://www.google.com output.pdf

wkhtmltopdf имеет множество параметров, например:

Поддерживает отправку HTTP-запросов на публикацию, подходит для рендеринга специально разработанных веб-страниц в файлы PDF:

Язык кода:javascript
копировать
$ wkhtmltopdf --help
...
--post <name> <value>           Add an additional post field (repeatable)
...

Поддержка сценария JavaScript для изменения HTML перед рендерингом PDF:

Язык кода:javascript
копировать
$ wkhtmltopdf --run-script "javascript:(function(){document.getElementsByClassName('dom_class_name')[0].style.display = 'none'}())" page input.html output.pdf

Более подробные параметры можно посмотретьОфициальный документ сайта

Если вы используете язык Go, существует также сторонний пакет, инкапсулирующий wkhtmltopdf: go-wkhtmltopdf

2. Используйте chromedp для рендеринга PDF.

chromedpэто своего родаGoбыстрее на языке,Более простой способ получить поддержкуChrome Пакет для браузеров на основе протокола DevTools без необходимости внешних зависимостей (таких как Selenium или PhantomJS).

Как использовать:

Язык кода:javascript
копировать
package main

import (
    "context"
    "io/ioutil"

    "github.com/chromedp/cdproto/page"
    "github.com/chromedp/chromedp"
    "errors"
)

func main(){
    err := ChromedpPrintPdf("https://www.google.com", "/path/to/file.pdf")
    if err != nil {
        fmt.Println(err)
        return
    }
}

func ChromedpPrintPdf(url string, to string) error {
    ctx, cancel := chromedp.NewContext(context.Background())
    defer cancel()

    var buf []byte
    err := chromedp.Run(ctx, chromedp.Tasks{
        chromedp.Navigate(url),
        chromedp.WaitReady("body"),
        chromedp.ActionFunc(func(ctx context.Context) error {
            var err error
            buf, _, err = page.PrintToPDF().
                Do(ctx)
            return err
        }),
    })
    if err != nil {
        return fmt.Errorf("chromedp Run failed,err:%+v", err)
    }

    if err := ioutil.WriteFile(to, buf, 0644); err != nil {
        return fmt.Errorf("write to file failed,err:%+v", err)
    }

    return nil
}

2. Добавьте водяной знак в PDF

Известные мне инструменты, поддерживающие водяные знаки PDF, включают:

  • unidoc/unipdf
  • pdfcpu
1.unidoc/unipdf

unidocПлатформа разработанаunipdfЭто использованиеGoнаписано на языкеPDFБиблиотека,Предоставьте шаблоны использования API и CLI.,Поддерживает следующие функции:

Язык кода:javascript
копировать
$ unipdf -h
...
Available Commands:
  decrypt     Decrypt PDF files
  encrypt     Encrypt PDF files
  explode     Explodes the input file into separate single page PDF files
  extract     Extract PDF resources
  form        PDF form operations
  grayscale   Convert PDF to grayscale
  help        Help about any command
  info        Output PDF information
  merge       Merge PDF files
  optimize    Optimize PDF files
  passwd      Change PDF passwords
  rotate      Rotate PDF file pages
  search      Search text in PDF files
  split       Split PDF files
  version     Output version information and exit
  watermark   Add watermark to PDF files
...

Добавить водяной знак в режиме CLI

Язык кода:javascript
копировать
$ unipdf watermark in.pdf watermark.png -o out.pdf

Watermark successfully applied to in.pdf
Output file saved to out.pdf

Добавить водяной знак с помощью API,Можно ссылаться напрямуюunipdf github example

Примечание. Для использования продуктов Unidoc требуется платная лицензия.

2.pdfcpu

pdfcpu Это библиотека обработки PDF, написанная на языке Go, предоставляющая для использования режимы API и CLI.

Поддерживает следующие функции:

Язык кода:javascript
копировать
$ pdfcpu help
...
The commands are:

   attachments list, add, remove, extract embedded file attachments
   changeopw   change owner password
   changeupw   change user password
   decrypt     remove password protection
   encrypt     set password protection
   extract     extract images, fonts, content, pages, metadata
   fonts       install, list supported fonts
   grid        rearrange pages or images for enhanced browsing experience
   import      import/convert images to PDF
   info        print file info
   merge       concatenate 2 or more PDFs
   nup         rearrange pages or images for reduced number of pages
   optimize    optimize PDF by getting rid of redundant page resources
   pages       insert, remove selected pages
   paper       print list of supported paper sizes
   permissions list, set user access permissions
   rotate      rotate pages
   split       split multi-page PDF into several PDFs according to split span
   stamp       add, remove, update text, image or PDF stamps for selected pages
   trim        create trimmed version of selected pages
   validate    validate PDF against PDF 32000-1:2008 (PDF 1.7)
   version     print version
   watermark   add, remove, update text, image or PDF watermarks for selected pages
...

Добавьте водяной знак как изображение с помощью инструмента CLI:

Язык кода:javascript
копировать
$ pdfcpu watermark add -mode image 'voucher_watermark.png' 's:1 abs, rot:0' in.pdf out.pdf

Вызов API, чтобы добавить водяной знак

Язык кода:javascript
копировать
package main

import (
    "github.com/pdfcpu/pdfcpu/pkg/api"
    "github.com/pdfcpu/pdfcpu/pkg/pdfcpu"
)

func main() {
    onTop := false
    wm, _ := pdfcpu.ParseImageWatermarkDetails("watermark.png", "s:1 abs, rot:0", onTop)
    api.AddWatermarksFile("in.pdf", "out.pdf", nil, wm, nil)
}

3. Объединение PDF-файлов

  • cpdf
  • unipdfc
  • pdfcpu
1. Используйте cpdf для объединения PDF-файлов.

cpdfЭто открытый исходный код и бесплатныйPDFкомандная строкаинструмент Библиотека,Имеет богатые функции,например:

  • Merge PDF files together, or split them apart
  • Encrypt and decrypt
  • Scale, crop and rotate pages
  • Read and set document info and metadata
  • Copy, add or remove bookmarks
  • Stamp logos, text, dates, page numbers
  • Add or remove attachments
  • Losslessly compress PDF files

Объединить PDF-файл:

Язык кода:javascript
копировать
$ cpdf -merge input1.pdf input2.pdf -o output.pdf
2. Используйте unipdf для объединения PDF-файлов.
Язык кода:javascript
копировать
$ unipdf merge output.pdf input1.pdf input2.pdf

Объединить PDF-файл с помощью API,ссылкаunpdf github example

3. Используйте pdfcpu для объединения PDF-файлов.
Язык кода:javascript
копировать
$ pdfcpu merge output.pdf input1.pdf input2.pdf

Примечание. pdfcpu поддерживает только файлы PDF версий ниже PDF V1.7.

4. Разделить PDF-файл

  • cpdf
  • unipdf
  • pdfcpu
1. Разделить PDF с помощью cpdf
Язык кода:javascript
копировать
## Разделить страницу за страницей в один PDF-файл
$ cpdf -split in.pdf 1 even -chunk 1 -o ./out%%%.pdf
2. Разделить PDF с помощью unipdf
Язык кода:javascript
копировать
## Разделить первую страницу
$ unipdf split input.pdf out.pdf 1-1

Разделить PDF с помощью API,ссылкаunipdf github examples

3. Разделить PDF с помощью pdfcpu
Язык кода:javascript
копировать
$ pdfcpu split in.pdf .

5. Конвертируйте PDF в изображение

  • mupdf
  • xpdf
1. Используйте mupdf для преобразования PDF в изображение.

MuPDF is a lightweight PDF, XPS, and E-book viewer. MuPDF consists of a software library, command line tools, and viewers for various platforms.

После загрузки mupdf вы получите некоторые инструменты, такие как:

Язык кода:javascript
копировать
mupdf
pdfdraw
pdfinfo
pdfclean
pdfextract
pdfshow
xpsdraw

вpdfdrawМожет использоваться для конвертации изображений

Язык кода:javascript
копировать
$ pdfdraw -o out%d.png in.pdf

Примечание. Mupdf не поддерживает Mac OS.

2. Используйте xpdf для преобразования PDF в изображение.

xpdfэто бесплатноPDFинструмент Сумка,Сумка括文字анализировать,Преобразование изображений,html конвертация и т.д.

Скачав пакет, вы сможете получить ряд инструментов:

Язык кода:javascript
копировать
pdfdetach
pdffonts
pdfimages
pdfinfo
pdftohtml
pdftopng
pdftoppm
pdftops
pdftotext

Из названия можно примерно понять полезность каждого инструмента.

Язык кода:javascript
копировать
## Конвертируйте pdf в png с помощью pdftopng
$ pdftopng in.pdf out-prefix

6. Расшифровка PDF

Мы часто сталкиваемся со сценарием, когда при чтении PDF-файла обнаруживается ошибка: файл зашифрован.

Но как решить эту проблему без пароля?

  • Расшифровать с помощью qpdf

использоватьqpdfвыполнить принудительную расшифровку,В некоторых случаях расшифровка может быть успешной,Однако в некоторых случаях расшифровка может оказаться неудачной.

qpdf — инструмент PDF, поддерживающий командную строку

Язык кода:javascript
копировать
$ qpdf --decrypt in.pdf out.pdf
  • Расшифровать с помощью pdfcpu
Язык кода:javascript
копировать
$ pdfcpu decrypt encrypted.pdf output.pdf

Если есть пароль, вы можете использовать его для расшифровки:

  • Расшифровать PDF с помощью unipdf
Язык кода:javascript
копировать
$ unipdf decrypt -p pass -o output.pdf input.pdf

7. Распознавание PDF-файлов

Мы часто сталкиваемся с некоторыми сценариями, такими как определение того, является ли файл файлом PDF, идентификация текста в PDF, идентификация изображений в PDF и т. д.

1. Распознать текст в формате PDF

Здесь xpdf используется для анализа текста в PDF, а затем для бизнес-анализа используются некоторые строковые операции или регулярные выражения.

  • использоватьxpdf/pdftotextанализироватьpdfтекст в
Язык кода:javascript
копировать
$ pdftotext input.pdf output.txt
  • использоватьunipdfанализироватьpdfтекст в
Язык кода:javascript
копировать
$ unipdf extract text input.pdf

Разобрать текст PDF с помощью API,ссылкаunipdf github examples

  • Разобрать pdfданные, используя информацию о координатах

Все вышеперечисленное сначала анализирует текст PDF-файла, а затем обрабатывает его в соответствии с бизнесом.

Другой способ — проанализировать PDF-файл по координатам.,Этот подход более гибкий и универсальный.,использоватьдаpdflib/tet

Язык кода:javascript
копировать
## Введите набор координат для анализа данных в pdf по координатам.
$ tet --pageopt "includebox={{38 707.93 243.91 716.93}}" input.pdf

Координаты можно проанализировать с помощью tet для анализа PDF-файла и получения файла tetml, содержащего информацию о координатах:

Язык кода:javascript
копировать
$ tet --tetml input.pdf

Конечно, вы также можете использовать некоторые другие методы для получения информации о координатах данных в PDF, например nodejs и т. д.

Уведомление: pdflib/tetЭто платное программное обеспечение,Но согласно официальному описанию документа, tet предоставляет базовые функции.,Нет необходимости приобретать лицензию для обработки PDF-файлов объемом не более 10 страниц или размером менее 1 МБ.

pdflib/tet提供了командная строкаинструменти на нескольких языкахsdkподдерживать,напримерC/C++/Java/.NET/Perl/PHP/Python/Ruby/Swift Но язык Go на данный момент не поддерживается, поэтому для gopher на данный момент есть только два варианта: CLI. OR CGO

8. Восстановите поврежденные PDF-файлы.

Некоторые PDF-файлы отображаются нормально при открытии на компьютере, но работают ненормально при обнаружении с помощью кода. Например, при попытке использовать стороннюю библиотеку для анализа (поврежденного) PDF-файла в Go:

Язык кода:javascript
копировать
import (
    "fmt"
    "github.com/rsc.io/pdf"
)

func main() {
    filePath := "path/to/your/broken.pdf"
    _, err := pdf.Open(filePath)
    if err != nil {
        fmt.Println("open pdf failed,err:", err.Error())
        return
    }
}

После запуска вы получите такой результат:

Язык кода:javascript
копировать
open pdf failed,err: malformed PDF: cross-reference table not found: {5 0 obj}<</Contents 6 0 R /Group <</CS /DeviceRGB /S /Transparency /Type /Group>> /MediaBox [0 0 595.27600098 841.89001465] /Parent 3 0 R /Type /Page>>

Компьютер включается нормально, но программа читает неправильно!

В настоящее время, если вы попытаетесь открыть PDF-файл на своем компьютере, сохранить его как новый PDF-файл, а затем использовать код для его обнаружения, вы обнаружите, что он был восстановлен!

Отлично, проблема решена!

Подождите, если у меня есть 1000 файлов PDF, мне нужно открывать их один за другим и сохранять как? Как я могу это терпеть? Так было бы здорово, если бы была функция пакетного восстановления?

После долгих поисков в Интернете я нашел примерно три решения:

  • использовать Acrobat SDK,вызовSDKвСохранить как функцию,Можно добиться эффекта открытия сохранения как на компьютере
  • использовать Ghostscript для восстановления PDF
  • использоватьmupdfруководитьpdfремонт

Здесь я только проверил, что третий способ осуществим.,这里我использоватьmupdf-0.9-linux-amd64这个版本руководить验证

После загрузки пакета,得到в一个可执行文件:pdfclean

Язык кода:javascript
копировать
$ pdfclean broken.pdf repaired.pdf

+ pdf/pdf_xref.c:160: pdf_read_trailer(): cannot recognize xref format: '%'
| pdf/pdf_xref.c:481: pdf_load_xref(): cannot read trailer
\ pdf/pdf_xref.c:537: pdf_open_xref_with_stream(): trying to repair

Судя по результатам вывода, mupdf попробовал восстановить обработку.

Получив новый PDF-файл, попробуйте открыть его с помощью предыдущего кода Go, и все будет нормально.

Осталось написать bash скрипт, пакетный ремонт и цель достигнута!

9. Определите информацию о шрифте PDF-файла.

Иногда необходимо обеспечить единообразие текстовых шрифтов нескольких PDF-файлов.,Мне нужно проанализировать, какие шрифты используются в PDF.,这时候可以использоватьxpdf/pdffontsруководить字体分析

Язык кода:javascript
копировать
$ pdffonts input.pdf
name                                 type              encoding         emb sub uni object ID
------------------------------------ ----------------- ---------------- --- --- --- ---------
NimbusSanL-Regu                      CID TrueType      Identity-H       yes no  yes     10  0
NimbusSanL-Bold                      CID TrueType      Identity-H       yes no  yes     20  0
Другое введение в Libiray:

Это библиотека C++ с открытым исходным кодом, которая поддерживает создание PDF-файлов, объединение PDF-файлов, операции с текстовыми водяными знаками изображений и т. д.

Для gopher, чтобы использовать эту библиотеку, вам необходимо инкапсулировать слой кода CGO.

Это библиотека PDF, реализованная на языке Go, которую можно использовать для чтения информации в формате PDF, например чтения содержимого PDF/количества страниц/шрифтов и т. д. 具体可以ссылкадокумент

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

Я надеюсь, что эти резюме будут полезны читателям.

ссылка:

boy illustration
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода