プロが教えるわが家の防犯対策術!

ExcelVBAからAcrobatを立ち上げPDFからテキストと、その座標情報を取得したいと考えております。

http://pdf-file.jugem.jp/
を参考にしてAcrobatを立ち上げJavaでテキストを抽出することはできましたが、その座標情報を得られず困っております。

Dim test As Variant
test = jso.getPageNthWordQuads(0, 1)

でtestには8つの値が配列で入るはずなのですがtest(0)にしか値は入っていません。
この値は妥当な値を得られているのですが、test(1)からは参照できません。

いろいろ調べて、VBAのvariantはVBのそれとは違う・・・のが原因ではというところで行き詰りここに書き込んでみることにしました。

VBAで同様なことをされている方がいましたらぜひよろしくお願いします。

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

A 回答 (1件)

こんにちは。



>VBAで同様なことをされている方がいましたらぜひよろしくお願いします。
ふつうは、pdf に、テキストが入っているとは限らないし、プロテクトが掛かっていたら出来ませんので、印刷プロテクトが入っていないものなら、私は、OCR で取ってしまいます。それに、小さい規模なら、テキストが入っていれば、テキスト・コピーが利きます。

Acrobat 自体は分かりませんが、

test = jso.getPageNthWordQuads(0, 1)

もし、もともとが、配列があるとするなら、インデックス(添え字)を入れなければ、そのまま入るはずです。ただし、変数 test は、Variant 型で、配列の宣言をしないことが条件です。

そういうことではなくて、それぞれを取りたいなら、

jso.getPageNthWordQuads が、8つがどのような構造をしているかは分かりませんが、

座標は、二次限配列なのですから、

getPageNthWordQuads ([nPage],[nWord])

そのそれぞれのインデックスに、たぶん、0か、1 から、上限まで数字を入れれば出てくるはずです。
    • good
    • 0
この回答へのお礼

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

市販のリッチテキストコンバータでPDFをEXCELファイル化して使用していたのですが、どうしてもかゆいところに手が届かず作ることにしました。

test(0,0)を参照しようとしてもインデックスが対象外と言われてお手上げでしたが、

>座標は、二次限配列なのですから、

というアドバイスでもう一度調べてみたらどうやら2次元配列ではなくてジャグ配列ではないかと思いtest(0)(0)を参照してみたら無事参照することができました。


解決のご報告とあわせてお礼申し上げます。
ありがとうございました!

お礼日時:2008/04/03 01:34

この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...続きを読む

QPDFファイルを開き、印刷し、閉じるマクロ

Excel 2003 VBAにて、
PDFファイルを開き、印刷し、閉じるマクロを作りたいと思っています。

Dim AA, AAA

AA = "C:\Program Files\Adobe\Reader 11.0\Reader\AcroRd32.exe C:\Scan\20131101160734050_001.pdf"
AAA = Shell(AA, vbNormalFocus)

にて、PDFファイルを開くことは出来ました。
このPDFファイルを、「印刷し、閉じる」ためには、
このPDFファイルを指定する必要があると思いますが、
その構文が判りません。
知っている方、教えて下さい。

Aベストアンサー

#3です。
WShell.Execを使うと閉じる事ができる様ですが、色々と気難しくて苦労しました。
まず、なぜかAdobe Reader/Acrobatのフルパスを与えないと、ファイルがみつからないとゴネます。

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub test()
printPdf2 GetDesktopPath & "\test.pdf", "DocuWorks Printer", "DocuWorks Printer Driver"
' printPdf2 GetDesktopPath & "\test.pdf"
End Sub

Sub printPdf2(pdfDocument As String, Optional printerName As Variant, Optional printerDriver As Variant)
Dim cmdLine As String
Dim WShell As Object
Dim oExec As Object
'ここは調整の必要がありそう
Const waitTime As Long = 1000
'Windows7 Home 64bitの場合です
Const pgmFullPath As String = "C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe"

Set WShell = CreateObject("WScript.Shell")
If IsMissing(printerName) Or IsMissing(printerDriver) Then
cmdLine = "pgmFullPath /n /s /o /h /t ""pdfFullPath"""
cmdLine = Replace(cmdLine, "pgmFullPath", pgmFullPath)
cmdLine = Replace(cmdLine, "pdfFullPath", pdfDocument)
Else
cmdLine = "pgmFullPath /n /s /o /h /t ""pdfFullPath"" ""printerName"" ""printerDriver"""
cmdLine = Replace(cmdLine, "pgmFullPath", pgmFullPath)
cmdLine = Replace(cmdLine, "pdfFullPath", pdfDocument)
cmdLine = Replace(cmdLine, "printerName", printerName)
cmdLine = Replace(cmdLine, "printeDriver", printerDriver)
End If
Debug.Print cmdLine
Set oExec = WShell.exec(cmdLine)
Sleep waitTime
'Windows7Home/64bit環境ではここで実行時エラーが出るので無理矢理先に進めていますが
'Adobe Readerは閉じられる様です
On Error Resume Next
oExec.Terminate
Set WShell = Nothing
End Sub

