로컬 PDF 인쇄(CUPS)와 Google 클라우드 프린트 간에 품질 문제가 있습니다. (GCP가 더 좋습니다. CUPS를 사용하면 잘못된 크기, 잘못된 문자, 글꼴이 표시됩니다. 그래서 CUPS가 무엇을 하는지 궁금합니다!)
프린터 자체는 여러 형식을 처리할 수 있습니다: application/pdf(≥ 1.0, ≤ 1.7), image/jpeg, image/tiff, image/pwg-raster
몇 달 동안 저는 다양한 방법으로 CUPS에 프린터를 추가해 왔으며, CUPS가 로컬 네트워크 자체에서 프린터를 감지하는 "드라이버리스" 방식도 사용했습니다.
모든 경우에 PDF를 인쇄할 때 오류가 발생합니다. 정확하지는 않지만 인쇄는 나에게 쓸모가 없습니다. 결과: 페이지가 약 30% 확대되어 2페이지 또는 3페이지부터 글꼴이 혼합되고 문자가 기호로 바뀌고 단락이 굵게 인쇄됩니다.
동일한 프린터에서 Google Cloud Print를 통해 동일한 PDF를 인쇄하면 효과가 매우 좋습니다. PDF를 USB 스틱 프린터로 직접 보내는 것도 좋습니다. – 내 컴퓨터에서도 똑같이 좋은 결과를 인쇄할 수 있기를 바랍니다!
내 질문은 다음과 같습니다
- 각 CUPS 프린터가 실제 프린터로 전송되기 전에 내 컴퓨터에서 어떤 파이프라인을 사용하는지 알고 싶습니다. 형식을 감지합니까? 어떻게? PDF로 다시 변환되나요? 어떤 종류의 PPD를 사용합니까? 파이프라인은 어떤 다른 결정을 내리고 어떤 변환을 합니까?
- 통과된 인쇄 작업에서 알고 싶습니다. CUPS가 무엇을 감지했습니까? 어떤 변화를 일으키나요? 생성된 중간 출력은 어디서 얻을 수 있나요?
지금까지 나는 CUPS 디버깅/역엔지니어링을 위한 좋은 진입점을 찾지 못했습니다.내 거내 마음 속에 질문이 있습니다) ...
답변1
당신은 예리한 정신을 갖고 있고 벽을 오를 수 있는 숨겨진 고리를 보여주면 되기 때문에 질문의 일부에만 대답하겠습니다.
"어떤 종류의 PPD를 사용할 것인가?"
인쇄 대기열인 경우
printername
로컬로 설치됩니다("원시" 대기열이 아닌 경우). PPD를 사용합니다./etc/cups/ppd/printername.ppd
."형식을 감지할 수 있나요? 어떻게?"
네, 그렇습니다. 디버그 로깅을 활성화하면(라인
LogLevel debug
존재하다/etc/cups/cupsd.conf), 선이 보일 것입니다오류 기록읽다"자동으로 파일 가져오기...". (작업이 무언극 유형을 선언한 경우 자동으로 입력되지 않습니다.lp -d printername -o document-format=application/pdf my.pdf
.)다양한 MIME 유형에 대한 분류 규칙은 다음에 정의되어 있습니다./usr/share/cups/mime.types및 접미사와 동일한 디렉토리에 있을 수 있는 기타 파일*.유형. (또한 거기에 자신만의 규칙을 넣어서 사용자 정의 필터로 처리해야 하는 사용자 정의 MIME 유형을 정의할 수도 있습니다...)
"다른 어떤 결정이 내려지고 파이프라인에 의해 어떤 변화가 이루어지나요?"
PPD에 다음 중 하나로 시작하는 행이 없는 경우
*cupsFilter:
또는cupsFilter2:
키워드에서는 최종 인쇄 장치가 PostScript 프린터라고 가정합니다. 따라서 모든 것을 PostScript로 변환하고 PostScript로 제출하지 않습니다.하나 이상의 줄이 키워드로 시작하는 경우
*cupsFilter:
또는*cupsFilter2:
이 라인에서 인쇄 장치가 사용할 수 있는 MIME 유형을 읽고 적절한 필터 체인을 적용하여 해당 MIME 유형을 생성합니다.특정 MIME 유형을 처리할 수 있는 필터는 다음 목록에 나열되어 있습니다./usr/share/cups/mime.convs및 접미사와 동일한 디렉토리에 있을 수 있는 기타 파일*.변환. (이러한 필터로 처리하려는 MIME 유형에 대해 사용자 정의 필터를 넣을 수 있습니다...)
이것*.변환파일에는 해당 필터가 사용하고 생성할 수 있는 입력 및 출력 MIME 유형과 이 변환에 발생하는 가상 "비용"(정수)의 이름이 지정됩니다. CUPS가 구축할 수 있는 다양한 필터 체인에 직면하면 총 비용이 가장 낮은 필터 체인을
application/alpha
선택합니다 .application/zeta
"다시 PDF로 변환되나요?"
아마도 그렇지 않을 것입니다. 요청하지 않는 한, 필요한 원본 PDF의 인쇄 옵션을 사용하십시오. 한 장에 2페이지 이상을 인쇄하고, 소책자 인쇄를 위해 페이지를 재정렬하세요. 그 다음에
pdftopdf
필터를 적용하여 이를 다음으로 변환할 수 있습니다.application/pdf
도착하다application/vnd.cups-pdf
."CUPS가 무엇을 감지했나요?"
위를 참조하세요. "autotype file" 문자열을 검색하세요.
/var/log/error_log
:sudo grep -A 2 "Auto-typing file" /var/log/error_log
“어떤 변화를 가져오나요?”
보다
error_log
다시 한 번 다음을 포함하는 행을 검색하십시오.Started filter
:sudo grep "Started filter" /var/log/error_log
"생성된 중간 출력은 어디서 얻을 수 있나요?"
이 작업을 직접 수행할 수는 없습니다. 중간 형식을 작성하려면 CUPS의 각 필터에 대해 작업을 수행해야 합니다. (나할 수 있는어서 해보세요. 준비된 레시피가 있지만 그것을 적용하려면 비용을 지불해야 합니다. )
따라서 중간 출력을 얻는 것은 아마도 귀하의 범위를 벗어나는 것이므로 다른 작업을 수행할 수 있습니다.아날로그 필터 체인CUPS는 어떤 직업에도 채용할 것입니다.
매뉴얼 페이지를 읽어보면 이를 수행하는 방법을 알 수 있습니다.
cupsfilter
. CUPS가 모든 인쇄 대기열에 사용할 필터만 나열할 수도 있습니다.cupsfilter \ --list-filters \ -d <printername> \ -i <inputmime/type> \ -m <outputmime/type> \ -o "number-up=4 page-ranges=3-5,7,11" \ <filename>
답변2
귀하의 질문에는 귀하가 사용 중인 운영 체제가 명시되어 있지 않습니다. 내 대답은 "PDF 직접 인쇄"를 처리하도록 지정된 Debian 9.6 및 네트워크 연결이 있는 Kyocera FS-1350DN에 대한 것입니다. 거기~해야 한다컵 PDF 파일을 조작할 필요가 없습니다.
이를 확인하려면 컵 디버깅을 활성화해야 합니다. 불행히도 cupsctl --debug-logging
(루트로서) 오류 메시지와 함께 실패합니다 cupsctl: Forbidden
. /etc/cups/cupsd.conf 파일에 cupd를 설정 LogLevel debug
하고 cupd를 다시 시작한 후 lpr scale.pdf
.
/var/log/cups/error_log(총 300줄)의 관련 줄은 다음과 같습니다.
⋮
D [11/Dec/2018:17:50:02 +0100] [Job 319] Request file type is application/pdf.
⋮
D [11/Dec/2018:17:50:02 +0100] [Job 319] 3 filters for job:
D [11/Dec/2018:17:50:02 +0100] [Job 319] pdftopdf (application/pdf to application/vnd.cups-pdf, cost 66)
D [11/Dec/2018:17:50:02 +0100] [Job 319] pdftops (application/vnd.cups-pdf to application/vnd.cups-postscript, cost 100)
D [11/Dec/2018:17:50:02 +0100] [Job 319] - (application/vnd.cups-postscript to printer/fs1350, cost 0)
⋮
I [11/Dec/2018:17:50:02 +0100] [Job 319] Started filter /usr/lib/cups/filter/pdftopdf (PID 16570)
I [11/Dec/2018:17:50:02 +0100] [Job 319] Started filter /usr/lib/cups/filter/pdftops (PID 16571)
I [11/Dec/2018:17:50:02 +0100] [Job 319] Started backend /usr/lib/cups/backend/socket (PID 16572)
⋮
D [11/Dec/2018:17:50:02 +0100] [Job 319] pdftops - copying to temp print file \"/tmp/040bb5c158ce7\"
⋮
D [11/Dec/2018:17:50:02 +0100] [Job 319] PID 16570 (/usr/lib/cups/filter/pdftopdf) exited with no errors.
⋮
D [11/Dec/2018:17:50:02 +0100] [Job 319] 319 h scale.pdf 1 \'finishings=3 job-uuid=urn:uuid:045216b6-e2e0-34ee-50af-36c3bdbdc04f job-originating-host-name=192.168.0.2 date-time-at-creation= date-time-at-processing= time-at-creation=1544547002 time-at-processing=1544547002 document-name-supplied=scale.pdf\'
⋮
D [11/Dec/2018:17:50:02 +0100] [Job 319] Running command line for gs: gs -q -dNOPAUSE -dBATCH -dSAFER -dNOMEDIAATTRS -sDEVICE=ps2write -sOUTPUTFILE=%stdout -dLanguageLevel=3 -r1200 -dCompressPages=false -dCompressFonts=false -dNoT3CCITT -dNOINTERPOLATE -c \'save pop\' -f /tmp/040bb5c158ce7
D [11/Dec/2018:17:50:02 +0100] [Job 319] Started filter gs (PID 16577)
D [11/Dec/2018:17:50:02 +0100] [Job 319] Started post-processing (PID 16578)
⋮
D [11/Dec/2018:17:50:02 +0100] [Job 319] Started filter pstops (PID 16579)
⋮
D [11/Dec/2018:17:50:02 +0100] [Job 319] %!PS-Adobe-3.0
D [11/Dec/2018:17:50:02 +0100] [Job 319] %%BoundingBox: 0 0 595 842
D [11/Dec/2018:17:50:02 +0100] [Job 319] %%HiResBoundingBox: 0 0 595.00 842.00
D [11/Dec/2018:17:50:02 +0100] [Job 319] %%Creator: GPL Ghostscript 920 (ps2write)
D [11/Dec/2018:17:50:02 +0100] [Job 319] %%LanguageLevel: 2
D [11/Dec/2018:17:50:02 +0100] [Job 319] %%CreationDate: D:20181211175002+01\'00\'
D [11/Dec/2018:17:50:02 +0100] [Job 319] %%Pages: 1
D [11/Dec/2018:17:50:02 +0100] [Job 319] %%EndComments
⋮
D [11/Dec/2018:17:50:02 +0100] [Job 319] PID 16577 (gs) exited with no errors.
⋮
D [11/Dec/2018:17:50:02 +0100] [Job 319] PID 16578 (Post-processing) exited with no errors.
⋮
D [11/Dec/2018:17:50:02 +0100] [Job 319] PID 16579 (pstops) exited with no errors.
⋮
D [11/Dec/2018:17:50:02 +0100] [Job 319] PID 16571 (/usr/lib/cups/filter/pdftops) exited with no errors.
⋮
포함된 행은 - (application/vnd.cups-postscript to printer/fs1350, cost 0)
cup이 후처리기(프린터 드라이버라고도 함) /etc/cups/ppd/fs1350.ppd를 사용하고 있음을 알려줍니다. 동일한 프로세스의 다른 보기를 보려면 - 명령을 사용하십시오 ps
. 하나발췌산출
while true ; do date +'%N'>> log; ps axSfu | fgrep -v grep | egrep '^lp[[:space:]]|/usr/sbin/cupsd' >> log ; done
이것은
⋮
root 15796 0.1 0.1 171440 8536 ? Ssl 17:49 0:00 /usr/sbin/cupsd -l
lp 16571 0.0 0.0 77632 5728 ? S 17:50 0:00 \_ fs1350 319 h scale.pdf 1 finishings=3 number-up=1 job-uuid=urn:uuid:045216b6-e2e0-34ee-50af-36c3bdbdc04f job-originating-host-name=192.168.0.2 date-time-at-creation= date-time-at-processing= time-at-creation=1544547002 time-at-processing=1544547002 document-name-supplied=scale.pdf
lp 16577 0.0 0.2 129760 20836 ? R 17:50 0:00 | \_ gs -q -dNOPAUSE -dBATCH -dSAFER -dNOMEDIAATTRS -sDEVICE=ps2write -sOUTPUTFILE=%stdout -dLanguageLevel=3 -r1200 -dCompressPages=false -dCompressFonts=false -dNoT3CCITT -dNOINTERPOLATE -c save pop -f /tmp/040bb5c158ce7
lp 16578 0.0 0.0 77632 924 ? S 17:50 0:00 | \_ fs1350 319 h scale.pdf 1 finishings=3 number-up=1 job-uuid=urn:uuid:045216b6-e2e0-34ee-50af-36c3bdbdc04f job-originating-host-name=192.168.0.2 date-time-at-creation= date-time-at-processing= time-at-creation=1544547002 time-at-processing=1544547002 document-name-supplied=scale.pdf
lp 16579 0.0 0.0 75424 5288 ? S 17:50 0:00 | \_ fs1350 319 h scale.pdf 1 finishings=3 job-uuid=urn:uuid:045216b6-e2e0-34ee-50af-36c3bdbdc04f job-originating-host-name=192.168.0.2 date-time-at-creation= date-time-at-processing= time-at-creation=1544547002 time-at-processing=1544547002 document-name-supplied=scale.pdf
lp 16572 0.0 0.0 79792 5900 ? S 17:50 0:00 \_ socket://fs1350.xxxx.xxxx.xxx 319 h scale.pdf 1 finishings=3 number-up=1 job-uuid=urn:uuid:045216b6-e2e0-34ee-50af-36c3bdbdc04f job-originating-host-name=192.168.0.2 date-time-at-creation= date-time-at-processing= time-at-creation=1544547002 time-at-processing=1544547002 document-name-supplied=scale.pdf
⋮
cups
사전 필터(pdftops, PID 16571, 여기서는 fs1350으로 명명됨)와 백엔드(PID 16572, 여기서는 소켓://fs1350.xxxx.xxxx.xxx로 명명됨)를 호출하라고 지시합니다 . 사전 필터 호출 gs
. 전체 처리 시간은 0.2초 미만이므로 출력을 파일로 수집하는 것이 좋습니다. date +'%N'
타이밍을 이해하는 것 뿐입니다 .
명백히 불필요한 스케일링(댓글에 썼던 내용)은 evince→Print→Print Setup→Scale→100%
다음과 같습니다.조용히 덮어통과 evince→Print→Page Handling→Fit to Printable Area
. 따라서 인쇄 클라이언트를 다시 확인하십시오.
아아, 그게 전부가 아닙니다. 컵을 우회하고 프린터의 "PDF 직접 인쇄" 기능을 사용하기 위해 파일을 직접 보냈습니다. nc fs1350.xxxx.xxxx.xxx 9100 < scale.pdf
10분 이상의 처리 시간이 지난 후 프린터에서 용지를 보냈습니다.
원시 인쇄에는 netcat을 사용하십시오. 숫자는 밀리미터 단위의 치수를 나타냅니다.
lpr→cups를 사용하여 출력물 인쇄
파일의 비트맵 이미지(1200dpi)
프린터 설정 "오버레이 A4/LT"에 관계없이 원본 인쇄의 배율은 97.7%인 반면 lpr→cups 인쇄의 배율은 정상입니다. 원본 인쇄물의 도트 게인은 작은 반면, lpr→cups 인쇄물의 도트 게인은 약간 적습니다.
이전 도면의 페이지 크기 줄이기날것의인쇄가 확장되었습니다.
답변3
여기에 추가하겠습니다... 저는 CUPS 2.3.3op2를 사용하여 Gentoo Linux를 실행하고 있으며 IPP Everywhere를 통해 Xerox VersaLink C405에 작업을 보냅니다. 프린터는 기본적으로 PDF, PCL6, PCL5e 및 XPS뿐만 아니라 PostScript(에뮬레이션이 아닌 실제 Adobe PostScript 3)를 지원합니다.
로그의 디버그 정보로 판단하면 CUPS는 입력 형식에 관계없이 PostScript를 컴퓨터로 보내고 있습니다. PDF 데이터를 다음으로 파이핑할 때 표시되는 내용은 다음과 같습니다 lp
(가독성을 위해 날짜는 제거됨).
[Job 61] 3 filters for job:
[Job 61] pdftopdf (application/pdf to application/vnd.cups-pdf, cost 66)
[Job 61] pdftops (application/vnd.cups-pdf to application/vnd.cups-postscript, cost 100)
[Job 61] - (application/vnd.cups-postscript to printer/vlc405, cost 0)
PDF를 프린터로 직접 보내려면 CUPS를 완전히 우회하고 netcat을 사용하여 프린터의 포트 9100으로 직접 데이터를 보낼 수 있습니다(활성화되어 있다고 가정).
nc 192.0.2.0 9100 < file.pdf
(IP 주소를 프린터의 IP 주소로 바꾸세요.)
귀하의 컴퓨터가 PostScript 또는 PDF를 직접 지원하지 않는 경우 이 방법은 적용되지 않습니다. 정품 Adobe PostScript 3은 일반적으로 사무용으로 제한된 고급 레이저 프린터를 지원합니다. 소비자 프린터는 PWG Raster 또는 PDF를 사용하여 IPP Everywhere를 구현할 수 있습니다. 일부는 신뢰할 수 없는 PostScript 3을 모방합니다. (Adobe 참조 구현은 라이센스 비용이 많이 들기 때문에 에뮬레이션이 자주 사용됩니다.)