source

Basic Powershell - Word Docx를 PDF로 일괄 변환

lovecheck 2023. 9. 9. 09:38
반응형

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

반응형