3

VisualBasic2008で既存のファイルをプログラムでPDFに印刷しようとしています。

現在関連するアセットは次のとおりです。VisualStudio2008Professional Adob​​e Acrobat Professional 8.0

ITextSharpのようなSDKを入手することを考えましたが、Adobeのフルバージョンがあるので、特に私がやろうとしていることにはやり過ぎのようです。

PDFプリンターに印刷する(そしてもちろん特定の場所に印刷するように割り当てる)比較的単純なコードがありますか、それともPDFに印刷するために別のライブラリを使用する必要がありますか?


以前に作成したドキュメントをPDFファイルに印刷したい。この場合、.pdfファイルにしたいのは.snpファイルですが、ロジックはどのファイルタイプでも同じだと思います。


上記のシェル実行を試しましたが、希望どおりに実行されません。印刷したい場所(複数の場所)が印刷されないので、同じ名前のPDFファイルを多数作成するので重要です(PDF内に異なるデータがあり、対応するクライアントフォルダ)


現在のプロセスは次のとおりです。

  • \\ report server\client1に移動します
  • フォルダ内のすべてのsnpドキュメントのPDFファイルを手動で作成します
  • PDFを\\websitereports\client1にコピーします
  • その後、100以上のクライアントすべてに対して繰り返し、完了して確認するのに約2時間かかります

私はこれがもっとうまくいくことができることを知っていますが、私はここにたった3か月しかいませんでした、そしてもっともっと差し迫った他の差し迫った懸念がありました。また、これほど些細なことのようにコーディングするのが難しいとは思っていませんでした。

4

10 に答える 10

3

これは、VBScript で行う方法です。あまり役に立たないかもしれませんが、始めるきっかけになるかもしれません。「Adobe PDF」という名前のプリンターとして PDF メーカー (adobe acrobat) が必要です。

'PDF_WILDCARD = "*.pdf"
'PrnName = "Adobe PDF"
Sub PrintToPDF(ReportName As String, TempPath As String, _
               OutputName As String, OutputDir As String, _
               Optional RPTOrientation As Integer = 1)

  Dim rpt As Report
  Dim NewFileName As String, TempFileName As String

  '--- Printer Set Up ---
  DoCmd.OpenReport ReportName, View:=acViewPreview, WindowMode:=acHidden
  Set rpt = Reports(ReportName)
  Set rpt.Printer = Application.Printers(PrnName)

  'Set up orientation
  If RPTOrientation = 1 Then
    rpt.Printer.Orientation = acPRORPortrait
  Else
    rpt.Printer.Orientation = acPRORLandscape
  End If

  '--- Print ---
  'Print (open) and close the actual report without saving changes
  DoCmd.OpenReport ReportName, View:=acViewNormal, WindowMode:=acHidden

  ' Wait until file is fully created
  Call waitForFile(TempPath, ReportName & PDF_EXT)

  'DoCmd.Close acReport, ReportName, acSaveNo
  DoCmd.Close acReport, ReportName

  TempFileName = TempPath & ReportName & PDF_EXT 'default pdf file name
  NewFileName = OutputDir & OutputName & PDF_EXT 'new file name

  'Trap errors caused by COM interface
  On Error GoTo Err_File
  FileCopy TempFileName, NewFileName

  'Delete all PDFs in the TempPath
  '(which is why you should assign it to a pdf directory)
  On Error GoTo Err_File
  Kill TempPath & PDF_WILDCARD

Exit_pdfTest:
  Set rpt = Nothing
  Exit Sub

Err_File:    ' Error-handling routine while copying file
  Select Case Err.Number    ' Evaluate error number.
      Case 53, 70   ' "Permission denied" and "File Not Found" msgs
          ' Wait 3 seconds.
          Debug.Print "Error " & Err.Number & ": " & Err.Description & vbCr & "Please wait a few seconds and click OK", vbInformation, "Copy File Command"
          Call sleep(2, False)
          Resume
      Case Else
          MsgBox Err.Number & ": " & Err.Description
          Resume Exit_pdfTest
  End Select

  Resume

End Sub



Sub waitForFile(ByVal pathName As String, ByVal tempfile As String)
    With Application.FileSearch
        .NewSearch
        .LookIn = pathName
        .SearchSubFolders = True
        .filename = tempfile
        .MatchTextExactly = True
        '.FileType = msoFileTypeAllFiles
    End With
    Do While True
       With Application.FileSearch
           If .Execute() > 0 Then
               Exit Do
           End If
       End With
    Loop
End Sub



