Сценарии обработки PDF:
Для рендеринга PDF на основе html-страницы я использовал следующие два решения:
wkhtmltopdfэто командная строкаинструмент,Используется для преобразования HTML-страниц в PDF на основе Qt. Реализация механизма рендеринга WebKit.
Использование относительно простое:
## Распечатать статическую HTML-страницу в PDF
$ wkhtmltopdf input.html output.pdf
## Распечатать веб-страницу в PDF
$ wkhtmltopdf https://www.google.com output.pdf
wkhtmltopdf имеет множество параметров, например:
Поддерживает отправку HTTP-запросов на публикацию, подходит для рендеринга специально разработанных веб-страниц в файлы PDF:
$ wkhtmltopdf --help
...
--post <name> <value> Add an additional post field (repeatable)
...
Поддержка сценария JavaScript для изменения HTML перед рендерингом PDF:
$ wkhtmltopdf --run-script "javascript:(function(){document.getElementsByClassName('dom_class_name')[0].style.display = 'none'}())" page input.html output.pdf
Более подробные параметры можно посмотретьОфициальный документ сайта
Если вы используете язык Go, существует также сторонний пакет, инкапсулирующий wkhtmltopdf: go-wkhtmltopdf
chromedpэто своего родаGoбыстрее на языке,Более простой способ получить поддержкуChrome Пакет для браузеров на основе протокола DevTools без необходимости внешних зависимостей (таких как Selenium или PhantomJS).
Как использовать:
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
}
Известные мне инструменты, поддерживающие водяные знаки PDF, включают:
unidocПлатформа разработанаunipdfЭто использованиеGoнаписано на языкеPDFБиблиотека,Предоставьте шаблоны использования API и CLI.,Поддерживает следующие функции:
$ 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
$ 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 требуется платная лицензия.
pdfcpu Это библиотека обработки PDF, написанная на языке Go, предоставляющая для использования режимы API и CLI.
Поддерживает следующие функции:
$ 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:
$ pdfcpu watermark add -mode image 'voucher_watermark.png' 's:1 abs, rot:0' in.pdf out.pdf
Вызов API, чтобы добавить водяной знак
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)
}
cpdfЭто открытый исходный код и бесплатныйPDFкомандная строкаинструмент Библиотека,Имеет богатые функции,например:
Объединить PDF-файл:
$ cpdf -merge input1.pdf input2.pdf -o output.pdf
$ unipdf merge output.pdf input1.pdf input2.pdf
Объединить PDF-файл с помощью API,ссылкаunpdf github example
$ pdfcpu merge output.pdf input1.pdf input2.pdf
Примечание. pdfcpu поддерживает только файлы PDF версий ниже PDF V1.7.
## Разделить страницу за страницей в один PDF-файл
$ cpdf -split in.pdf 1 even -chunk 1 -o ./out%%%.pdf
## Разделить первую страницу
$ unipdf split input.pdf out.pdf 1-1
Разделить PDF с помощью API,ссылкаunipdf github examples
$ pdfcpu split in.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 вы получите некоторые инструменты, такие как:
mupdf
pdfdraw
pdfinfo
pdfclean
pdfextract
pdfshow
xpsdraw
вpdfdraw
Может использоваться для конвертации изображений
$ pdfdraw -o out%d.png in.pdf
Примечание. Mupdf не поддерживает Mac OS.
xpdfэто бесплатноPDFинструмент Сумка,Сумка括文字анализировать,Преобразование изображений,html конвертация и т.д.
Скачав пакет, вы сможете получить ряд инструментов:
pdfdetach
pdffonts
pdfimages
pdfinfo
pdftohtml
pdftopng
pdftoppm
pdftops
pdftotext
Из названия можно примерно понять полезность каждого инструмента.
## Конвертируйте pdf в png с помощью pdftopng
$ pdftopng in.pdf out-prefix
Мы часто сталкиваемся со сценарием, когда при чтении PDF-файла обнаруживается ошибка: файл зашифрован.
Но как решить эту проблему без пароля?
использоватьqpdfвыполнить принудительную расшифровку,В некоторых случаях расшифровка может быть успешной,Однако в некоторых случаях расшифровка может оказаться неудачной.
qpdf — инструмент PDF, поддерживающий командную строку
$ qpdf --decrypt in.pdf out.pdf
$ pdfcpu decrypt encrypted.pdf output.pdf
Если есть пароль, вы можете использовать его для расшифровки:
$ unipdf decrypt -p pass -o output.pdf input.pdf
Мы часто сталкиваемся с некоторыми сценариями, такими как определение того, является ли файл файлом PDF, идентификация текста в PDF, идентификация изображений в PDF и т. д.
Здесь xpdf используется для анализа текста в PDF, а затем для бизнес-анализа используются некоторые строковые операции или регулярные выражения.
xpdf/pdftotext
анализироватьpdfтекст в$ pdftotext input.pdf output.txt
unipdf
анализироватьpdfтекст в$ unipdf extract text input.pdf
Разобрать текст PDF с помощью API,ссылкаunipdf github examples
Все вышеперечисленное сначала анализирует текст PDF-файла, а затем обрабатывает его в соответствии с бизнесом.
Другой способ — проанализировать PDF-файл по координатам.,Этот подход более гибкий и универсальный.,использоватьдаpdflib/tet
## Введите набор координат для анализа данных в pdf по координатам.
$ tet --pageopt "includebox={{38 707.93 243.91 716.93}}" input.pdf
Координаты можно проанализировать с помощью tet для анализа PDF-файла и получения файла tetml, содержащего информацию о координатах:
$ 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
Некоторые PDF-файлы отображаются нормально при открытии на компьютере, но работают ненормально при обнаружении с помощью кода. Например, при попытке использовать стороннюю библиотеку для анализа (поврежденного) PDF-файла в Go:
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
}
}
После запуска вы получите такой результат:
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, мне нужно открывать их один за другим и сохранять как? Как я могу это терпеть? Так было бы здорово, если бы была функция пакетного восстановления?
После долгих поисков в Интернете я нашел примерно три решения:
Здесь я только проверил, что третий способ осуществим.,这里我использоватьmupdf-0.9-linux-amd64
这个版本руководить验证
После загрузки пакета,得到в一个可执行文件:pdfclean
$ 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 скрипт, пакетный ремонт и цель достигнута!
Иногда необходимо обеспечить единообразие текстовых шрифтов нескольких PDF-файлов.,Мне нужно проанализировать, какие шрифты используются в PDF.,这时候可以использовать
xpdf/pdffonts
руководить字体分析
$ 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
Это библиотека C++ с открытым исходным кодом, которая поддерживает создание PDF-файлов, объединение PDF-файлов, операции с текстовыми водяными знаками изображений и т. д.
Для gopher, чтобы использовать эту библиотеку, вам необходимо инкапсулировать слой кода CGO.
Это библиотека PDF, реализованная на языке Go, которую можно использовать для чтения информации в формате PDF, например чтения содержимого PDF/количества страниц/шрифтов и т. д. 具体可以ссылкадокумент
Было представлено так много сторонних библиотек, и все они разнообразны, каждая демонстрирует свои особые способности. Некоторые функции повторяются в большинстве библиотек. С какими проблемами вы столкнетесь при конкретном использовании, зависит от реальной ситуации.
Я надеюсь, что эти резюме будут полезны читателям.