こんにちは。

VB.NETでPDF内のテキストを読みたいのですが、どういった方法があるでしょうか?
以前はPDFDesigner Toolsを使用してテキストに変換してから読んでいたのですが、PDFのバージョンが上がってしまい対応できなくなってしまいました。

お願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

> アクロバットを使用しないで行いたいのです。



以前使用していたツールの代替えツールを使用するのではなく、抽出機能を VB.NET で実現するってことですよね。
なおかつインストール必要な部品は使用不可ってことですか?
(それとも数多のツールの中で、Acrobat や Adobe Reader だけは使用不可ってことか?)

どんな条件だったら許可できるのかを書いてもらえると助言が出やすいですよ。

.NET 言語から使用可能な部品ならわりとあるんですけどね。
http://www.infotek.co.jp/product/pdflib_index.html
http://gihyo.jp/dev/serial/01/make-findspot/0016
http://www.xlsoft.com/jp/products/pegasus/pdfxpr …

純粋に .NET Framework だけで実現する方法は知りません。

この回答への補足

ご回答ありがとうございます。

言葉が足りなくて申し訳ありません。

基本的に有償商品であればAcrobatより安価なもの、無償の場合にはBSDライセンス的なものが欲しいです。

.NET Frameworkだけだと、pdfの仕様を解析して行わなければならないようです。

補足日時:2009/05/13 07:51
    • good
    • 0

VBA用ですが、VB.NETに移植できないでしょうか。


http://pdf-file.jugem.jp/?eid=114
ご参考まで。

この回答への補足

早速のご回答ありがとうございます。

言葉(条件)が足りませんでした。

アクロバットを使用しないで行いたいのです。

申し訳ありません。

補足日時:2009/05/12 07:01
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVBからPDFファイルの埋め込みテキストを検索する方法

VBで文書を検索できるシステムを作っています。
通常検索では、テキストボックスに入力した文字列と一致するものをデータベースに登録した文書名から探してきてMSHFlexGridコントロール上に表示するようにしています。
今回は、追加検索として、指定したフォルダの中にあるPDFファイルやワードファイルなどの文書中の文字から一致するものを探して表示する機能を作りたいと考えています。
この様な機能はどの様に作れば良いのでしょうか?
色々とサイトを探してみたのですが、該当するものを見つけることが出来ませんでした。
よろしくお願いします。

Aベストアンサー

こんにちは。

[xdoc2txt]
PDF,WORD,EXCEL,一太郎などの各種バイナリ文書からテキストを抽出
http://www31.ocn.ne.jp/~h_ishida/xdoc2txt.html

VB から xdoc2txt.exe を起動して抽出テキストをリダイレクトする。
または、ActiveX 版 xdoc2txt.ocx を使うとか。

一から VB でとなると恐ろしく面倒で、難しいですよ。

まず速度面の問題があるでしょうし、ファイルフォーマットの解析が
必要になったり。。

QExcelでPDFファイルを利用する方法

いつもお世話になっております。

Excel2007ではアドインでPDFファイルを書き出すことができますが、逆に、PDFを読み込むことができないでしょうか。
ExcelVBAで、PDFファイルにあるテキストの表の値をワークシートにコピーしたいのですが、方法がわからず困っております。
どなたか、お助けいただけないでしょうか。

Aベストアンサー

Excel は PDF を読み込めませんので、PDF を開けるアプリケーション側から Excel に歩み寄っていく方向性がよろしいかと。

ちょっと実験してみました。
準備として Excel 2007 で表を作成し、PDF に出力したものを使いました。なので PDF の中の表に含まれる文字や数値は "文字" です。紙をスキャニングしたような "絵" ではありません。

この PDF を Adobe Acrobat 7.0 Standard で開き、テキスト選択モードにして表全体を選択。[右クリック] して [テーブルとしてコピー] をしました。
その状態で新規 Excel のシート上で [Ctrl]+[C] などで貼り付けをしてみると、見事に表がシートの上に展開されました。

また、Acrobat で [ファイル]-[名前を付けて保存] で保存形式を "Microsoft Word" にして保存し、そいつを Word で開いても表が再現されました。
ただ、ちょとだけセルがずれてましたけど。(表の左上のマスなど、何も文字が入らないマスがズレの原因になるようです)
Word の上に再現された表の全体をコピーして Excel のシートの上で [編集]-[形式を選択してコピー] をポイントし、"テキスト" の形式で張り付けてみるとズレてはいるものの割ときれいに表が張り付きました。(横軸のタイトル行が 1マスだけ左にずれました)

