CombinePDF เป็นแบบจำลองที่ดีเขียนด้วยทับทิมบริสุทธิ์เพื่อแยกวิเคราะห์ไฟล์ PDF และรวม (รวม) กับไฟล์ PDF อื่น ๆ , ลายน้ำหรือประทับตรา (ทั้งหมดใช้รูปแบบไฟล์ PDF และรหัสทับทิมบริสุทธิ์)
ฉันตัดสินใจที่จะหยุดการบำรุงรักษาอัญมณีนี้และหวังว่าจะมีใครบางคนสามารถรับบทวิจารณ์ประชาสัมพันธ์และการบำรุงรักษาอัญมณีนี้ (หรือเพียงแค่เปิดส้อมที่ประสบความสำเร็จ)
ฉันเขียนอัญมณีนี้เพราะฉันต้องการแก้ปัญหาด้วยเอกสาร PDF ที่มีอยู่ของเบตส์
อย่างไรก็ตามตั้งแต่ปี 2014 ฉันได้รักษาอัญมณีไว้ฟรีและไม่มีเหตุผลเลยยกเว้นว่าฉันสนุกกับการแบ่งปันกับชุมชน
ฉันรักอัญมณีนี้ แต่ฉันไม่สามารถรักษาไว้ได้เพราะฉันมีโครงการของตัวเองที่จะมุ่งเน้นของตัวเองและฉันต้องการทั้งเวลาและ (ที่สำคัญกว่า) Mindspace
ติดตั้งด้วยอัญมณีทับทิม:
gem install combine_pdf
rundown ด่วน:
เมื่ออ่านแบบฟอร์ม PDF ข้อมูลแบบฟอร์มบางอย่างอาจหายไป ฉันลองแก้ไขสิ่งนี้ให้ดีที่สุดเท่าที่จะทำได้ แต่ฉันยังไม่แน่ใจว่ามันใช้งานได้ทั้งหมด
เมื่อรวมรูปแบบ PDF ข้อมูลแบบฟอร์มอาจรวมเป็นหนึ่งเดียว ฉันไม่สามารถแก้ไขได้เพราะนี่เป็นวิธีการทำงานของ PDF (การเติมฟิลด์กรอกข้อมูลในข้อมูลในสาขาใด ๆ ที่มีชื่อเดียวกัน) แต่ตรงไปตรงมาฉันชอบปัญหา ... มันเกือบจะเป็นคุณสมบัติ
เมื่อรวมข้อมูล TOC เดียวกันมากกว่าหนึ่งครั้งหนึ่งในการอ้างอิงจะรวมเป็นหนึ่งเดียว (หมายความว่าหากหน้าดูเหมือนกันการอ้างอิงทั้งสองจะเชื่อมโยงไปยังหน้าเดียวกันแทนที่จะเชื่อมโยงไปยังสองหน้าแตกต่างกัน) คุณสามารถแก้ไขได้โดยการเพิ่มเนื้อหาลงในหน้าก่อนที่จะรวมไฟล์ PDF (เช่นเพิ่มกล่องข้อความที่ว่างเปล่าในหน้าทั้งหมด)
ลิงก์และข้อมูลบางส่วน (ลิงก์ URL และ PDF "ชื่อปลายทาง") ถูกเก็บไว้ที่รูทของ PDF และพวกเขาไม่ได้เชื่อมโยงกลับไปจากหน้า การเก็บข้อมูลนี้ต้องใช้การรวมวัตถุ PDF แทนที่จะเป็นหน้าเว็บของพวกเขา
ลิงค์บางส่วนจะหายไปเมื่อฉีกหน้าออกจากไฟล์ PDF และรวมเข้ากับ PDF อื่น
ไฟล์ PDF ที่เข้ารหัสบางไฟล์ (โดยปกติแล้วไฟล์ที่คุณไม่สามารถดูได้หากไม่มีรหัสผ่าน) จะล้มเหลวอย่างเงียบ ๆ แทนที่จะดัง หากคุณต้องการเลือกเส้นทางที่มีเสียงดังคุณสามารถระบุตัวเลือก raise_on_encrypted
โดยใช้ CombinePDF.load(pdf_file, raise_on_encrypted: true)
ซึ่งจะเพิ่ม CombinePDF::EncryptionError
บางครั้ง CombinePDF.load(pdf_file, allow_optional_content: true)
จะยกข้อยกเว้นแม้ว่า PDF อาจถูกแยกวิเคราะห์ (เช่นเมื่อมีเนื้อหาเพิ่มเติม PDF) ... ฉันพบว่ามันดีกว่าที่จะทำผิดพลาดด้านข้างของความระมัดระวัง CombinePDF.load(pdf_file, allow_optional_content: true)
CombinePDF GEM เรียกใช้รหัสซ้ำไปยังทั้งแยกวิเคราะห์และจัดรูปแบบไฟล์ PDF ดังนั้นไฟล์ PDF ที่มีวัตถุซ้อนกันอย่างหนักรวมถึงไฟล์ที่รวมกันในลักษณะที่ส่งผลให้เกิดการทำรังแบบวงจรอาจระเบิดสแต็ก - ส่งผลให้เกิดข้อยกเว้นหรือความล้มเหลวของโปรแกรม
Combinepdf เขียนขึ้นโดยธรรมชาติในทับทิมและควร (น่าจะเป็นไปได้) ทำงานบนแพลตฟอร์มทับทิมทั้งหมดที่ติดตามความเข้ากันได้ของ Ruby 2.0
อย่างไรก็ตามไฟล์ PDF เป็นสิ่งมีชีวิตที่ค่อนข้างซับซ้อนและไม่มีการรับประกัน
ตัวอย่างเช่นแบบฟอร์ม PDF เป็นที่รู้จักกันว่ามีปัญหาและข้อมูลแบบฟอร์มอาจหายไปเมื่อพยายามรวม PDFs เข้ากับข้อมูลแบบฟอร์มที่กรอก มีโอกาสได้รับการเก็บรักษาไว้)
เช่นเดียวกับลิงก์ 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 และในหน้า
ผู้ประกอบการ << ค่าเริ่มต้นเพื่อรักษาความปลอดภัยการฉีดโดยการเปลี่ยนชื่อการอ้างอิงเพื่อหลีกเลี่ยง conflics สำหรับหน้าซ้อนทับโดยใช้ข้อมูลบีบอัดที่อาจไม่สามารถแก้ไขได้ (เนื่องจากการสนับสนุนตัวกรองที่ จำกัด ) คุณสามารถใช้:
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
ในทำนองเดียวกันในการโหลดและการแยกวิเคราะห์การแสดงผลสามารถดำเนินการได้ทั้งในหน่วยความจำหรือไฟล์
คุณสามารถส่งออกสตริงของข้อมูล PDF โดยใช้. .to_pdf
ตัวอย่างเช่นเพื่อให้ผู้ใช้ดาวน์โหลด PDF จากแอปพลิเคชัน Rails หรือแอปพลิเคชัน Plezi:
# 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 บางไฟล์ถูกเข้ารหัสและบางไฟล์ถูกบีบอัด (การใช้ตัวกรอง) ...
มีการสนับสนุนน้อยมากสำหรับไฟล์ที่เข้ารหัสและรองรับพื้นฐานและ จำกัด สำหรับไฟล์บีบอัด
ฉันต้องการความช่วยเหลือ
หากคุณต้องการช่วยรหัสโปรดทราบ:
ฉันเป็นคนที่เรียนรู้ด้วยตนเอง เอกสารที่ขาดและความคิดเห็นในรหัสเป็นแนวทางที่ไม่ดี
รหัสตัวเองควรตรงไปตรงมามาก แต่อย่าลังเลที่จะถามสิ่งที่คุณต้องการ
Stefan Leitner (@Sle1tner) เขียนรหัสการรวมโครงร่างที่รองรับ PDF ซึ่งมี TOC
Caige Nichols เขียนอัญมณี RC4 ที่น่าทึ่งซึ่งฉันใช้ในรหัสของฉัน
ฉันต้องการติดตั้งอัญมณี แต่ฉันมีปัญหากับอินเทอร์เน็ตและจบลงด้วยการคัดลอกรหัสตัวเองลงในไฟล์คลาส Combine_pdf_decrypt
เครดิตที่ยอดเยี่ยมของเขาได้รับที่นี่ โปรดเคารพใบอนุญาตและลิขสิทธิ์ของเขา ... และของฉัน
มิกซ์
คุณสามารถดูหน้าปัญหา GitHub และดูแท็ก "Help Wanted"
หากคุณกำลังคิดถึงการบริจาคหรือส่งเงินให้ฉัน - ไม่จำเป็น โครงการนี้สามารถรักษาตัวเองได้โดยไม่มีเงินของคุณ
สิ่งที่โครงการนี้ต้องการคือเวลาที่ได้รับจากการดูแลนักพัฒนาที่ให้ข้อมูลล่าสุดและแก้ไขข้อผิดพลาดหรือปัญหาใด ๆ ที่พวกเขาสังเกตเห็น ... โดยบอกว่าของขวัญ (เช่นกาแฟฟรีหรือบัตรของขวัญ iTunes) เป็นเรื่องสนุกเสมอ แต่ฉันคิดว่ามีความต้องการที่แท้จริงที่จะได้รับประโยชน์มากขึ้นจากความเอื้ออาทรของคุณ