Public Sub sleep(seconds As Single, EventEnable As Boolean)
    On Error GoTo errSleep
    Dim oldTimer As Single

    oldTimer = Timer
    Do While (Timer - oldTimer) < seconds
       If EventEnable Then DoEvents
    Loop

errSleep:
       Err.Clear
End Sub
于 2008-10-02T20:07:30.980 に答える
3

ここで重要なポイントは、PDF は難しいということです。PDF 文書を直接作成または編集することを回避するためにできることがある場合は、そうすることを強くお勧めします。あなたが実際に望んでいるのは、バッチ SNP から PDF へのコンバーターのようです。おそらく、Visual Studio をまったく開かなくても、市販の製品を使用してこれを行うことができます。誰かが Adob​​e Distiller Server について言及しました -- Acrobat のドキュメントを確認してください。これには基本的な Distiller が付属していることを知っています。同様のモードで実行するように Distiller をセットアップできるかもしれません。ディレクトリ A を監視し、任意のファイルの PDF バージョンを出力します。ディレクトリ B に表示されます。

別の方法: Access スナップショットを使用しているため、ディレクトリ内のすべての SNP を繰り返し処理し、インストールされている PDF プリンターに出力する VBA スクリプトを作成する方がよい場合があります。

ETA: PDF プリンターの出力を指定する必要がある場合、それは難しいかもしれません。一時ディレクトリに出力するように PDF distiller を構成することをお勧めします。そうすれば、1 つのディレクトリを印刷し、結果を移動してから、別のディレクトリを印刷することができます。

于 2008-10-09T19:58:01.480 に答える
1

あなたがしたいのは、良い無料のPDFプリンタードライバーを見つけることです。これらはプリンターとしてインストールされますが、物理デバイスに印刷する代わりに、プリンターコマンドをPDFとしてレンダリングします。次に、上記のようにShellExecuteを実行するか、PDFの「プリンター」を名前で参照して組み込みの.netPrintDocumentを使用できます。PrimoBullZip(自由は10ユーザーに制限されています)の製品を含む、いくつかの無料のものをすぐに見つけました。

SNPファイルはMicrosoftAccessスナップショットのようです。プリンタの宛先を指定できるAccessまたはSnapshotViewerへのコマンドラインインターフェイスを探す必要があります。

また、SnapshotViewerのダウンロードにActiveXコントロールが含まれていることもわかりました。プログラムでそれを使用してsnpファイルをロードし、その機能をサポートしている場合は、印刷先を指定することができます。

于 2008-10-02T16:56:45.320 に答える
1

私も同じ挑戦をしました。私が行った解決策は、PDFTron というコンポーネントを購入することでした。無人サービスからプリンターに pdf ドキュメントを送信するための API があります。私はそれについて私のブログにいくつかの情報を投稿しました。見てください!

プログラムでPDFファイルを印刷する方法???

于 2010-11-17T15:22:41.407 に答える
1

PDFforgeは PDFCreator を提供しています。既存のプログラムであっても、印刷可能なプログラムから PDF を作成します。これは GhostScript に基づいているため、Acrobat のライセンスには適していない可能性があることに注意してください。

Adobe Distiller Serverを調べましたか? 任意のプリンター ドライバーを使用して PostScript ファイルを生成し、PDF に変換することができます。(実際、PDFCreator も同様のことを行います。)

于 2008-10-02T17:37:39.247 に答える
0

Print動詞でShellExecuteを使用してみてください。

Googleで見つけたブログです。

http://www.vbforums.com/showthread.php?t=508684

于 2008-10-02T17:14:22.847 に答える
0

C# ASP.NET アプリで同様の問題が発生しました。私の解決策は、生成されたコードを使用して、コマンド ラインで LaTeX コンパイラを起動することでした。これは単純なソリューションではありませんが、非常に美しい .pdf が生成されます。

于 2008-10-09T20:04:12.667 に答える
0

(SDK または PDF プリンター ドライバーを使用して) PDF を手動で生成しようとしている場合、それは簡単ではありません。PDF 形式のリファレンスは、Adobe から入手できます。

問題は、ファイルがオブジェクトを参照するためにファイル内にバイナリ オフセットを持つ ASCII とテーブルが混在していることです。これは興味深い形式であり、非常に拡張可能ですが、単純なファイルを作成するのは困難です。

必要に応じて実行可能です。私は Adob​​e PDF リファレンスの例を見て、それらを手入力し、必要に応じて機能するようになるまで作業を進めました。これを頻繁に行う場合は、それだけの価値があるかもしれません。それ以外の場合は、SDK を検討してください。

于 2008-10-02T18:12:10.273 に答える