Private Function GetDesktopPath() As String
Dim wScriptHost As Object, strInitDir As String
Set wScriptHost = CreateObject("Wscript.Shell")
GetDesktopPath = wScriptHost.SpecialFolders("Desktop")
Set wScriptHost = Nothing
End Function

Terminateで原因不明のエラーが出るのでWebを漁っいて下記をみつけました。64bit環境でエラーが出るのはこれも関係しているのでしょうか?少々無理をしている様なので、ご使用時はご注意下さい。
Terminate メソッドは最後の手段としてのみ使用します。これは、アプリケーションによっては適切にクリーンアップできない場合があるためです。通常は、プロセスを途中で中断せず、プロセス自身で実行を終了させるようにします。Terminate メソッドは WM_CLOSE メッセージを使ってプロセスを終了しようとします。これで終了できない場合は、通常のシャットダウン手順を実行せずに、プロセスを強制終了します。
http://msdn.microsoft.com/ja-jp/library/cc364387.aspx

#3です。
WShell.Execを使うと閉じる事ができる様ですが、色々と気難しくて苦労しました。
まず、なぜかAdobe Reader/Acrobatのフルパスを与えないと、ファイルがみつからないとゴネます。

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub test()
printPdf2 GetDesktopPath & "\test.pdf", "DocuWorks Printer", "DocuWorks Printer Driver"
' printPdf2 GetDesktopPath & "\test.pdf"
End Sub