というような結果です。
最初のころにも書きましたが、PDF ファイルの中の表に含まれる文字や数値が 「人が見て文字や数字に見える」 てだけじゃなく、コンピュータ的にも文字や数値として判断できる状況じゃないとこの方法は無理です。表が書かれた紙資料をスキャニングして PDF 化した物からはできないです。
そういう場合は OCR などを使って先に "絵" を "文字" にする作業が必要かと思います。
私は Acrobat を使いこなしているわけでもないですし、手持ちは安い方の Standard Edition なので、もしかしたら上記の解決は Acrobat だけでも可能かもしれませんが。

Excel は PDF を読み込めませんので、PDF を開けるアプリケーション側から Excel に歩み寄っていく方向性がよろしいかと。

ちょっと実験してみました。
準備として Excel 2007 で表を作成し、PDF に出力したものを使いました。なので PDF の中の表に含まれる文字や数値は "文字" です。紙をスキャニングしたような "絵" ではありません。

この PDF を Adobe Acrobat 7.0 Standard で開き、テキスト選択モードにして表全体を選択。[右クリック] して [テーブルとしてコピー] をしました。
その状態で新規 E...続きを読む

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

QVB.NET xdoc2txtをつかってPDFからテキストを取り出すコーディングがわかりません

[xdoc2txt]
PDF,WORD,EXCEL,一太郎などの各種バイナリ文書からテキストを抽出

を利用して、c:\tempにあるpdfファイルからテキスト情報を取り込みたいです。
xdoc2txt.exeやxdoc2txt.dllなどはどこに配置したら良いのかも教えてください。
お願いします。

Aベストアンサー

こんにちは。

>すみませんVB初心者のため、全体的なコーディングの流れを教えて頂けると助かります。

コーディングといっても、VB.Net では、TextBox に出てきたものを流し込むだけですよね。今、VB.Net と言われても、感覚を取り戻すまでには時間も掛かります。ですから、VBSで間に合わせさせていただきます。

》xd2tx216.zip に入っている
》xd2txcom.dll (xdoc2txt com dll版)サンプル VBScipt は参考にはなりませんか?

》 (1)xd2txcom.dllをregsvr32で登録してから実行してください。
》 regsvr32 xd2txcom.dll
》 (2)64bit OSで実行するときは、%WINDIR%SysWOW64\CScript.exe で実行してください。

細かい所は、「誰でも使えるxdoc2txt」を参考にしてください。
http://talk-pc.sakura.ne.jp/anybody_setup_xdoc2txt.html#versionup

ありきたりですが、簡単なコードを、VBSで作ってみました。
要するに、regsvr32 で登録した後は、
Set objXDOC = CreateObject("xd2txcom.Xdoc2txt.1")
とか、com オブジェクトで設定すれば済むわけです。

objXDOC.ExtractText(strArg, False)
実行コマンドはこれです。

後は、通常通りだと思います。

以下は、ドラッグ&ドロップ でアーギュメントを与える方法ですが、必要な部分だけを取り出してまってください。

主要なものはほとんど読めるようになっています。
As/R というファイラーに組み込んでしまいましたが、
http://www.all.undo.jp/asr/1st/
こんな簡単なものでも、思った以上に便利です。

Editorでみますから、textファイルは読みません。
また、画像が入っているものは、しばらく止まっていることがあります。
バグっぽいところは、気がついているのですが、それは、ご容赦のほどを。

'----Xdoc2Txt_Viewer.vbs----

Dim ext
Dim objFs
Dim txtOut
Dim strArg
Dim strExt
Dim exts
Dim ret
Dim buf
strExt = "rtf,docx,xlsx,xlsm,pptx,doc,xls,ppt," & _
"sxw,sxc,sxi,sxd,odt,ods,odp,odg,jaw,jtw,jbw," & _
"juw,jfw,jvw,jtd,jtt,oas,oa2,oa3,bun,wj2" & _
"wj3,wk3,wk4,123,wri,pdf,mht,html,eml"
exts =Split(strExt,",")
Set Args =Wscript.Arguments
txtOut =""
Set objXDOC = CreateObject("xd2txcom.Xdoc2txt.1")
Set objFs= CreateObject("Scripting.FileSystemObject")
For Each strArg in Args
ext= objfs.GetExtensionName(strArg)
ret =Filter(exts,ext,True,1)
If UBound(ret)>-1 And Ubound(ret)< 2 Then
buf =objXDOC.ExtractText(strArg, False)
txtOut = txtOut & buf & vbCrLf
Else
txtOut =txtOut & vbCrLf & strArg
End If
Next
If txtOut <>"" Then
MsgBox txtOut
End If
'----------------

