Basic Powershell - Word Docx를 PDF로 일괄 변환
이 사이트에서 찾을 수 있는 스크립트를 사용하여 PowerShell을 사용하여 Word Docx를 PDF로 일괄 변환하려고 합니다. http://blogs.technet.com/b/heyscriptingguy/archive/2013/03/24/weekend-scripter-convert-word-documents-to-pdf-files-with-powershell.aspx
# Acquire a list of DOCX files in a folder
$Files=GET-CHILDITEM "C:\docx2pdf\*.DOCX"
$Word=NEW-OBJECT –COMOBJECT WORD.APPLICATION
Foreach ($File in $Files) {
# open a Word document, filename from the directory
$Doc=$Word.Documents.Open($File.fullname)
# Swap out DOCX with PDF in the Filename
$Name=($Doc.Fullname).replace("docx","pdf")
# Save this File as a PDF in Word 2010/2013
$Doc.saveas([ref] $Name, [ref] 17)
$Doc.close()
}
그리고 계속해서 이런 오류가 발생하는데 그 이유를 알 수 없습니다.
PS C:\docx2pdf> .\docx2pdf.ps1
Exception calling "SaveAs" with "16" argument(s): "Command failed"
At C:\docx2pdf\docx2pdf.ps1:13 char:13
+ $Doc.saveas <<<< ([ref] $Name, [ref] 17)
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
무슨 생각 있어요?
또한 - 로컬 파일(스크립트 위치와 동일한 위치에 있는 파일)을 사용할 뿐만 아니라 doc(docX가 아닌) 파일도 변환하려면 어떻게 변경해야 합니까?
죄송합니다. PowerShell 스크립팅을 수행하지 않았습니다.
이것은 docx 파일 뿐만 아니라 docx 파일에도 적용됩니다.
$documents_path = 'c:\doc2pdf'
$word_app = New-Object -ComObject Word.Application
# This filter will find .doc as well as .docx documents
Get-ChildItem -Path $documents_path -Filter *.doc? | ForEach-Object {
$document = $word_app.Documents.Open($_.FullName)
$pdf_filename = "$($_.DirectoryName)\$($_.BaseName).pdf"
$document.SaveAs([ref] $pdf_filename, [ref] 17)
$document.Close()
}
$word_app.Quit()
이런 식으로 약 7만 개의 워드 문서를 일괄 변환하는 작업을 하고 있었기 때문에 위의 답변들은 모두 제게는 부족했습니다.밝혀진 바에 따르면, 이 작업을 반복하면 메모리 문제로 인해 결국 Word가 충돌하게 됩니다(오류는 구문 분석 방법을 알 수 없는 COME 예외였습니다).그래서 그것을 진행하기 위한 나의 해킹은 100개의 문서(임의로 선택된 숫자)마다 단어를 죽이고 다시 시작하는 것이었습니다.
또한, 가끔 충돌할 때, 각각의 크기가 일반적으로 1-2kb인 잘못된 형태의 pdfs가 발생합니다.따라서 이미 생성된 pdfs를 건너뛸 때 최소 3kb 크기로 해야 합니다.이미 생성된 PDF를 건너뛰지 않으려면 해당 if 문을 삭제할 수 있습니다.
제 코드가 잘 안보이면 실례합니다. 저는 윈도우를 잘 사용하지 않고 이것은 일회성 해킹이었습니다.결과 코드는 다음과 같습니다.
$Files=Get-ChildItem -path '.\path\to\docs' -recurse -include "*.doc*"
$counter = 0
$filesProcessed = 0
$Word = New-Object -ComObject Word.Application
Foreach ($File in $Files) {
$Name="$(($File.FullName).substring(0, $File.FullName.lastIndexOf("."))).pdf"
if ((Test-Path $Name) -And (Get-Item $Name).length -gt 3kb) {
echo "skipping $($Name), already exists"
continue
}
echo "$($filesProcessed): processing $($File.FullName)"
$Doc = $Word.Documents.Open($File.FullName)
$Doc.SaveAs($Name, 17)
$Doc.Close()
if ($counter -gt 100) {
$counter = 0
$Word.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($Word)
$Word = New-Object -ComObject Word.Application
}
$counter = $counter + 1
$filesProcessed = $filesProcessed + 1
}
이것은 나에게 효과가 있습니다 (Word 2007):
$wdFormatPDF = 17
$word = New-Object -ComObject Word.Application
$word.visible = $false
$folderpath = Split-Path -parent $MyInvocation.MyCommand.Path
Get-ChildItem -path $folderpath -recurse -include "*.doc" | % {
$path = ($_.fullname).substring(0,($_.FullName).lastindexOf("."))
$doc = $word.documents.open($_.fullname)
$doc.saveas($path, $wdFormatPDF)
$doc.close()
}
$word.Quit()
여기에 게시된 두 가지 솔루션 모두 Windows 8.1(btw)에서 작동하지 않았습니다.오피스 365)를 사용하고 있습니다.내 PowerShell은 어쩐지 [ref] 인수를 좋아하지 않습니다(왜 그런지 모르겠습니다. 저는 PowerShell을 거의 사용하지 않습니다).
이것이 제게 도움이 된 해결책입니다.
$Files=Get-ChildItem 'C:\path\to\files\*.docx'
$Word = New-Object -ComObject Word.Application
Foreach ($File in $Files) {
$Doc = $Word.Documents.Open($File.FullName)
$Name=($Doc.FullName).replace('docx', 'pdf')
$Doc.SaveAs($Name, 17)
$Doc.Close()
}
최신 사무실에서 사용할 수 있도록 업데이트했습니다.
# Get invocation path
$curr_path = Split-Path -parent $MyInvocation.MyCommand.Path
# Create a PowerPoint object
$ppt_app = New-Object -ComObject PowerPoint.Application
#$ppt.visible = $false
# Get all objects of type .ppt? in $curr_path and its subfolders
Get-ChildItem -Path $curr_path -Recurse -Filter *.ppt? | ForEach-Object {
Write-Host "Processing" $_.FullName "..."
# Open it in PowerPoint
$document = $ppt_app.Presentations.Open($_.FullName,0,0,0)
# Create a name for the PDF document; they are stored in the invocation folder!
# If you want them to be created locally in the folders containing the source PowerPoint file, replace $curr_path with $_.DirectoryName
$pdf_filename = "$($curr_path)\$($_.BaseName).pdf"
# Save as PDF -- 17 is the literal value of `wdFormatPDF`
#$opt= [Microsoft.Office.Interop.PowerPoint.PpSaveAsFileType]::ppSaveAsPDF
$document.SaveAs($pdf_filename,32)
# Close PowerPoint file
$document.Close()
}
# Exit and release the PowerPoint object
$ppt_app.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($ppt_app)
언급URL : https://stackoverflow.com/questions/16534292/basic-powershell-batch-convert-word-docx-to-pdf
'source' 카테고리의 다른 글
봄에 XML 구성에 비해 JavaConfig의 이점은 무엇입니까? (0) | 2023.09.14 |
---|---|
node.js가 'npm start'를 표현하는 앱을 중지하는 방법 (0) | 2023.09.14 |
Spring RedisConnectionFactory 트랜잭션이 Pool에 연결을 반환하지 않은 다음 소진 시 차단됩니다. (0) | 2023.09.09 |
Chrome에서 인쇄할 때 href 값을 제거해야 함 (0) | 2023.09.09 |
mpdf에서 css 파일을 추가하는 방법 (0) | 2023.09.09 |