2012-09-05 72 views
1

我試圖創建一個腳本將PDF轉換爲純文本,然後再複製純文本到Word。 (我們在工作的地方從頭開始重新格式化損壞的文檔。)除了一件事情之外,我有一個完美的腳本:當粘貼到Word中時,它不會粘貼整個文件。隨着更長的文件,我只獲得文本的一部分。使用VBS複製從記事本到Word

'string to hold file path 
Dim strDMM 
strDMM = "[path]" 

'make this directory if it doesn't exits 
On Error Resume Next 
MkDir strDMM 
On Error GoTo 0 

'get the file name to process 
Dim TheFile 
TheFile = InputBox("What is the file name?" & chr(13) & chr(13) & "(Example: [name].pdf)", "Name of File") 

'declare some acrobat variables 
Dim AcroXApp 
Dim AcroXAVDoc 
Dim AcroXPDDoc 

'open acrobat 
Set AcroXApp = CreateObject("AcroExch.App") 
AcroXApp.Hide 

'open the document we want 
Set AcroXAVDoc = CreateObject("AcroExch.AVDoc") 
AcroXAVDoc.Open "[path to desktop]" & TheFile, "Acrobat" 'users are instructed to save to the Desktop for ease of access here 

'make sure the acrobat window is active 
AcroXAVDoc.BringToFront 

'I don't know what this does. I copied it from code online. 
Set AcroXPDDoc = AcroXAVDoc.GetPDDoc 

'activate JavaScript commands w/Acrobat 
Dim jsObj 
Set jsObj = AcroXPDDoc.GetJSObject 

'save the file as plain text 
jsObj.SaveAs strDMM & "pdf-plain-text.txt", "com.adobe.acrobat.plain-text" 

'close the file and exit acrobat 
AcroXAVDoc.Close False 
AcroXApp.Hide 
AcroXApp.Exit 

'declare constants for manipulating the text files 
Const ForReading = 1 
Const ForWriting = 2 

'Create a File System Object 
Dim objFSO 
Set objFSO = CreateObject("Scripting.FileSystemObject") 

'read file and get text 
dim objFile 
set objFile=objFSO.OpenTextFile(strDMM & TheFile, ForReading) 

Dim strText 
strText=objFile.ReadAll 

'Create a Word Object 
Dim objWord 
set objWord = CreateObject("Word.Application") 

'make Word visible 
With objWord 
    .Visible = True 
End With 

'Add method used to create a blank document 
Dim objDoc 
Set objDoc=objWord.Documents.Add() 

'create a shorter variable to pass commands to Word 
Dim objSelection 
set objSelection=objWord.Selection 

'type the read text into Word; this is the part that's failing 
objSelection.TypeText strText 

objFile.Close 

我試過了多個文件,結果相同。有趣的是,它每次都從文件A粘貼相同的素材,但是當從文件B中複製時,它會粘貼不同數量的素材。換句話說,如果A在第一次運行中給了我8頁60頁,那麼每次我都會得到相同的8頁。文件B可能會給我14頁60,然後每次給我14頁。這隻會改變,如果我從.txt文件中刪除材料。如果我從A中刪除幾段,然後運行腳本,我可能會得到12頁。然後我每次都得到相同的12個。但是沒有任何模式可以預測它切斷的位置。

我找不到任何EOF字符,當我從記事本讀取和寫入記事本,整個事情是完全複製。問題在於轉移到Word的某處。

有什麼我失蹤了嗎? Word可以用TypeText編寫的字符串的大小是否有限制? (我認爲,如果是這樣的話,我不會得到不同長度的文件,對嗎?難道他們不應該停止所有在n個字符如果是這樣的限制?)

我讀過有關的其他庫,讓VBS與剪貼板一起工作,但我是一個完全noob,不知道這是一個更優雅的解決方案或如何使其工作。我也不確定在我的工作計算機上有沒有必要安裝這些庫。

任何幫助表示讚賞!

回答

4

有沒有必要讀文件到Word中,可以從磁盤

Dim objWord 
'Dim objDoc 
Set objWord = CreateObject("Word.Application") 

'make Word visible 
With objWord 
    .Visible = True 

    'Add method used to create a blank document 
    .Documents.Add 
    .Selection.InsertFile FileNameAndPath 
End With 
+1

+1再次證明一個好的程序(大部分)是由你省略的代碼組成的。 –

+0

哇!這麼快@ Ekkehard.Horner!謝謝你的提示! – tmoore82

1

您暗示的基本問題是字符串數據類型僅限於65,400 characters。對於未知的文件長度,最好一次讀入一行並將其寫入Word。有一個很好的類似here的討論。下面的代碼應該可以幫助你得到你想去的地方:

'read file and get text 
dim objFile 
set objFile=objFSO.OpenTextFile(strDMM & TheFile, ForReading) 

'Don't do this! 
'Dim strText 
'strText=objFile.ReadAll 

'Create a Word Object 
Dim objWord 
set objWord = CreateObject("Word.Application") 

'make Word visible 
With objWord 
    .Visible = True 
End With 

'Add method used to create a blank document 
Dim objDoc 
Set objDoc=objWord.Documents.Add() 

'create a shorter variable to pass commands to Word 
Dim objSelection 
set objSelection=objWord.Selection 

'Read one line at a time from the text file and 
'type that line into Word until the end of the file is reached 
Dim strLine 
Do Until objFile.AtEndOfStream 
    strLine = objFile.ReadLine 
    objSelection.TypeText strLine 
Loop 

objFile.Close 

希望有幫助!

+0

這正是我需要什麼插入一個文本文件!謝謝!我只是做了一些改變。在objSelection.TypeText之後strLine:objSelection.TypeParagraph(保留段落分隔符)。我還決定讓Word隱藏直到最後,所以我將當前的Visible命令更改爲False,然後添加一個新的命令以使其成爲腳本中的最後一個操作。這只是讓我有更多的問題。如果變量類型的字符串限制爲64,500個字符,並且該限制是防止整個事情被複制的原因,爲什麼它從記事本的一個實例工作到另一個實例?再次感謝! – tmoore82