Sub printPdf2(pdfDocument As String, Optional printerName As Variant, Optional prin...続きを読む

QエクセルVBAで、PDFファイルを開きたい

セルに入力した値のブック(xls)を開く場合、
以下となりますが、↓

Sub セルに入力したブック名のブックを開く()
ブック名 = Cells(1, 2) 'B1セルの値を取り出す
Workbooks.Open Filename:=ブック名 & ".xls" '指定されたブックを開く
End Sub


これでPDFファイルを開きたいです。
記述をどうしたらよいでしょうか。
目的はPDFファイルの検索/照会をxlsにてしたいのです。
お手数ですがお願いいたします。

Aベストアンサー

案1
ハイパーリンクにしてしまう。

案2
PDFファイルへのフルパスが、B列に記述してある
拡張子PDFへの関連付けがAcrobat Reader にしてある
と仮定して
ワークシートのイベントに

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If InStr(Target.Value, "pdf") > 0 Then
  Call Shell("explorer.exe " & Target.Value)
  Cancel = True '編集モードキャンセル
End If
End Sub
とか?

PDFファイルが一箇所にまとまっているのなら
標準モジュールに
Sub test2()
Dim strFilePath As String
strFilePath = _
  Application.GetOpenFilename _
  ("PDFファイル,*.pdf", MultiSelect:=False)

If strFilePath = "false" Then
 Exit Sub
End If

Call Shell("explorer.exe " & strFilePath)

End Sub
でも?
ということかな?

案1
ハイパーリンクにしてしまう。

案2
PDFファイルへのフルパスが、B列に記述してある
拡張子PDFへの関連付けがAcrobat Reader にしてある
と仮定して
ワークシートのイベントに

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If InStr(Target.Value, "pdf") > 0 Then
  Call Shell("explorer.exe " & Target.Value)
  Cancel = True '編集モードキャンセル
End If
End Sub
とか?

PDFファイルが一箇所にまとまっているのなら
標準モジュー...続きを読む

Q複数あるPDFファイルのページ数を知りたい

当方は1,000個以上のPDFファイルを所有しています。それぞれのPDFファイルのページ数を知りたいのですが、このページ数を簡単に検索(一括表示)できる無料ツールなどを知っている方は是非、教えてください。

Aベストアンサー

初めまして。
私も同じようなことをしようと思い、色々探していました。

それで下記のサイトにある「ComPDF」を使ってみたらいかがでしょうか。
シェアウェアですが、ページ数を調べるのでしたら大丈夫でしたよ。
私が調べたアプリの中では精度がかなりいいです。

http://www.ne.jp/asahi/foresth/home/

QPDFファイルから特定の文字を検索し、頁を抽出する方法

PDFファイルの文書の中から、特定の文字列を検索し、その文字が含まれているページだけを抽出して別のPDFファイルを作る方法を教えてください。
検索結果の件数は表示されるのですが、その頁を抽出(あるいは、文字を含まない頁を削除)する方法がわかりません。
元のページ数が多いので、手作業での不要ページ削除が難しく大変困っています。
(win7でAdobe Acrobat 11 Standardを使用しています) 
どうかよろしくお願いいたします。

Aベストアンサー

検索結果から文字列のあるページをクリックして表示しておけば、その
ページ番号などが分かります。それでページのみでの抽出をすることは
可能だと思いますよ。
https://helpx.adobe.com/jp/acrobat/kb/3320.html
http://www.itmedia.co.jp/bizid/articles/1304/01/news007.html

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QVBでPDFファイルを編集する

VBでPDFファイルを結合したいのですが、どうしたらよいのか
わかりません。
ページ挿入で1つのファイルにまとめるという方法でも
どちらでもかまいません。
ご存知の方がいらっしゃいましたら、教えて下さい。

Aベストアンサー

使えそうなソースを見つけました。

参考URL:http://www.planetpdf.com/mainpage.asp?WebPageID=47

QAdobeReader8.0の機能を使っての印刷

現在WindowsXP・VB2005で作成したアプリケーションで、Adobe Acrobat5.0が入っているマシンでAdobe Acrobat5.0 type LibraryのPrintPagesSilent機能を使ってPDFの印刷をしているのですが、Adobe Reader8.0しか入っていないマシンでPDFの印刷をすることになりました。

参照設定で、Adobe Acrobat5.0 type LibraryになっているところをAdobe Acrobat8.0 type Libraryにするだけでいけるのかと思っていたのですが、参照設定の中にAdobe Acrobat8.0 type Libraryが見つかりませんでした。

Acrobatが入っていないと、Adobe Acrobat type Libraryというのは使用することが出来ないのでしょうか?

このライブラリが使えないのであれば、START AcroRD32.exe /p filepass で印刷しようと思っていますが、独自の印刷ダイアログを使って印刷したいです。

何か良い方法はありませんでしょうか?

アプリケーションを使用する環境はWindowsXPです。

現在WindowsXP・VB2005で作成したアプリケーションで、Adobe Acrobat5.0が入っているマシンでAdobe Acrobat5.0 type LibraryのPrintPagesSilent機能を使ってPDFの印刷をしているのですが、Adobe Reader8.0しか入っていないマシンでPDFの印刷をすることになりました。

参照設定で、Adobe Acrobat5.0 type LibraryになっているところをAdobe Acrobat8.0 type Libraryにするだけでいけるのかと思っていたのですが、参照設定の中にAdobe Acrobat8.0 type Libraryが見つかりませんでした。

Acrobatが入っていない...続きを読む

Aベストアンサー

Acrobat 8.0、あるいは Adobe Reader 8.0 ( あと、Adobe の SDK も?)がインストールされていないと Adobe Acrobat 8.0 type Library は使用できません。

(1) とりあえず、Adobe Acrobat 5.0 type Library でコンパイルしたものを、Adobe Acrobat 8.0 がインストールされている PC で実行させてみる。

(1) で正常に動作しない場合は、

(2) Adobe Acrobat 5.0 type Library の参照設定を外し、

Dim AVDoc As Acrobat.CAcroAVDoc
Dim PDDoc As Acrobat.CAcroPDDoc

といった宣言を全て

Dim AVDoc As Object
Dim PDDoc As Object

に書き換えてコンパイルする。

(3) Adobe Acrobat 8.0 や Adobe Reader 8.0 をインストールし、参照設定で Adobe Acrobat 8.0 type Library を設定してコンパイルする。

のどちらかになると思います。

Acrobat 8.0、あるいは Adobe Reader 8.0 ( あと、Adobe の SDK も?)がインストールされていないと Adobe Acrobat 8.0 type Library は使用できません。

(1) とりあえず、Adobe Acrobat 5.0 type Library でコンパイルしたものを、Adobe Acrobat 8.0 がインストールされている PC で実行させてみる。

(1) で正常に動作しない場合は、

(2) Adobe Acrobat 5.0 type Library の参照設定を外し、

Dim AVDoc As Acrobat.CAcroAVDoc
Dim PDDoc As Acrobat.CAcroPDDoc

といった宣言を全て

Dim AVDoc ...続きを読む

Q【Excel VBA】マクロでExcel自体を終了させたい

環境:WindowsXP、Excel2003

マクロでエクセルを終了(ブックを閉じて、アプリケーション自体も終了)させたいのですが、以下のコードではアプリケーションが閉じてくれません。

ThisWorkbook.Close
ExcObj.Quit
Application.Quit

どこか悪いところはありますでしょうか?

よろしくお願いします。

Aベストアンサー

普通に考えれば質問者のコードで上手くいきそうですが
hana-hana3さんの回答にもあるようにThisWorkBook.Closeでコード終了となりますので
Application.QuitをThisWorkBook.Closeの前にもってこないといけません。
Application.Quitはそれがあるプロシージャのコードが全て終わるまで
その実行を保留するちょと特別動作をします。

'-------------------------------------
 Application.Quit
 ThisWorkbook.Close
'-------------------------------------
 
 


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

人気Q&Aランキング