2017-11-11 6 views
0

많은 PDF 파일을 하나의 큰 파일로 병합하여 클라이언트에게 보내려합니다. 그러나 프로덕션 서버의 리소스가 매우 제한되어 있으므로 먼저 메모리에있는 모든 파일을 병합 한 다음 완성 된 PDF 파일을 보내면 스크립트가 사용 가능한 메모리를 모두 소모하기 때문에 종료됩니다.즉석에서 PDF 파일을 만들고 아직 끝나지 않은 상태에서 스트리밍합니까?

더 나은 서버를 얻는 것 외에도 유일한 해결책은 PDF 파일이 메모리 제한을 우회하기 전에 완전히 스트리밍되기 시작하는 것입니다.

그러나 이것이 가능한지 궁금합니다. PDF 파일을 완전히 만들기 전에 스트리밍 할 수 있습니까? 아니면 PDF 파일 형식으로 일부 헤더 또는 전체 내용이 확실한 후에 설정해야하기 때문에 미완성 파일을 스트리밍 할 수 있습니까?

가능하면 어떤 PDF 라이브러리가 파일을 스트림으로 생성 할 수 있습니까? 내가 아는 (TCPDF와 같은) 대부분의 라이브러리는 메모리에 전체 파일을 생성 한 다음 최종 결과를 어딘가에서 출력한다 (즉, $tcpdf->Output() 메소드를 통해).

답변

0

PDF 파일 형식을 완전히 스트리밍 할 수 있습니다. 어쨌든 그것을 막을 수있는 것은 없습니다.

예를 들어, 우리는 최근에 PDF 전체를 다운로드하거나 읽지 않고 원격 PDF에 대한 HTTP 연결을 통해 단일 페이지를 읽어야하는 고객이있었습니다. 우리는 PDF 내의 특정 내용에 대해 많은 작은 HTTP 요청을 만들어이를 수행 할 수 있습니다. Google은 PDF의 끝 부분에있는 예고편과 상호 참조 테이블을 사용하여 전체 PDF를 구문 분석하지 않고도 필요한 콘텐츠를 찾습니다.

문제를 이해하면 현재 사용중인 라이브러리가 병합 된 문서를 만들거나 스트리밍하기 전에 각 PDF를 메모리에로드하는 것처럼 보입니다.

이 문제를 다른 방식으로 살펴보면 PDF 라이브러리가 병합 할 PDF에 대한 참조 만 취하는 것이 더 나은 해결책이 될 것입니다. 병합 된 PDF를 만들거나 스트리밍하는 경우 콘텐츠 및 병합 할 PDF의 리소스를 필요할 때마다 병합 할 수 있습니다.

PHP로는 최신 버전이 아니기 때문에 내가 할 수있는 PHP 라이브러리가 얼마나 있는지 잘 모르겠습니다.하지만 아마도 몇 가지 C/C++ 라이브러리가있을 수 있습니다. 이 작업을 수행. 필자는 PHP가 이러한 라이브러리를 호출하기 위해 확장을 사용할 수 있음을 알고 있습니다. 단지 단점은 상용 라이센스가있을 가능성이 높다는 것입니다.

면책 조항 : 나는 Mako SDK R & D 그룹을 위해 일하므로이 작업을 수행 할 일부 라이브러리가 있는지 확실히 알 수 있습니다. :)

관련 문제