2012-11-27 8 views
5

Próbuję utworzyć własną siatkę (która wygląda bardzo podobnie: http://tinyurl.com/cdyre6k - Papier EKG, który jest w jednostkach metrycznych milimetry).Tworzenie w języku Python/PDF za pomocą ReportLab - wydruki w siatce wykonane własnoręcznie z wzorem, ale na ekranie wygląda dobrze

Używam ReportLab/Python (opensource) do tworzenia raportów. Poniżej znajduje się fragment mojego kodu.

Na ekranie wygląda świetnie !:

>What I see on the screen<

Jednak kiedy wysłać to do drukarki (i tak, ja też majstrował z ustawieniami drukarki) drukuje kilka linii, a nie inne (czasami jest metodyczne i drukuje wzór w kratkę, innym razem jest grubsze/cieńsze linie, należy pamiętać, że dane wyjściowe w drukarce są zgodne w zależności od ustawionych przeze mnie ustawień).

>What I see at the printer!<

Próbowałem wszelkiego rodzaju kombinacje strokewidth, oraz wszelkiego rodzaju kombinacje ustawień drukarki ... Nie mogę go wydrukować poprawnie! Próbowałem alternatywnej drukarki i uzyskałem DUŻO lepsze wyniki, ale muszę ustawić ustawienia drukarki na ponad 1200 dpi (drukowanie na poziomie CAD). Druga drukarka jest ustawiona na 600dpi. Na tej SAME PRINTER (600dpi) drukuję dokument zrobiony przez byłego współpracownika, a wydruk jest w porządku (uwaga: nie korzystał z ReportLab, więc nie mogę użyć jego kodu/rozwiązania).

Co się dzieje? Czy to jest problem z aliasingiem w drukarce? Czy pomógłbym, gdybym pokrył moje siatki bitmapami (lub innym formatem)? Jak mogę to naprawić (jedynymi opcjami są Python i ReportLab)? Podręcznik ReportLab nie pomógł, "Google" nie pomogło, a poprzednie pytania dotyczące StackExchange nie obejmowały tego konkretnego tematu. Mogę uzyskać siatkę, aby wydrukować wszystkie linie, jeśli ustawię szerokość strokewidth na "1", ale wtedy drobne linie siatki są zbyt grube.

Wynik końcowy dotyczy wykresu liniowego, nad którym pracuję i wiem, że ReportLab ma funkcje wykresu, ale wykresy/funkcje siatki raportów nie dają mi tego, czego potrzebuję do mojego projektu, więc byłem zmuszony do stworzenia własnej siatki z liniami dur/minor (może coś przeoczyłem i otworzyłem na alternatywne techniki, ale obecnie wygląda dobrze w formie PDF, po prostu nie na drukarce).

WSZYSTKIE porady są mile widziane!

TIA,

-J

for i in decimal_range(0, _time, 1): 
     if (i % 5.0 == 0): 
      if (i % 25.0 == 0): 
       grid_pattern.add(shapes.Line(_temp_x, 
              (_temp_y + _height_of_box), 
              _temp_x, 
              (_temp_y + _height_of_box+4), 
              strokeWidth=1, 
              strokeColor=colors.black)) 
      else: 
       pass 

      grid_pattern.add(shapes.Line(_temp_x, _temp_y, _temp_x, 
             (_temp_y + _height_of_box), 
             strokeWidth=.12, 
             strokeColor=colors.pink)) 
     else: 
      grid_pattern.add(shapes.Line(_temp_x, _temp_y, _temp_x, 
             (_temp_y + _height_of_box), 
             strokeWidth=.12, 
             strokeColor=colors.pink)) 
     _temp_x += 1 * mm 

    _temp_x = xorigin 

    for i in range(0, _mv, 1): 
     if (i % 5.0 == 0): 
      grid_pattern.add(shapes.Line(_temp_x, _temp_y, 
             _temp_x + _width_of_box, 
             _temp_y, strokeWidth=.12, 
             strokeColor=colors.pink)) 
     else: 
      grid_pattern.add(shapes.Line(_temp_x, _temp_y, 
             _temp_x + _width_of_box, 
             _temp_y, strokeWidth=.12, 
             strokeColor=colors.pink))  
     _temp_y += 1 * mm 

UPDATE1

Próbowałem ustawienie szerokości skoku na "0" jako zalecany przez kilka plakatów (i/listy społeczności ReportLab) w następujący sposób:

grid_pattern.add(shapes.Line(_temp_x, _temp_y, _temp_x, 
          (_temp_y + _height_of_box), 
          strokeWidth=0, 
          strokeColor=colors.pink)) 

To sprawia, że ​​linia o szerokości jednego piksela, która znowu wygląda świetnie na PC, ale nadal drukuje z efektownym wzorem w formacie PDF.

Update2 + ROZWIĄZANIE

Po wielu napady złości i argumentów z ReportLab i mojego komputera okazuje się, że to nie był mój PC lub ReportLab.To były drukarki (korzystałem z dwóch całkowicie różnych drukarek, Canon i HP - niezależnie od modelu) - czułem, że mam wystarczającą ilość zasięgu, aby wykluczyć drukarkę, ale jest więcej problemów z tym problemem! Kontynuuj czytanie ...

ReportLab tak naprawdę nie rysuje linii, po prostu dodaje wiersz postscriptowy, który mówi renderowi, aby narysować linię.

Część mojego początkowego debugowania obejmowała zmianę kolorów, których używałem, aby zobaczyć, czy to był problem - cóż - zmieniłem kolory z różowego na czerwony (niewiele zmian, wiem, ale znowu, przyjęto I Zmieniłem go wystarczająco, aby wykluczyć kolory jako problem).

Cóż z tego, co ostatnio i boleśnie nauczyłem się, jest to, że drukarki konwertują kolory do skali szarości za pomocą formuły, a ta formuła ma tendencję do wywoływania efektów ubocznych antyaliasingu (jak to, co widziałem).

ROZWIĄZANIE: było zmienić kolory siatki. Niektóre kolory działają lepiej niż inne. Aby przetestować to, napisałem prosty skrypt, który można wygenerować w formacie PDF przy użyciu wszystkich kolorów przechowywanych w słowniku kolorów raportów - wydrukuj próbną siatkę, która spowodowała problemy i podaj wartości RGB. Jak się okazuje, wszystkie rodzaje kolorów nie drukują się dobrze na kilku drukarkach (wszystkie inne) - to nie tylko czerwone/różowe ... niektóre "czerwone" kolory drukują dobrze, niektóre drukarki obsługują konwersję skali szarości lepiej niż inne .

Naszym zadaniem jest teraz użyć utworzonego dokumentu PDF, aby znaleźć kolor, który wygląda dobrze na wydruku (zarówno w kolorze, jak iw skali szarości) i na ekranie.

Jeśli nie chcesz pobierać skryptu ze strachu, jestem zły - przynajmniej sprawdź plik PDF i wydrukuj własne próbki, aby sprawdzić, czy możesz odtworzyć problem, który miałem (drukowałem w rozdzielczości 600 dpi - standard - nic nadzwyczajnego ... pamiętaj, że gdybym podniósł ustawienia DPI/jakości, wydrukował dobrze, ale standardowe ustawienia wywoływały we mnie żałobę!).

Script

lub

PDF

Odpowiedz

5

Jeśli rozumiem jak ReportLab obsługuje linie poprawnie, prosisz go do tworzenia linii z odpowiednio 1 i 0,12 jednostek przestrzeni użytkownika. W formacie PDF jedna "jednostka przestrzeni użytkownika" wynosi 1/72 cala.

Oznacza to, że rysowane linie będą miały odpowiednio 0,014 i 0,0017 cala szerokości. To naprawdę niewiele. W zależności od rozdzielczości urządzenia wyjściowego i miejsca na linii (tak, w zależności od tego, czy jest to wyrównane do siatki pikseli ekranu lub drukarki), prawdopodobnie uzyskasz inne wyniki.

Twoja drukarka prawdopodobnie spróbuje zoptymalizować wydruk za pomocą wygładzania, co sprawi, że wynik końcowy stanie się jeszcze bardziej niepewny.

Efekt wyrównania z siatką pikseli drukarki jest prawdopodobnie przyczyną pojawienia się niektórych linii i braku widoczności innych.

Kilka rzeczy do spróbowania/zabawy.

1) Wypisz linie o szerokości linii 0. Jest to specjalny przypadek w formacie PDF i oznacza "wypisz linię o szerokości dokładnie jednego piksela". Należy pamiętać, że taka linia powinna być widoczna na ekranie (co oznacza tylko 72 lub 96 dpi), ale może nie być na twojej drukarce (która będzie teraz drukować kropkę o wartości 1/1200 cala).Ale jeśli twoja drukarka jest posłuszna zasadom, zawsze powinna wydrukować tę jedną kropkę.

