いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-446 (PDF内から特定のテキストを検索)(ledongthuc/pdf)

関連記事

Goメモ-445 (PDFをページごとに分割)(pdfcpu) - いろいろ備忘録日記

GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ

概要

以下、自分用のメモです。忘れないうちにメモメモ。。。

ひょんなことからPDF内から特定のワードで検索してニョロニョロするという作業があったので、ついでにメモです。

ledongthuc/pdf というライブラリを知ったので、それのメモです。

rsc/pdf からのフォークとなっていて、元のやつにプレーンテキストでのコンテンツ取得とかの機能を追加してくれている模様。

今回の作業ではテキストコンテンツの中から対象のワードがあるかどうかを調べたかっただけなので、十分な機能でした。

サンプル

package main

import (
    "bytes"
    "flag"
    "io"
    "log"
    "os"

    "github.com/ledongthuc/pdf"
)

type (
    Args struct {
        inFile string
        word   string
    }
)

var (
    args Args
)

func init() {
    log.SetFlags(log.Lmicroseconds)

    flag.StringVar(&args.inFile, "in", "", "input file")
    flag.StringVar(&args.word, "word", "", "search word")
}

func main() {
    flag.Parse()

    if args.inFile == "" || args.word == "" {
        flag.PrintDefaults()
        os.Exit(1)
    }

    if err := run(); err != nil {
        log.Fatal(err)
    }
}

func run() error {
    var (
        file *os.File
        pdfR *pdf.Reader
        err  error
    )

    //
    // 暗号化されているPDFを開こうとすると
    //   malformed PDF: 256-bit encryption key
    // というエラーが出る
    //
    // 01.split-pages で利用した IPA の「安全なウェブサイトの作り方」のPDFは
    // ページ分割は出来るが、テキストを抽出しようとすると
    //   malformed PDF: 256-bit encryption key
    // と出て無理だった.
    //
    // サンプルなので、自前で適当に作成したPDFファイルで試す
    //
    file, pdfR, err = pdf.Open(args.inFile)
    if err != nil {
        return err
    }
    defer file.Close()

    var (
        buf bytes.Buffer
        r   io.Reader
    )
    r, err = pdfR.GetPlainText()
    if err != nil {
        return err
    }
    io.Copy(&buf, r)

    var (
        data = buf.Bytes()
        sep  = []byte(args.word)
        idx  = bytes.Index(data, sep)
    )

    if idx < 0 {
        log.Println("no hit.")
        return nil
    }

    log.Printf("hit: %d,%s", idx, data[idx:idx+len(sep)])

    return nil
}

上のコードのコメントにも記載していますが、暗号化されているPDFファイルの場合はエラーとなってしまうので注意。

サンプルは以下にアップしてあります。

try-golang-extlib/examples/singleapp/pdf/02.search-text at main · devlights/try-golang-extlib · GitHub

参考情報

github.com

Goのおすすめ書籍


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。