こんにちは。

>すみませんVB初心者のため、全体的なコーディングの流れを教えて頂けると助かります。

コーディングといっても、VB.Net では、TextBox に出てきたものを流し込むだけですよね。今、VB.Net と言われても、感覚を取り戻すまでには時間も掛かります。ですから、VBSで間に合わせさせていただきます。

》xd2tx216.zip に入っている
》xd2txcom.dll (xdoc2txt com dll版)サンプル VBScipt は参考にはなりませんか?

》 (1)xd2txcom.dllをregsvr32で登録してから実行してください。
》 regsvr32 xd2tx...続きを読む

QVBからPDFファイル自動生成するには

VBから印刷イメージを自動にPDFファイルに変換し指定フォルダに保存するにはどのようにすればよいのでしょうか?
いろいろ調べても良くわかりません。
できればサンプルプログラムもあれば幸いです。

現在は、通常使うプリンタにAcrobat PDFWriterを指定し手動でPDFファイルを作っている次第です。

環境としてはWindows2000、VB6.0、Acrobat4.05です。

どんな情報でも結構です。お待ちしております。

Aベストアンサー

サンプルです。

Option Explicit

'開発環境: VB6SP5 Acrobat4.0
'参照設定:Adobe Acrobat 4.0 Type Library
'    参照設定初回設定時は「Acrobat」と表示されています
'    一度チェックをつけ、もう一度参照設定ダイアログを開くと「Adobe Acrobat 4.0 Type Library」になっているはずです。

Sub TEST()
  Dim acroApp     As CAcroApp   'CAcroAppオブジェクト
  Dim acroPDDoc    As CAcroPDDoc  'CAcroPDDocオブジェクト
  Dim acroExchAVDoc  As CAcroAVDoc  'CAcroAVDocオブジェクト
  Dim blnRtn     As Boolean   '戻り値
  Dim lngAVDocNum   As Long
  
  'インスタンス生成
  Set acroApp = CreateObject("AcroExch.APP")
  Set acroPDDoc = CreateObject("AcroExch.PDDoc")
  Set acroExchAVDoc = CreateObject("AcroExch.AVDoc")

'デバッグ用
acroApp.Show
 
  'ファイルオープン
  blnRtn = acroExchAVDoc.Open("c:\test.bmp", "")
  If blnRtn Then
    MsgBox "オープンエラー"
    GoTo PGMEND:
  End If
  
  '変換処理中の待機処理
  Do While lngAVDocNum = acroApp.GetNumAVDocs
    DoEvents
  Loop
  
  '変換済みのアクティブPDFファイルオブジェクト取得
  Set acroExchAVDoc = acroApp.GetActiveDoc()
  Set acroPDDoc = acroExchAVDoc.GetPDDoc()
    
  'PDFファイルとしてセーブ
  blnRtn = acroPDDoc.Save(PDSaveFull Or PDSaveCollectGarbage Or PDSaveLinearized, "c:\test.pdf")
  
  If Not blnRtn Then
    MsgBox "セーブエラー"
    GoTo PGMEND:
  End If
 
 
PGMEND:
  '閉じる
  blnRtn = acroExchAVDoc.Close(False)
  acroApp.Exit
 
  '開放
  Set acroExchAVDoc = Nothing
  Set acroPDDoc = Nothing
  Set acroApp = Nothing
End Sub

サンプルです。

Option Explicit

'開発環境: VB6SP5 Acrobat4.0
'参照設定:Adobe Acrobat 4.0 Type Library
'    参照設定初回設定時は「Acrobat」と表示されています
'    一度チェックをつけ、もう一度参照設定ダイアログを開くと「Adobe Acrobat 4.0 Type Library」になっているはずです。

Sub TEST()
  Dim acroApp     As CAcroApp   'CAcroAppオブジェクト
  Dim acroPDDoc    As CAcroPDDoc  'CAcroPDDocオブジェクト
  Dim acroExchAVDoc  As CAcroAVDoc  'CAcro...続きを読む

QVB.NETでのイベントの途中終了

VB.NETで、あるボタン(button1)をクリックさせた際にイベントを発生させます。

そのイベント内の処理途中で、イベントを終了させたいと思っていますが、どのように書いていいかわからず困っています。

どなたかおわかりの方お願いします。

Aベストアンサー

