PDF Primitive
電話:03-5316-337503(5316)3375
info@trustss.co.jp
SAMPLE CODES

PDF Primitive サンプル コード

テキスト・画像・図形抽出のコード

C#およびC/C++開発環境向けのサンプルコード。

PDFからすべてのテキスト、画像、図形を抽出

ページ内の表示内容をPDFに記載された順ですべて抽出します。
そのため、抽出された文章に不適切な改行が含まれたり、段組みを適切に抽出できない場合があります。
これを避けるためには、抽出されたデータはの位置や境界などのデータと共に再構成する必要があります。

次の「領域を指定した抽出」では段組みなどの位置を指定できますので、レイアウト崩れのリスクを低減できます。

←いずれかをクリック 無償評価版とサンプルコードのダウンロード
PdfPrimitive/full-page.cs
using PDFTools.PdfStructure;

// ライブラリの初期化
using (var stc = new Structure())
// PDFファイルオープン
using (var prm = stc.GetPrimitiveInterface("input.pdf"))
// ページ指定
using (var page = prm.GetPageInterface(1/*先頭ページ*/))
{
    // ページからの抽出
    using (var cont = page.GetContentsInterface())
    {
        // 最初の文書内容オブジェクト
        AnyContentsObject obj = cont.GetFirstContentOject();
        while (obj != null)
        {
            switch (obj.ContentType)
            {
                case PrmContentType.PRM_CONTENT_UNKNOWN: goto next_proc;
                case PrmContentType.PRM_CONTENT_TEXT:  PrintTextData(obj);  break;
                case PrmContentType.PRM_CONTENT_IMAGE: PrintImageData(obj); break;
                case PrmContentType.PRM_CONTENT_PATH:  PrintPathData(obj);  break;
            }
            obj = cont.GetNextContentOject();
        }
    next_proc:;
    }
}
void PrintTextData(AnyContentsObject obj) {
    PrmTextContents d = obj.GetTextContents();
    if (!d.HasData) return;
    Console.WriteLine("テキスト");
    Console.WriteLine($"   Matrix[{d.Transform.ToString()}]");
    Console.WriteLine($"   BBox[{d.BBox.ToString(",()")}]");
    Console.WriteLine($"   Writeing mode[{d.WMode}]");
    Console.WriteLine($"   Drawing type[{d.DrawType}]");
    Console.WriteLine($"   Font[\"{d.FontName}\" size={d.FontSize}]");
    Console.WriteLine($"   Color[{d.Color.ToString(",()")}]");
    Console.WriteLine($"   StartPosition[({d.StartPosition.ToString(",", "x=", "y=")})]");
    int len = d.Text.Length;
    string C = "";
    if (len > 8) { len = 8; C = "..."; }
    Console.Write($"   Origins[");
    for (int i = 0; i < len; i++)
        Console.Write($"({d.Origins[i].ToString(",")})");
    Console.WriteLine($"{C}]");
    Console.WriteLine($"   \"{d.Text}\"");
}
void PrintImageData(AnyContentsObject obj)
{
    PrmImageContents d = obj.GetImageContents();
    if (!d.HasData()) return;
    Console.WriteLine("画像");
    Console.WriteLine($"   Matrix[{d.Transform.ToString()}]");
    Console.WriteLine($"   BBox[{d.BBox.ToString()}]");
    Console.WriteLine($"   Quad[{d.Quad.ToString(",(", true)}]");
    Console.WriteLine($"   Width={d.Width} Height={d.Height} Depth={d.Depth}");
    if (d.HasMask) Console.WriteLine($"   This image has mask[w={d.Mask.Width} h={d.Mask.Height}] Object[{d.Mask.Num} {d.Mask.Gen} R]");
    Console.WriteLine($"   Object[{d.ObjectNum.ToString()} R]");
}
void PrintPathData(AnyContentsObject obj)
{
    PrmPathContents d = obj.GetPathContents();
    if (!d.HasData) return;
    Console.WriteLine("パス");
    Console.WriteLine($"   Matrix[{d.Transform.ToString()}]");
    Console.WriteLine($"   BBox[{d.BBox.ToString(" ")}]");
    Console.WriteLine($"   Color[{d.Color.ToString(" ")}]");
    Console.WriteLine("   {0} Path{1}", d.DrawType, d.DrawType == PrmDrawType.Fill ? d.EvenOdd ? "(even-odd)" : "" : "");
    if (d.DrawType == PrmDrawType.Stroke || d.DrawType == PrmDrawType.ClipStroke)
    {
        Console.WriteLine($"   {d.LineToString()}");
        if (d.StrokeState.DashLen > 0)
        {
            Console.WriteLine($"   Dash=\"{d.DashToString()}\"");
        }
    }
    Console.WriteLine($"   Path=\"{d.Path}\"");
}
PdfPrimitive/full-page

このサンプルは、指定されたページに記載されたテキスト・画像・図形を記載された順にすべてを抽出しています。
そのため、段組みや表などで構成されたページから抽出する場合はレイアウトが崩れてしまいます。

次の「領域を指定した抽出」では、段組みされた部分や表の内部といった抽出ができますので、レイアウト崩れを低減できます。

PDFの指定された領域からテキスト、画像、図形を抽出

PDFページ内の指定された領域(BBox;境界)に記載されたものだけを抽出します。
段組みされたページや表で構成された部分を抽出に役立ちます。

すべてのテキスト・画像・図形を抽出」では、領域を指定せずにすべてを抽出します。

←いずれかをクリック 無償評価版とサンプルコードのダウンロード
PdfPrimitive/bbox-page.cs
using PDFTools.PdfStructure;

// ライブラリの初期化
using (var stc = new Structure())
// PDFファイルオープン
using (var prm = stc.GetPrimitiveInterface(in.pdf"))
// ページ指定
using (var page = prm.GetPageInterface(1/*先頭ページ*/))
{
    // ページのMediaBox
    BBox bbox = PrmGetPageMediaBox(paj);


    // ページからの抽出
    using (var cont = page.GetContentsInterface())
    {
        // 最初の文書内容オブジェクト
        bbox.y1 /= 2;    // 境界をページの上半分にする

        AnyContentsObject obj = cont.GetFirstContentOject(coj, bbox);
        while (obj != null)
        {
            switch (obj.ContentType)
            {
                case PrmContentType.PRM_CONTENT_UNKNOWN: goto next_proc;
                case PrmContentType.PRM_CONTENT_TEXT:  PrintTextData(obj);  break;
                case PrmContentType.PRM_CONTENT_IMAGE: PrintImageData(obj); break;
                case PrmContentType.PRM_CONTENT_PATH:  PrintPathData(obj);  break;
            }
            obj = cont.GetNextContentOject();
        }
    next_proc:;
    }
}
void PrintTextData(AnyContentsObject obj) {
    PrmTextContents d = obj.GetTextContents();
    if (!d.HasData) return;
    Console.WriteLine("テキスト");
    Console.WriteLine($"   Matrix[{d.Transform.ToString()}]");
    Console.WriteLine($"   BBox[{d.BBox.ToString(",()")}]");
    Console.WriteLine($"   Writeing mode[{d.WMode}]");
    Console.WriteLine($"   Drawing type[{d.DrawType}]");
    Console.WriteLine($"   Font[\"{d.FontName}\" size={d.FontSize}]");
    Console.WriteLine($"   Color[{d.Color.ToString(",()")}]");
    Console.WriteLine($"   StartPosition[({d.StartPosition.ToString(",", "x=", "y=")})]");
    int len = d.Text.Length;
    string C = "";
    if (len > 8) { len = 8; C = "..."; }
    Console.Write($"   Origins[");
    for (int i = 0; i < len; i++)
        Console.Write($"({d.Origins[i].ToString(",")})");
    Console.WriteLine($"{C}]");
    Console.WriteLine($"   \"{d.Text}\"");
}
void PrintImageData(AnyContentsObject obj)
{
    PrmImageContents d = obj.GetImageContents();
    if (!d.HasData()) return;
    Console.WriteLine("画像");
    Console.WriteLine($"   Matrix[{d.Transform.ToString()}]");
    Console.WriteLine($"   BBox[{d.BBox.ToString()}]");
    Console.WriteLine($"   Quad[{d.Quad.ToString(",(", true)}]");
    Console.WriteLine($"   Width={d.Width} Height={d.Height} Depth={d.Depth}");
    if (d.HasMask) Console.WriteLine($"   This image has mask[w={d.Mask.Width} h={d.Mask.Height}] Object[{d.Mask.Num} {d.Mask.Gen} R]");
    Console.WriteLine($"   Object[{d.ObjectNum.ToString()} R]");
}
void PrintPathData(AnyContentsObject obj)
{
    PrmPathContents d = obj.GetPathContents();
    if (!d.HasData) return;
    Console.WriteLine("パス");
    Console.WriteLine($"   Matrix[{d.Transform.ToString()}]");
    Console.WriteLine($"   BBox[{d.BBox.ToString(" ")}]");
    Console.WriteLine($"   Color[{d.Color.ToString(" ")}]");
    Console.WriteLine("   {0} Path{1}", d.DrawType, d.DrawType == PrmDrawType.Fill ? d.EvenOdd ? "(even-odd)" : "" : "");
    if (d.DrawType == PrmDrawType.Stroke || d.DrawType == PrmDrawType.ClipStroke)
    {
        Console.WriteLine($"   {d.LineToString()}");
        if (d.StrokeState.DashLen > 0)
        {
            Console.WriteLine($"   Dash=\"{d.DashToString()}\"");
        }
    }
    Console.WriteLine($"   Path=\"{d.Path}\"");
}
PdfPrimitive/bbox-page

このサンプルは、ページ内で指定された領域(BBox)に記載されたテキスト・画像・図形を記載された順に抽出しています。
段組みされたページや表などで構成されたページからの抽出でレイアウト崩れを低減できます。

すべてのテキスト・画像・図形を抽出」では、領域を指定せずにすべてを抽出します。

Pdftools SDK

PDFをPDF/Aに変換

PDFを最適化・サイズを適切に圧縮

画像をPDFに変換

PDFを画像に変換

PDFを合成・分割

PDFに電子署名・署名検証

セキュアで暗号化されたPDFを作成

PDF仕様との規格準拠検証

フォームフィールドの追加と内容入力

PDFへの内容追加と削除

PDFからの情報抽出

PDF生成

印刷用にレイアウト

アノテーション管理

メタデータ管理

PDFの編集

PDF/A 概要

PDF/A とは

PDF/A 概要

PDF/A 入門

10の最も重要なこと

ディジタルソースから

PDF/A処理

PDFA-2

PDFA-3


PDF Toolsライト

PDF Structure(構成)

PDF Imager-LP(画像変換)

PDF Primitive

PDF Metadata

PDF Stamper(電子印鑑)

PDF 構文解説-1

PDFファイル解析手順

PDFファイル構造 -概要-

PDFファイル構造

ドキュメント カタログ

ページツリー

ページ

Contentsオブジェクト

Articlesノード

デスティネーション

アクション(Actions)

テキスト

フォント


お問い合わせ

PDF 構文解説-2

ナビゲーション

XMP

メタデータ

文書情報

オブジェクト ストリーム

クロスリファレンス ストリーム

各種 ディクショナリ

アノテーション

インターラクティブフォーム

増加更新(Incremental Update)

電子署名(Digital Signature)

出力色特性(Output Intent)