-
1. Data: 2009-07-05 07:07:41
Temat: wydruk pliku PDF w Visual Studio
Od: "Wiesław Szahun" <a...@a...com.pl>
Witam
Mam taki problem. Muszę wydrukować automatycznie (bez pytania o drukarkę,
itp) kilka plików PDF na przemian z ReportViewerem, tj.:
plik PDF1, ReportViewer, plik PDF2, ReportViewer, itd.
Samo wydrukowanie ReportViewera czy PDF-a nie sparawia problemu. Problem
pojawia się, gdy obie procedury połącze w jedno.
W przypadku ReportViewera, wiem dokładnie kiedy wydruk się zaczął i
zakończył. W przypadku PDFa nie wiem kiedy dotarł do spoolera drukarki, aby
móc aktywować następny wydruk. Ustawienie zwłoki nie wile daje, no chyba że
byłoby to kilkanaście skeund, ale wówczas przy wydruku kilkunastu dokumntów
trwa to strasznie długo.
Do wydruku PDF-a w necie znalazłem dwa rozwiązania:
1. AcroPDFLib z AcroPDF.dll - ale tego nie udało mi się uruchomić (jeśli
ktoś ma kawałek chodzącego kodu, to chętnie skorzystam),
2. wykorzystując System.Diagnostics.Process i uruchamiając wydruk poprzez
AcrobatReader.
punkt 2. działa, z małym minusem, bo aktywuje okno procesu ArobatReadar
uruchomionego w trakcie startu systemu, ale można je zminimalizować i po
problemie (nie zamykać, bo znowu wyskoczy).
Z tego co zauważłem, to wywołanie acrobat readera, nawet w sposób
bezpośredni (StartInfo.ExecuteShell=false; StartInfo.FileName = <ścieżka do
AcroRd32.exe> praktycznie momentalnie się kończy, bo prces realizacji
wydruku jest zlecany innemu porcesowi, a ten który wywołałem się kończy,
więc otrzymuję informację że mogę drukować nastęny dokument, choć w
rzeczywiśtości wydruk wogóle się jeszcze nie rozpoczął. Efekt, wydruk
wygląda nastęująco: ReportViewer1, reportViewer2(rep2), Rep3, PDF1, rep4,
rep5, PDF2, rep6, itd. przy czym obserwuję losową ilość wydruków
reportViewera pomiędzy poszczególnymi PDF (średnio od 2 do 4)
Próbowałem też wydruku poprzez załadowanie pliku PDf do WebBrowsera, i
uruchomienie funkcji wydruku WebBrowsera, ale o ile działa to dla Html, to
nie działa dla PDF, pewnie trzeba byłoby się odwołać do kontrolki OCX, bo
to ona w rzeczywostości wyświetla PDF, ale nie wiem jak.
A teraz pytanka:
1. Czy ktoś wiem, jak kontrolować proces wydruku AcrobatReadera.
2. Jak ewentulanie kontrolować wydruk WebBrowsera, jeśli zawartość
wyświetlana jest przez kontrolki.
3. jka mozna ewentualnie w inny sposób wydrukować plik PDF
ps. projekt mam w C#, ale żaden problem jeśli rozwiązanie byłoby w C++ lub
VB, ważne aby dało się zaimplementować w Visual Studio 2008.
pozdrwiam
z góry dzięki za wszelką pomoc
Wiesław Szahun
-
2. Data: 2009-07-05 08:01:49
Temat: Re: wydruk pliku PDF w Visual Studio
Od: Michoo <m...@v...pl>
Wiesław Szahun pisze:
> wygląda nastęująco: ReportViewer1, reportViewer2(rep2), Rep3, PDF1, rep4,
> rep5, PDF2, rep6, itd. przy czym obserwuję losową ilość wydruków
> reportViewera pomiędzy poszczególnymi PDF (średnio od 2 do 4)
Łączenie drukarką wielu dokumentów w 1 bez synchronizacji...ciekawy
pomysł ;)
Ja bym albo czekał na zniknięcie zadania druku z kolejki przed wysłaniem
nowego, albo, co wydaje się odpowiedniejsze, przeprowadzał drukowanie w
2 fazach - utworzenie zbiorczego pliku pdf/ps a następnie jego wydruk.
Do pierwszego klasa Win32_Printer, drugie na plikach ps można uzyskać za
pomocą PSUtils, dla pdf do głowy przychodzi mi tylko cykl pdf->ps,
merge, ps->pdf - zajmuje to trochę czasu i jest "nieeleganckie" ale działa.
--
Pozdrawiam
Michoo
-
3. Data: 2009-07-06 11:55:08
Temat: Re: wydruk pliku PDF w Visual Studio
Od: "Wiesław Szahun" <a...@a...com.pl>
Witam
Michoo <m...@v...pl> napisał(a):
> Ja bym albo czekał na zniknięcie zadania druku z kolejki przed wysłaniem
Dzięuję za podpowiedź, w pewnym sensie wykorzystałem Twój pomysł, a tak dla
potomnych wygląda to tak:
deklarujemy System.Diagnostics.Process, w StartInfo ustawiamy:
Filename=<ArcoRd32.exe z pełnąścieżką dostęu>,
Arguments = "/p /h "+nasz plik z pełną scieżką dostępu - > wówczas wysdruk
idzie na drukarkę domyślną; lub
Arguments ="/p /h /t"+nasz plik z pełną ścieżką + " " + nazwa drukarki
obowiązkowo w podwójnym czudzysłowiu (")
WorkingDirectory = <katalog w którym jest PDF>
ShellExecutu=false;
można jeszcze pomanipulować CreateNoWindow i WindowStyle według własnego
uznania
Teraz zadajemy Start() i WaitForExit(2000) (2000ms, bo u mnie wydruk średni
trwał około 1 do 1,2 sekundy) i włąściwie wszystko powinno być OK, a nie
jest bo AcrobatReader jest "be", i po zakończeniu wydruku nie kończy pracy
tylko sobie czeka (niewiadomo na co). Poza tym nie wiemy czy wydruk już sie
skończył, więc nie możemy zrobić Close() lub Kill(), bo może się okazać, że
raz będzie ok(bo dokument już trafioł do spoolera), ale innym razem już
nie(bo komputer obciążyło inne zadanie i wydruk trwał znacznie dłużej).
Problem rozwiązałem poprzez sprawdzenie czy w spoolerze drukarki znajduje
się już Job o nazwie mojego pliku, którego data jest póżniejsza niż start
procesu. Jesli zadanie wydruku już jest to można zabić proces i mamy
pewniość że wyjdzie nam dokument w takiej kolejności jaką sobie
założyliśmy.
Dlaczego nie spradamczy dokument jest już wydrukowany, jak doradzał
Michoo(jeszcze raz dzięki), bo umieszczenie dokumentów w spolerze trwa
znacznie szybciej, niż ich późniejszy wydruk, poza tym zawsze może
zabraknąć papieru i całą plikacja bedzie wisieć.
spooler sprawdzam poprzez wykorzystanie klas
System.Printing.LocalPrintServer, System.Printing.PrintQueue,
System.Printing.PrintJobInfoCollection, System.Printing.PrintSystemJobInfo.
I jeszcze uwaga, jeśli będziemy sprawdzać zawartość kolejki wydruku, nie
polecam robienie tego poprzez Refresh() - mii czasami to nie dizałało - nie
widział nowych zadań wydruku. Lepiej zawsze odczytać zadania poprzez
GetPrintJobInfoCollection().
pozdrawiam
Wiesław Szahun