우리는 약 10대의 HP 프린터로 구성된 Ubuntu 14.04에서 실행되는 CUPS 서버를 보유하고 있습니다. 우리는 서버에 완벽하게 인쇄하기 위해 Windows, Linux 및 Mac 클라이언트를 혼합하여 사용합니다.
최근 일부 Mac이 Sierra로 업그레이드될 때까지 완벽하게 작동했습니다. 이제 사용자가 서버를 통해 인쇄를 시도하면 컵과 마찬가지로 클라이언트도 정상적으로 실행됩니다. 작업은 서버를 통해 처리되며 작업 로그에는 작업이 정상적으로 인쇄되는 것으로 표시됩니다. 그러나 프린터는 아무것도 출력하지 않습니다. Mac 클라이언트는 AirPrint를 사용하여 프린터로 직접 인쇄할 수 있습니다.
우리는 이전 버전의 cup을 가지고 있었기 때문에 최신 cup을 사용하여 새로운 16.04 서버를 구축했지만 동일한 결과를 얻었습니다. 부품이 제대로 작동하도록 포트 9100의 인쇄 서버에서 프린터로 직접 인쇄할 수 있습니다.
문제가 컵이 아니라 MacOS 12.12에 있다고 가정해도 안전합니까? 누구든지 문제를 해결할 아이디어가 있습니까?
답변1
MacOS 컴퓨터는 자체 cup 서버를 사용합니다. 최신 HP 레이저 프린터의 경우 컵은 PostScript 출력을 생성하지만 대상 프린터에 대한 몇 가지 특수 설정이 있습니다. Linux 시스템의 컵 서버는 PostScript 입력을 구문 분석하고 자체 설정을 사용하여 출력을 다시 생성합니다. Linux에서는 대부분의 HP 레이저 프린터에 대한 출력을 생성하기 위해 필터 스크립트 /usr/lib/cups/filter/hpps가 호출됩니다. 문제는 Linux의 cup에서는 무시되는 것처럼 보이는 MacOS의 PostScript 출력입니다. 빈 파일로 hpps 필터 스크립트를 호출하고 빈 페이지를 생성합니다. 프린터는 이를 무시합니다. 우리는 이 문제를 해결하기 위해 두 가지 방법을 찾았습니다.
1) MacOS 출력을 gzip으로 압축하여 Linux 서버로 보냅니다. 컵 서버는 출력의 압축을 풀고 이를 hpps 필터로 파이프합니다. 필터는 자체 머리글 및 바닥글과 함께 소스 파일을 프린터로 보냅니다. 특별한 설정(예: 배너)이 없으면 필터의 출력은 MacOS 출력과 동일합니다. 이 추가를 달성하려면
?compression=gzip
MacOS 컵 서버의 컵 URI로. 부르다https://localhost:631귀하의 브라우저(터미널에서 인터페이스를 활성화하려면 "cupsctl WebInterface=yes"를 사용하십시오). 프린터 수정을 선택하고 인증한 후 IPP 또는 IPPS 인쇄 프로토콜을 선택합니다. 대상 URI에는 이전 URI가 포함되어 있습니다. 위의 줄을 다음과 같이 추가하십시오.
ipps://<ubuntu-cups-server>/printers/<printername>?compression=gzip
설명과 모델 설정을 유지하고 저장합니다.
2) HP 프린터와 동일한 대상 URI를 사용하여 Linux 서버에 RAW 프린터를 설치합니다. 그러나 프린터 제조업체 및 모델로 Raw를 선택하십시오. 예를 들어, 프린터 이름이 "hp1"인 경우 "hp1_raw"를 두 번째 프린터로 추가합니다. MacOS에서는 RAW 프린터 URI를 대상으로 사용합니다.
ipps://<ubuntu-cups-server>/printers/hp1_raw
여전히 작은 위험이 있습니다. 누군가 Linux의 원시 대기열에 PostScript가 아닌 파일을 보내면 프린터는 해당 파일을 텍스트로 인쇄합니다. 작은 PDF 파일을 인쇄하면 기름칠된 용지가 많이 생길 수 있습니다.
답변2
hpps
패키지의 필터가 hplip
손상되었습니다. 패치를 적용합니다:
--- /usr/lib/cups/filter/hpps.shipped 2017-01-13 17:23:49.000000000 +0100
+++ /usr/lib/cups/filter/hpps 2017-03-23 14:51:09.904355996 +0100
@@ -144,6 +144,9 @@
try:
job_id, username, title, copies, options = args[0:5]
+ if len(args) > 5:
+ input_fd = os.open(args[5], os.O_RDONLY)
+
job_id = int(job_id)
except IndexError:
bug("Invalid command line: invalid arguments.")
@@ -376,7 +379,7 @@
while True:
try:
- data = os.read(0, 4096)
+ data = os.read(input_fd, 4096)
except IOError:
bug('Unable to read from standart input')
sys.exit(CUPS_FILTER_FAILED)