2) Rozszerz swoje linie - prawdopodobnie jedyny sposób uzyskania spójnych rezultatów. Jeśli mniejsze linie wyglądają zbyt grubo, warto rozważyć wydrukowanie kropkowanej linii zamiast stałej (ustawienie wzoru kreski).

+0

Dzięki za sugestie, wypróbowuję je teraz i opowiem o swoich odkryciach. –

+0

Próbowałem szerokości obrysu 0, ale to pogorszyło model = /. Próbowałem już drukować na wielu drukarkach - ten sam dokładny wzór (więc zakładam, że to Adobe Reader powoduje problem + mój kod). Mimo to, jeśli podniosę ustawienia drukowania, mogę wydrukować siatkę (tak jak poprzednio). Tworzenie grubszych linii również nie działa ... niektóre linie są drukowane trochę ciemniej/grubsze niż inne (nie wiem, dlaczego tak się dzieje). Jakieś inne sugestie? –

+0

Czy możesz udostępnić przykładowy plik PDF, który stworzyłeś, abyśmy mogli go obejrzeć? Ponadto, gdy powiesz, że wydrukowano "grubsze", czy możesz powiedzieć, jak zwiększyłeś szerokość linii? –

1

Myślę, że ustawienie szerokości obrysu 0 jest tym, czego potrzebujesz. W ten sposób powstaje specjalny rodzaj linii, często nazywany linią włosów. Zasadniczo informuje drukarkę, aby wydrukowała najcieńszą możliwą linię (szerokość kropli z drukarki atramentowej lub szerokość lasera w drukarce laserowej). Nie jestem pewien, czy wszystkie przeglądarki PDF będą wyświetlały go tak, jak się spodziewasz, ale mimo to powinieneś spróbować go wydrukować.

+0

Dzięki, Damian, szerokość linii 0 nie wydaje mi się pomocna. jako am przykład mi pomocą tego szczególności: grid_pattern.add (shapes.Line (_temp_x, _temp_y, _temp_x, (_temp_y + _height_of_box) strokeWidth = 0 strokeColor = colors.pink)) –

+0

Meh , który nie wkleił się zbyt dobrze. Będę edytować mój pierwotny wpis. –

2

Nie do końca pewna, jak zastosować to do tego, co robisz, ale tradycyjnym sposobem PostScript jest zaokrąglenie współrzędnych urządzenia do liczb całkowitych.

/roundpoint { % x y -> x' y' 
    transform %convert user-space coords to device-space coords 
    round 
    itransform %convert device-space back to user-space 
} def 

... 
x y roundpoint moveto 
x y roundpoint lineto 
... 

Jeśli wszystkie linie są rozmieszczone konsekwentnie w odniesieniu do pikseli urządzenia, to powinny być również rysowane konsekwentnie.

Powiązane problemy