gpt4 book ai didi

c# - 如何自动打印带有详细选项的pdf?

转载 作者:可可西里 更新时间:2023-11-01 09:16:02 28 4
gpt4 key购买 nike

这是我要解决的场景。我工作的公司必须每天为学生打印多份 pdf。每个 pdf 的最后一页必须用蓝纸打印。我们当前的流程是手动打印 pdf 并将除最后一页之外的所有页面发送到一台有白纸库存的打印机,然后将最后一页发送到另一台托盘中有蓝纸的打印机。这既费时又乏味。我创建了一个 PowerShell 脚本,它将获取给定文件夹中的所有 pdf,并首先将 pdf 分成两部分,第一部分是所有页面,但最后一页和第二部分是最后一页。然后脚本将每个 pdf 发送到适当的打印机。

但是这些 PDF 是安全的,所以脚本不起作用。通常它们会在打开 Adob​​e Reader 几秒钟后自动解密,但由于脚本会立即打印它们,因此没有时间进行解码。

我在想:

  1. 有没有办法解决Powershell和中的加密问题
  2. 此外,能够在自动打印时选择纸盒,以便仅使用一台打印机正确打印彩色页面。 (这将是理想的,因为页面将保持有序。目前,我们没有带两个托盘的打印机,但随着公司的扩张,我们肯定会。)

据我所知,我相信#2 需要 C#,所以如果这意味着能够自动选择纸盒,我愿意放弃我的 Powershell 脚本。

这是我当前的脚本(它不漂亮,抱歉)

# Set Up Folders
$input = "C:\batchPrintPKs\unsplit_pdfs"
$output_f = "C:\batchPrintPKs\split_pdfs_f"
$output_l = "C:\batchPrintPKs\split_pdfs_l"

# Load Adobe and PDFtk (Used to split PDFs)
$adobe= 'C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe'
$pdftk = "C:\Program Files (x86)\PDFtk Server\bin\pdftk.exe"

# Printer Names
$printername_brother='Brother DCP-L2540DW series Printer'
$printername_epson='Epson854235 (ET-4550 Series)'


# Create List of Paths to Pdfs to Work With
$files1 = Get-ChildItem “c:\batchPrintPKs\unsplit_pdfs\*.pdf”

# For All PDFs in unsplit_pdfs
foreach ($file1 in $files1){

# Calculating Indexing
$Match = 'NumberOfPages: (\d+)'
$NumberOfPages = [regex]::match((& $pdftk $file1 dump_data),$Match).Groups[1].Value
$SecondToLastPage = $NumberOfPages - 1

# Making PDF of pages 1 - Second to Last
Get-Childitem -path $input -filter *.pdf -recurse | foreach {
& $pdftk $_.Fullname cat 1-$SecondToLastPage output $output_f\"f_"$_
}

# Making PDF of last page
Get-Childitem -path $input -filter *.pdf -recurse | foreach {
& $pdftk $_.Fullname cat $NumberOfPages output $output_l\"l_"$_
}

# Removing File
Remove-Item $file1
}
sleep(5)

# Brother
# Create List of Paths to Pdfs to Work With
$files2 = Get-ChildItem “c:\batchPrintPKs\split_pdfs_f\*.pdf”


# Print Each File to the Epson
foreach ($file2 in $files2){
$arglist1='/t "{0}" "{1}"' -f $file2, $printername_Brother
Start-Process $adobe $arglist1

sleep(2)
# Removing File
Remove-Item $file2
}

# Epson
# Create List of Paths to Pdfs to Work With
$files3 = Get-ChildItem “c:\batchPrintPKs\split_pdfs_l\*.pdf”

# Print Each File to the Epson
foreach ($file3 in $files3){
$arglist2='/t "{0}" "{1}"' -f $file3, $printername_Epson
Start-Process $adobe $arglist2

sleep(2)
# Removing File
Remove-Item $file3
}

最佳答案

您可以通过 COM 对象使用 Adob​​e API 轻松实现这一点。

这是一个打印页面范围的例子:

# path to PDF file
$PDF = 'C:\Users\Kiril\Downloads\file.pdf'
# declare a COM object for the Acrobat application
$App = New-Object -ComObject AcroExch.App
# declare a COM object for PDDoc
$PDDoc = New-Object -ComObject AcroExch.PDDoc
# open a PDF
$PDDoc.Open($PDF)
# get the number of pages in the pdf document
$NumPages = $PDDoc.GetNumPages()
# this hides the acrobat instance if it's visible
$App.Hide()
# this displays the document in the acrobat instance and creates an AVDoc COM object
$AVDoc = $PDDoc.OpenAVDoc("")
# printing particular pages range
$AVDoc.PrintPages(0, 1, $NumPages - 1, 0, 0)

$AVDoc 对象的方法 PrintPages 在引用文档中有详细描述。

请参阅Acrobat® and PDF Library API Reference

关于c# - 如何自动打印带有详细选项的pdf?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48304436/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com