PDFからすべてのテキスト、画像、図形を抽出
ページ内の表示内容をPDFに記載された順ですべて抽出します。
そのため、抽出された文章に不適切な改行が含まれたり、段組みを適切に抽出できない場合があります。
これを避けるためには、抽出されたデータはの位置や境界などのデータと共に再構成する必要があります。
次の「領域を指定した抽出」では段組みなどの位置を指定できますので、レイアウト崩れのリスクを低減できます。
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の指定された領域からテキスト、画像、図形を抽出
PDFページ内の指定された領域(BBox;境界)に記載されたものだけを抽出します。
段組みされたページや表で構成された部分を抽出に役立ちます。
「すべてのテキスト・画像・図形を抽出」では、領域を指定せずにすべてを抽出します。
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}\"");
}
このサンプルは、ページ内で指定された領域(BBox)に記載されたテキスト・画像・図形を記載された順に抽出しています。
段組みされたページや表などで構成されたページからの抽出でレイアウト崩れを低減できます。
「すべてのテキスト・画像・図形を抽出」では、領域を指定せずにすべてを抽出します。