を私は素早く答えを持っていないが、私は最後の2週間費やしてきました成功したこの正確な問題を解決します。私はApache PDFBoxを使ってPDFテキストをTextPositionsに抽出しました。これらのTextPositionsには、テキスト内の各文字に関する情報(位置、太字、斜体、フォントなど)が含まれています。この情報を使用して、すべての表要素の境界ボックスを設定し、テキスト整列、列メンバーシップなどのデシファーの項目を設定してから、PDFページを再作成し、1000行未満のコードでExcelの表を再作成しました。
チェックボックスのようなグラフィック要素を抽出する必要はありませんでしたが、Apache PDFBoxはCOSStreamsに抽出します。グラフィックスやフォーム要素はこれらのストリームから解析される可能性があります。私のコードはあなたが示したテーブルを再構築することができ、チェックボックスと背景色が不足しているだけです。
私は単純な解決策を探していましたが、これは簡単な方法ではありません。
編集:これがあなたを納得させることができなかった場合は、開始方法を教えてください。まず、PDFTextStripperまたはPDFTextStripperByAreaのいずれかを拡張します。これにより、processTextPositionオーバーライドを介してTextPositionにアクセスできます。次のコードは、TextPositionsを自分のカスタムクラスTextCharにどのように変換したかを示しています。私は、基本的なコンテキスト情報を動作するように相対textpositionsを使用します。
public class PDFStripper : PDFTextStripper
{
private List<TextChar>[] tcPages;
public PDFStripper(java.util.List pages)
{
int pagecount = pages.size();
tcPages = new List<TextChar>[pagecount+1];
base.processPages(pages);
}
protected override void processTextPosition(TextPosition tp)
{
PDGraphicsState gs = getGraphicsState();
TextChar tc = BuildTextChar(tp, gs);
int currentPageNo = getCurrentPageNo();
if (tcPages.ElementAtOrDefault(currentPageNo) == null)
{
tcPages[currentPageNo] = new List<TextChar>();
}
tcPages[currentPageNo].Add(tc);
}
private static TextChar BuildTextChar(TextPosition tp, PDGraphicsState gstate)
{
TextChar tc = new TextChar();
tc.Char = tp.getCharacter()[0];
float h = (float)Math.Floor(tp.getHeightDir());
tc.Box = new RectangleF
(
tp.getXDirAdj(),
(float)Math.Round(tp.getYDirAdj(), 0, MidpointRounding.ToEven) - h, // adjusted Y to top
tp.getWidthDirAdj(),
h
);
tc.Direction = tp.getDir();
tc.SpaceWidth = tp.getWidthOfSpace();
tc.Font = tp.getFont().getBaseFont();
tc.FontSize = tp.getFontSizeInPt();
try
{
int[] flags =
GetBits(tp.getFont().getFontDescriptor().getFlags());
tc.IsBold = findBold(tp, flags, gstate);
tc.IsItalic = findItalics(tp, flags);
}
catch { }
return tc;
}
protected override void writePage() { return; } //prevents exception
}
少し私はPDFについて知っているから、彼らのような高レベルの概念が含まれている場合、私は非常に驚くだろう「テーブルセルを。」 – adv12
ファイルの情報は、PDFリーダに背景なしでの売り上げと、緑色での売却を指示するのに十分です。それは少なくともそれを示す何かがあることを意味します。 – VincentZHANG
確かに、塗りつぶされた矩形と塗りつぶされていない矩形がありますが、それ以上の意味を持つものは何も期待しません。つまり、この矩形はテーブルの最初の列のヘッダーを表します。 "私は様々なライブラリを使ってPDFを書きましたが、そのような高レベルの概念はAPIの一部であることはありませんでした。 – adv12