eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming › wydruk pliku PDF w Visual Studio
Ilość wypowiedzi w tym wątku: 3

  • 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


strony : [ 1 ]


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: