cup-pdf로 생성된 PDF에서 텍스트를 복사/붙여넣는 방법은 무엇입니까?

cup-pdf로 생성된 PDF에서 텍스트를 복사/붙여넣는 방법은 무엇입니까?

Ubuntu 16.04의 프린터를 사용하여 LibreOffice Writer에서 PDF를 생성하면 cups-pdf결과 문서는 괜찮아 보이지만 텍스트가 깨져 복사/붙여넣기가 불가능합니다.

LO Writer의 "PDF로 내보내기" 버튼을 사용하여 동일한 문서를 인쇄하면 복사/붙여넣기가 제대로 작동하기 때문에 이 질문은 cup-pdf로 제한됩니다.

이 문제를 해결하려면 cup-pdf 프린터에서 특수 설정(예: 인코딩)을 구성해야 합니까?

답변1

나는 똑같은 동작을 확인했습니다. 이것은 오랫동안 지속된 "버그"[1][2]이며 "cups-pdf"의 작성자는 이를 버그로 간주하지 않으므로 기존 패치는 업스트림에서 사용되지 않습니다.

Ubuntu의 경우 언급된 PPA를 사용하면 작동하지만 지금은 테스트할 수 없습니다.

원래 Slackware를 사용하는 사람이라면 더 많은 기술이 필요합니다. Slackware 14.2 및 CUPS-PDF 3.0.1 [4], [7]의 경우 패치 [5][6]가 작동하지 않습니다. 너무 오래되었습니다. 맹목적인 시행착오의 기간 동안 나는 실현 가능한 해결책을 마련하려고 노력했다[8].

수동으로 설치한 다음 새 "cups-pdf"를 파일별로 매우 조심스럽게 설치해야 합니다. SlackBuild 및 install.sh를 작동하도록 제공할 수는 없습니다. 제 기술이 너무 부족합니다. 그러나 실제로 문제는 마침내 사라졌습니다.

기존 PDF 프린터를 삭제하고 수동으로 제공된 CUPS-PDF_opt.ppd를 사용하여 프린터를 추가하거나 선택적으로 CUPS-PDF.ppd를 삭제해야 합니다.

[1]https://www.linuxquestions.org/questions/linux-software-2/cannot-copy-text-from-pdfs-created-with-cups-pdf-4175440557/

[2]https://github.com/alexivkin/CUPS-PDF-to-PDF

[삼]https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=658004

[4]https://slackbuilds.org/repository/14.2/office/cups-pdf/

[5]https://bugs.launchpad.net/ubuntu/+source/cups-pdf/+bug/820820/+attachment/3878188/+files/04_add_pdf_passthrough_support.patch

[6]https://launchpadlibrarian.net/153781216/04_add_pdf_passthrough_support.patch

[7]https://bugs.launchpad.net/ubuntu/+source/cups-pdf/+bug/820820

[8]

--- a/extra/CUPS-PDF_noopt.ppd
+++ b/extra/CUPS-PDF_noopt.ppd
@@ -31,7 +31,8 @@
*ModelName:     "Generic CUPS-PDF Printer"
*ShortNickName: "Generic CUPS-PDF Printer"
*NickName:      "Generic CUPS-PDF Printer (no options)"
-*1284DeviceID:  "MFG:Generic;MDL:CUPS-PDF Printer;DES:Generic CUPS-PDF Printer;CLS:PRINTER;CMD:POSTSCRIPT;"
+*1284DeviceID:  "MFG:Generic;MDL:CUPS-PDF Printer;DES:Generic CUPS-PDF Printer;CLS:PRINTER;CMD:PDF,POSTSCRIPT;"
+*cupsFilter:    "application/pdf 0 -"
*% cupsFilter:    "application/vnd.cups-postscript 0 pstitleiconv"
*PSVersion: "(2017.000) 0"
*LanguageLevel: "2"
--- a/extra/CUPS-PDF_opt.ppd
+++ b/extra/CUPS-PDF_opt.ppd
@@ -31,7 +31,8 @@
*ModelName:     "Generic CUPS-PDF Printer"
*ShortNickName: "Generic CUPS-PDF Printer"
*NickName:      "Generic CUPS-PDF Printer (w/ options)"
-*1284DeviceID:  "MFG:Generic;MDL:CUPS-PDF Printer;DES:Generic CUPS-PDF Printer;CLS:PRINTER;CMD:POSTSCRIPT;"
+*1284DeviceID:  "MFG:Generic;MDL:CUPS-PDF Printer;DES:Generic CUPS-PDF Printer;CLS:PRINTER;CMD:PDF,POSTSCRIPT;"
+*cupsFilter:    "application/pdf 0 -"
*% cupsFilter:    "application/vnd.cups-postscript 0 pstitleiconv"
*PSVersion: "(2017.000) 0"
*LanguageLevel: "2"
--- a/src/cups-pdf.c
+++ b/src/cups-pdf.c
@@ -60,6 +60,7 @@
extern int errno;

static FILE *logfp=NULL;
+int input_is_pdf=0;

static void log_event(short type, char message[], char *detail) {
    time_t secs;
@@ -427,7 +427,7 @@
    int len;
    cp_string setup;

-  printf("file cups-pdf:/ \"Virtual PDF Printer\" \"CUPS-PDF\" \"MFG:Generic;MDL:CUPS-PDF Printer;DES:Generic CUPS-PDF Printer;CLS:PRINTER;CMD:POSTSCRIPT;\"\n");
+  printf("file cups-pdf:/ \"Virtual PDF Printer\" \"CUPS-PDF\" \"MFG:Generic;MDL:CUPS-PDF Printer;DES:Generic CUPS-PDF Printer;CLS:PRINTER;CMD:PDF,POSTSCRIPT;\"\n");

    if ((dir = opendir(CP_CONFIG_PATH)) != NULL) {
        while ((config_ent = readdir(dir)) != NULL) {
@@ -460,6 +461,7 @@
    cp_string buffer;
    int rec_depth,is_title=0;
    FILE *fpdest;
+  size_t bytes = 0; 

    if (fpsrc == NULL) {
        log_event(CPERROR, "failed to open source stream", NULL);
@@ -483,14 +485,39 @@
        log_event(CPSTATUS, "***Experimental Option: FixNewlines");
    else
        log_event(CPDEBUG, "using traditional fgets");
-  while (fgets2(buffer, BUFSIZE, fpsrc) != NULL) {
+  while ((bytes = fread(buffer, sizeof(char), 4, fpsrc)) > 0) {
+    if (!strncmp(buffer, "%PDF", 4)) {
+      log_event(CPDEBUG, "found beginning of PDF code", buffer);
+      input_is_pdf=1;
+      break;
+    }
        if (!strncmp(buffer, "%!", 2) && strncmp(buffer, "%!PS-AdobeFont", 14)) {
            log_event(CPDEBUG, "found beginning of postscript code: %s", buffer);
            break;
        }
    }
-  log_event(CPDEBUG, "now extracting postscript code");
-  (void) fputs(buffer, fpdest);
+  log_event(CPDEBUG, "now extracting code");
+  fwrite(buffer, sizeof(char), bytes, fpdest);
+  if (input_is_pdf) {
+    while((bytes = fread(buffer, sizeof(char), BUFSIZE, fpsrc)) > 0)
+      fwrite(buffer, sizeof(char), bytes, fpdest);
+/* Commented out because decoding of utf16 PDF strings isn't implemented.
+    rewind(fpsrc);
+    while (fgets2(buffer, BUFSIZE, fpsrc) != NULL) {
+      if (!is_title) {
+        char *begin = strstr(buffer, "/Title");
+        if (begin) {
+          char *end = strstr(begin, ">");
+          if (end) {
+            strncpy(title, begin+6, BUFSIZE);
+            log_event(CPDEBUG, "found title in PDF code", title);
+            is_title=1;
+          }
+        }
+      }
+    }*/
+  }
+  else {
    while (fgets2(buffer, BUFSIZE, fpsrc) != NULL) {
        (void) fputs(buffer, fpdest);
        if (!is_title && !rec_depth)
@@ -513,6 +540,7 @@
            }
        }
    }
+  }
    (void) fclose(fpdest);
    (void) fclose(fpsrc);
    log_event(CPDEBUG, "all data written to spoolfile: %s", spoolfile);
@@ -761,7 +789,12 @@
            (void) fclose(logfp);
        return 5;
    }
-  snprintf(gscall, size, Conf_GSCall, Conf_GhostScript, Conf_PDFVer, outfile, spoolfile);
+  if (input_is_pdf) {
+    snprintf(gscall, size, "cp %s %s", spoolfile, outfile);
+  }
+  else {
+    snprintf(gscall, size, Conf_GSCall, Conf_GhostScript, Conf_PDFVer, outfile, spoolfile);
+  }
    log_event(CPDEBUG, "ghostscript commandline built: %s", gscall);

    (void) unlink(outfile);

답변2

그렇다면 이 방법을 시도해 볼 수도 있습니다. Libreoffice에서 PDF 내보내기 기능을 어떻게 사용합니까? 그런 다음 그 시점부터 인쇄하거나 cup-pdf 또는 원하는 모든 것을 사용할 수 있습니다.

답변3

진짜 문제는 CUPS-PDF에 있지 않다고 생각합니다. Ghostscript에서도 안되네요.. 실제 문제를 이해하려고 며칠을 보냈습니다.. 왜 텍스트를 검색할 수 없나요? 답을 찾은 것 같아요...

한 번 보세요. 제 작업 흐름은 다음과 같습니다.

  • 클라우드에 서버가 있고 cup과 cup-pdf가 제대로 실행되고 있습니다.
  • 내 컴퓨터에 IPP 프린터(xxx.com:631/printer/My-Cups-Pdf-Printer)를 설치했습니다.
  • 이제 모든 응용 프로그램의 모든 문서를 My-Cups-Pdf-Printer로 인쇄할 수 있으며 파일은 PDF로 변환되어 내 클라우드 서버에 저장됩니다.
  • 좋습니다...이거 완벽하게 작동할 겁니다.

이제 이상한 부분은 다음과 같습니다.

  • 사후 처리를 활용하고 인쇄 후 일부 작업을 수행하기 위해 PDF 파일(my-file.pdf)을 My-Cups-Pdf-Printer로 "다시 인쇄"하고 싶다고 가정해 보겠습니다.
  • Chrome, Safari, Preview.app 및 AdobeReader.app에서 my-file.pdf를 인쇄할 수 있습니다.
  • Preview.app, chrome, safari를 사용하여 동일한 파일(my-file.pdf)을 인쇄하면 pdf 파일이 생성됩니다.검색 불가능컵-pdf에.
  • 하지만 AdobeReader.app을 사용하여 동일한 파일(my-file.pdf)을 인쇄하면 pdf 파일이 생성됩니다.검색 가능컵-pdf에.

문제는 AbobeReader.app(크롬 확장이 아님)에 모든 글꼴 인코딩이 올바르게 포함된다는 것입니다. Safari, Chrome, Preview.app 등과 같은 응용 프로그램의 운영 체제에서 사용하는 기본 프린터 시스템에는 이 명령이 포함되지 않습니다. 결과는 글꼴 인코딩, 위치에 대한 올바른 지침이 없는 PDF입니다.

문제는 Ghostscript(gs GSCall)에 있는 것 같습니다. 하지만 아닙니다. 문제는 CUPS-PDF에 있지 않습니다. 고스트스크립트에서도...

문제는 운영 체제 프린터 시스템이 PS 파일을 생성한 다음 이를 IPP 프린터(My-Cups-Pdf-Printer)로 보내는 방식에 있습니다.

누군가는 문제가 Ghostscript의 버그일지도 모른다고 생각했지만 그 역시 틀렸습니다.https://bugs.ghostscript.com/show_bug.cgi?id=692450

Ghostscript를 사용하여 명령줄에서 PS 파일을 PDF로 수동으로 변환해 보았지만 동일한 결과를 얻었습니다. AdobeReader에서 PS 파일이 생성됩니다.검색 가능텍스트. Chrome, Safari, Preview.app의 PS 파일은검색 불가능텍스트.

MacOS와 Windows에서도 동일한 상황이 발생합니다. AdobeReader로 인쇄된 두 PDF 파일 모두검색 가능마지막으로 Ghostscript와 cup-pdf에 PDF가 있습니다.

다른 사람들이 PDF 파일을 우회하여 CUPS-PDF에서 이 문제를 "수정"한 방식이 다른 작업 흐름 시나리오에서 작동할 수 있습니다(https://github.com/alexivkin/CUPS-PDF-to-PDF?tab=readme-ov-file) Ghostscript로 보내기 전에 cup-pdf의 PDF 파일을 우회하기 때문입니다.

따라서 실제로 PS(프린터의 포스트스크립트 파일)를 다루고 있지 않습니다. 이 경우 이미 간단한 PDF 파일로 작업하고 있습니다.

관련 정보