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

PDF Primitive サンプル コード

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

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

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

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

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

←いずれかをクリック
pdf-primitive-sample.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.ColorToString(",()")}]");
    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.ColorToString(" ")}]");
    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}\"");
}
pdf-primitive-sample

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

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

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

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

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

←いずれかをクリック
pdf-primitive-w-bbox-sample.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.ColorToString(",()")}]");
    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.ColorToString(" ")}]");
    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}\"");
}
pdf-primitive-w-bbox-sample

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

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

Pdftools SDK

PDFをPDF/Aに変換

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

画像をPDFに変換

PDFを画像に変換

PDFを合成・分割

PDFに電子署名・署名検証

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

PDF仕様との規格準拠検証

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

PDFへの内容追加と削除

PDFからの情報抽出

PDF生成

印刷用にレイアウト

アノテーション管理

メタデータ管理

PDFの編集

PDF Toolsライト

PDF Structure(構成)

PDF Imager-LP(画像変換)

PDF Primitive

PDF Metadata

PDF Stamper(電子印鑑)


お問い合わせ

PDF 構文解説

PDFファイル解析手順

PDFファイル構造 -概要-

PDFファイル構造

ドキュメント カタログ

ページツリー

ページ

Contentsオブジェクト

Articlesノード

デスティネーション

アクション(Actions)

テキスト

フォント

PDF 構文解説

ナビゲーション

XMP

メタデータ

文書情報

オブジェクト ストリーム

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

各種 ディクショナリ

アノテーション

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

増加更新(Incremental Update)

電子署名(Digital Signature)

出力色特性(Output Intent)