Exit ←これをイベント終了したいところで、使えばいいと思いました。

(例)
Private Sub Button1_Cilck・・・省略・・・
 '「Button1」をクリックしたときのイベント
 If Msgbox("イベントを途中終了しますか?",vbYesNo) = vbYes Then
  Exit Sub 'イベント途中終了
 End If
 Msgbox("イベントを途中終了しませんでした。")
End Sub

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub

Qフルパスから最後のディレクトリ名を取得したい。

vb.netなのですが、例えば
c:\aaa\bbb\ccc\ddd\eee\fff.exe
というフルパスがあったとして、
eeeというディレクトリ名を取得したいのですが、
何か良い方法はないでしょうか。
それぞれのディレクトリ名の文字数や階層数は
決まっていないのですが、オススメの方法が
ありましたら、教えて頂けると助かります。

Aベストアンサー

MessageBox.Show(IO.Path.GetFileName(IO.Path.GetDirectoryName(myPath)))

IO.Path の GetDirectoryName でフォルダのフルパスを取得して、さらに IO.Path の GetFileName で最終フォルダ(またはファイル)の名前を取得。

QDoEvents関数って何?

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そこで「EXCEL VBA パーフェクトマスター」という本を見たら

for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
DoEvents
next i
unload userform1
と入力すれば解決することがわかりました。

しかし「DoEvents」についてあまり詳しく書いていなかったのでDoEvents関数をヘルプで見ると、
「発生したイベントがオペレーティング システムによって処理されるように、プログラムで占有していた制御をオペレーティング システムに渡すフロー制御関数です。」

と書いてあるのですが正直、書いてあることがよくわかりません。

どなたかDoEvents関数について、
もう少しわかりやすく教えていただけませんか。
それから、最初に書いたコードで実行すると
ユーザーフォームの背景が真っ白になってしまう原因も
教えていただけませんか?

よろしくお願いいたします。

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そ...続きを読む

Aベストアンサー

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
    DoEvents
    Cells(i,1) = ""
  Next i
End Sub

Private Sub CommandButton2_Click()
  MsgBox "hoge"
End Sub

っていうフォームのコードがあった場合、
DoEvents を入れることによって、ループ中にユーザーがCommandButton2 を押すことによって CommandButton2 のクリック イベントも動いちゃいます。
CommandButton1 のクリック イベントではループの前に
CommandButton1.Enabled = False
CommandButton2.Enabled = False
を書いてフォーム上の CommandButton を無効にしておき、ループが終わったら
CommandButton1.Enabled = True
CommandButton2.Enabled = True
と書いて CommandButton を有効に戻してください。

これを工夫すれば、CommandButton2 で CommandButton1 のループを途中キャンセルする処理もすることができます。

Private Canceled As Boolean

Private Sub CommandButton1_Click()

  CommandButton2.Enabled = False

  Dim i As Long
  For i = 1 To 50000
    DoEvents

    If Canceled = True Then
      MsgBox "キャンセルしました"
      Exit Sub
    End If

    Cells(i, 1).Value = ""
  Next i
End Sub

Private CommandButton2_Click()
  Canceled = True
End Sub



コードの行頭にあるスペースは見易さのために全角スペースで作成していますので、これをこのままコピペするとエラーになるかもしれません。
コピペするなら行頭の全角スペースを半角スペースに直してください。

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
...続きを読む

QエクセルVBAで一つ上の階層を指定して保存したい

お世話になります。
VBA初心者なりにマクロの自動記録などで作業しておりますが、自動記録でできない作業を一つ教えてください。
現在作業しているフォルダは、Activeworkbook.Pathなどで指定できますが、その一つ上の階層に保存したいという場合、どう指定すればよいのでしょうか? 自動保存だと"Documentos and Settinng~"などから始まるファイルパスになりますが、ファイルを保存するフォルダは各人によってまちまちですので、自分が保存したフォルダの一つ上という指定をしたいのです。そのような方法があれば教えてください。
よろしくお願いいたします。

Aベストアンサー

回答番号:No.5 merlionXXです。

> プロシージャの呼び出しが不正と出ます。

それは、ActiveWorkbook.Path が取得できない、つまりまだ保存前の新規BOOKで実行したせいではないかと思います。
エラーを回避するようにしてみました。

If ActiveWorkbook.Path = "" Then
x = ""
Else
x = Left(ActiveWorkbook.Path, InStrRev(ActiveWorkbook.Path, "\") - 1)
End If
ActiveWorkbook.SaveAs Filename:=x & "\test.xls"


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報