CombinePDF는 순수한 루비로 작성된 멋진 모델로 PDF 파일을 파화하고 다른 PDF 파일과 결합 (병합), 물을 뿌리거나 스탬프 (모두 PDF 파일 형식 및 순수한 루비 코드를 사용하여).
나는이 보석 유지를 중단하기로 결정했고 누군가 가이 보석의 PR 리뷰와 유지를 인수 할 수 있기를 바랍니다 (또는 단순히 성공적인 포크를 열었습니다).
Bates-Numbering 기존 PDF 문서의 문제를 해결해야했기 때문에이 보석을 썼습니다.
그러나 2014 년 이래로 나는 지역 사회와 공유하는 것을 즐겼다는 점을 제외하고는 보석을 무료로 유지하고 전혀 이유없이 보석을 유지해 왔습니다.
나는이 보석을 좋아하지만, 집중할 프로젝트가 있고 시간과 (더 중요한) Mindspace가 필요하기 때문에 계속 유지할 수는 없습니다.
루비 보석으로 설치 :
gem install combine_pdf
빠른 런 다운 :
PDF 양식을 읽을 때 일부 양식 데이터가 손실 될 수 있습니다. 나는 이것을 내 능력을 최대한 활용하려고 시도했지만 아직 모든 것이 작동하는지 확신하지 못한다.
PDF 양식을 결합 할 때 양식 데이터가 통합 될 수 있습니다. PDF가 작동하는 방식이기 때문에이 문제를 해결할 수 없었지만 (필드를 채우는 것은 같은 이름의 모든 필드의 데이터를 채우는가)이 문제를 좋아했습니다. 거의 기능입니다.
동일한 TOC 데이터를 한 번 더 통합 할 때, 참조 중 하나는 다른 쪽과 통합됩니다 (즉, 페이지가 동일하게 보이면 두 참조는 두 페이지에 연결하는 대신 동일한 페이지에 연결됩니다). PDF 파일을 병합하기 전에 페이지에 컨텐츠를 추가 하여이 문제를 해결할 수 있습니다 (즉, 모든 페이지에 빈 텍스트 상자를 추가).
일부 링크 및 데이터 (URL 링크 및 PDF "명명 된 대상")는 PDF의 루트에 저장되며 페이지에서 다시 연결되지 않습니다. 이 정보를 유지하려면 PDF 객체를 페이지 대신 병합해야합니다.
PDF 파일에서 페이지를 리핑하고 다른 PDF와 병합 할 때 일부 링크가 손실됩니다.
암호화 된 일부 PDF 파일 (일반적으로 비밀번호없이 볼 수없는 파일)은 시끄럽게 조용히 실패합니다. 시끄러운 경로를 선택하려면 CombinePDF::EncryptionError
올릴 수있는 CombinePDF.load(pdf_file, raise_on_encrypted: true)
사용하여 raise_on_encrypted
옵션을 지정할 수 있습니다.
때로는 PDF를 구문 분석 할 수있는 경우에도 CombinePDF가 예외를 제기 할 수 있습니다 (예 : PDF 선택적 컨텐츠가 존재하는 경우) ... 선택적 컨텐츠 PDF의 경우 CombinePDF.load(pdf_file, allow_optional_content: true)
.
CombinePDF GEM은 PDF 파일을 구문 분석하고 형식화하는 재귀 코드를 실행합니다. 따라서 중첩 된 객체가 심하게있는 PDF 파일뿐만 아니라 주기적 중첩을 초래하는 방식으로 결합 된 파일은 스택을 폭발시켜 예외 또는 프로그램 실패를 초래할 수 있습니다.
CombinePDF는 Ruby로 기본적으로 작성되었으며 Ruby 2.0 호환성을 따르는 모든 Ruby 플랫폼에서 (아마도) 작업해야합니다.
그러나 PDF 파일은 매우 복잡한 생물이며 보증은 제공되지 않습니다.
예를 들어, PDF 양식은 PDF를 채워진 양식 데이터와 결합하려고 시도 할 때 문제가있는 것으로 알려져 있으며 양식 데이터가 손실 될 수 있습니다 (또한 양식은 페이지별로 구체적인 글로벌 오브젝트이므로 PDF의 전체를 결합해야합니다. 보존 될 가능성이 있습니다).
PDF 링크 및 목차에도 동일하게 적용되는데,이 테이블은 모두 전역 속성을 가지고 있으며 PDF 데이터를 결합 할 때 손상되거나 손실 될 수 있습니다.
이 라이브러리가 데이터 손실을 일으키거나 집을 태우는 경우 MIT 라이센스가 지적한대로 비난하지 않습니다. 즉, 다른 솔루션에 대해 테스트 한 후 라이브러리를 행복하게 사용하고 있습니다.
PDF 파일 (또는 데이터)을 결합하려면 :
pdf = CombinePDF . new
pdf << CombinePDF . load ( "file1.pdf" ) # one way to combine, very fast.
pdf << CombinePDF . load ( "file2.pdf" )
pdf . save "combined.pdf"
또는 하나의 라이너조차도 :
( CombinePDF . load ( "file1.pdf" ) << CombinePDF . load ( "file2.pdf" ) << CombinePDF . load ( "file3.pdf" ) ) . save ( "combined.pdf" )
홀수 또는 짝수 페이지를 추가 할 수도 있습니다.
pdf = CombinePDF . new
i = 0
CombinePDF . load ( "file.pdf" ) . pages . each do | page |
i += 1
pdf << page if i . even?
end
pdf . save "even_pages.pdf"
모든 페이지를 하나씩 추가하는 것은 느린 다음 전체 파일을 추가합니다.
기존 PDF 페이지에 컨텐츠를 추가하려면 먼저 기존 PDF 파일에서 새 컨텐츠를 가져 오십시오. 그런 다음 기존 PDF의 각 페이지에 컨텐츠를 추가하십시오.
이 예에서는 각 페이지에 회사 로고를 추가합니다.
company_logo = CombinePDF . load ( "company_logo.pdf" ) . pages [ 0 ]
pdf = CombinePDF . load "content_file.pdf"
pdf . pages . each { | page | page << company_logo } # notice the << operator is on a page and not a PDF object.
pdf . save "content_with_logo.pdf"
<< 연산자가 PDF 객체가 아닌 페이지에 있음을 확인하십시오. << 연산자는 PDF 객체와 페이지에서 다르게 작동합니다.
<< 운영자는 충돌을 피하기 위해 참조 이름을 바꾸어 주입을 확보하기 위해 기본적으로 기본적입니다. 편집 할 수없는 압축 데이터를 사용하여 페이지를 오버레이하는 경우 (필터 지원이 제한되어있어) 사용할 수 있습니다.
pdf . pages ( nil , false ) . each { | page | page << stamp_page }
PDF 객체 또는 파일에 페이지 번호를 추가하는 것은 다음과 같은 간단합니다.
pdf = CombinePDF . load "file_to_number.pdf"
pdf . number_pages
pdf . save "file_with_numbering.pdf"
번호 매기기는 상자 객체의 유무에 관계없이 다른 형식의 다른 옵션으로 수행 할 수 있으며, 불투명도 값을 가질 수 있습니다. 문서를 참조하십시오.
예를 들어, 모든 PDF 페이지의 오른쪽 하단에 페이지 번호를 배치하려면 다음을 수행하십시오.
pdf . number_pages ( location : [ :bottom_right ] )
또 다른 예로서, 숫자 주위의 대시가 제거되고 상자가 주위에 배치됩니다. 번호 매기기는 반도당이며 처음 3 페이지는 숫자보다는 문자 (A, B, C)를 사용하여 번호가 매겨집니다.
# number first 3 pages as "a", "b", "c"
pdf . number_pages ( number_format : " %s " ,
location : [ :top , :bottom , :top_left , :top_right , :bottom_left , :bottom_right ] ,
start_at : "a" ,
page_range : ( 0 .. 2 ) ,
box_color : [ 0.8 , 0.8 , 0.8 ] ,
border_color : [ 0.4 , 0.4 , 0.4 ] ,
border_width : 1 ,
box_radius : 6 ,
opacity : 0.75 )
# number the rest of the pages as 4, 5, ... etc'
pdf . number_pages ( number_format : " %s " ,
location : [ :top , :bottom , :top_left , :top_right , :bottom_left , :bottom_right ] ,
start_at : 4 ,
page_range : ( 3 ..- 1 ) ,
box_color : [ 0.8 , 0.8 , 0.8 ] ,
border_color : [ 0.4 , 0.4 , 0.4 ] ,
border_width : 1 ,
box_radius : 6 ,
opacity : 0.75 )
pdf.number_pages(number_format: " %s ", location: :bottom_right, font_size: 44)
PDF 데이터로드는 파일 시스템 또는 메모리에서 직접 수행 할 수 있습니다.
파일에서 데이터로드하는 것은 쉽습니다.
pdf = CombinePDF . load ( "file.pdf" )
메모리에서 PDF 파일을 구문 분석 할 수도 있습니다. 메모리에서로드하는 것은 특히 인터넷을 통해 리시 된 PDF 데이터를 가져 오거나 새우와 같은 다른 저자 라이브러리에서 효과적입니다.
pdf_data = prawn_pdf_document . render # Import PDF data from Prawn
pdf = CombinePDF . parse ( pdf_data )
원격 위치에서 데이터를로드하여 불필요한 임시 파일의 필요성을 우회 할 때 parse
사용하는 것이 효과적입니다. 예를 들어:
require 'combine_pdf'
require 'net/http'
url = "https://example.com/my.pdf"
pdf = CombinePDF . parse Net :: HTTP . get_response ( URI . parse ( url ) ) . body
마찬가지로 로딩 및 구문 분석에 렌더링을 메모리 나 파일로 수행 할 수도 있습니다.
.to_pdf
사용하여 일련의 PDF 데이터를 출력 할 수 있습니다. 예를 들어, 사용자가 Rails 응용 프로그램 또는 Plezi 응용 프로그램에서 PDF를 다운로드 할 수 있도록하십시오.
# in a controller action
send_data combined_file . to_pdf , filename : "combined.pdf" , type : "application/pdf"
Sinatra에서 :
# in your path's block
status 200
body combined_file . to_pdf
headers 'content-type' => "application/pdf"
PDF 데이터를 파일에 저장하려면 이전 예제에서와 같이 항상 save
메소드를 사용할 수 있습니다.
일부 PDF 파일에는 항상 안정적으로 병합 될 수없는 선택적 컨텐츠 섹션이 포함되어 있습니다. 기본적으로 이러한 파일 중 하나가 감지되면 예외가 제기됩니다. 선택적으로 allow_optional_content
매개 변수를 PDFParser.new
, CombinePDF.load
및 CombinePDF.parse
메소드로 전달할 수 있습니다.
new_pdf = CombinePDF . new
new_pdf << CombinePDF . load ( pdf_file , allow_optional_content : true )
attachments . each { | att | new_pdf << CombinePDF . load ( att , allow_optional_content : true ) }
"Bates Stumping Web-App"에 대한 데모를보고 코드를 읽을 수 있습니다. 행운을 빌어요 :)
일부 PDF 파일은 암호화되고 일부는 압축되어 있습니다 (필터 사용) ...
암호화 된 파일에 대한 지원은 거의 없으며 압축 파일에 대한 매우 기본적이고 제한된 지원이 있습니다.
도움이 필요합니다.
코드를 도와 주려면 다음과 같이하십시오.
나는 자아 배운 Hobbiest입니다. 문서가 부족하고 코드의 의견은 가이드 라인이 좋지 않습니다.
코드 자체는 매우 간단해야하지만 원하는 것을 자유롭게 물어보십시오.
Stefan Leitner (@sle1tner)는 TOC를 포함하는 PDF를 지원하는 개요 병합 코드를 작성했습니다.
Caige Nichols는 코드에서 사용한 놀라운 RC4 보석을 썼습니다.
보석을 설치하고 싶었지만 인터넷에 문제가 있었고 코드 자체를 combine_pdf_decrypt 클래스 파일에 복사하게되었습니다.
그의 놀라운 것에 대한 신용은 여기에 주어집니다. 그의 라이센스와 저작권을 존중하십시오 ... 그리고 내.
MIT
GitHub 문제 페이지를보고 "도움말 원하는"태그를 볼 수 있습니다.
기부금을 생각하거나 돈을 보내면 필요하지 않습니다. 이 프로젝트는 돈없이 유지할 수 있습니다.
이 프로젝트가 필요로하는 것은 최신 정보를 보관하고 눈에 띄는 문서 오류 또는 문제를 해결하는 개발자가 제공하는 시간입니다. 선물 (예 : 무료 커피 또는 iTunes 기프트 카드)은 항상 재미 있다고 말했습니다. 그러나 나는 당신의 관대함에서 더 많은 혜택을 줄 수있는 실제 필요가 있다고 생각합니다.