2014-05-23 2 views
9

여러개의 PDF 문서를 프로그래밍 방식으로 분석하고 결합하여 특수한 방법으로 페이지를 연결해야합니다. 각 PDF에는 링크가 속한 각 위치의 텍스트가 링크 대상을 나타냅니다. 나는 pdfminer을 사용하여 링크가 있어야하는 위치와 텍스트를 추출합니다. 이제 그 링크를 실제로 만들어야합니다.PDF 문서에 문서 링크 추가

저는 약간의 연구를 수행했으며 PyPDF2이이를 가정 할 수 있다고 결론을 내 렸습니다. 여하튼, 작업을 완료한다고 주장하는 겉으로는 직설적 인 addLink 방법이 있습니다. 나는 그걸 작동시킬 수 없다.

from PyPDF2 import PdfFileWriter 
from PyPDF2.pdf import RectangleObject 

out = PdfFileWriter() 

out.insertBlankPage(800, 1000) 
out.insertBlankPage(800, 1000) 

# rect = [400, 400, 600, 600] # This doesn't seem to work either 
rect = RectangleObject([400, 400, 600, 600]) 
out.addLink(0, 1, rect) # link from first to second page 

with open(r'C:\temp\test.pdf', 'wb') as outf: 
    out.write(outf) 

위의 코드는 최소한 내가 알 수있는 한 아름다운 두 페이지 PDF를 생성합니다. 밖에있는 사람이 이것이 어떻게 성취 될 수 있는지 알고 있습니까? 아니면 적어도 내가 잘못 가고있는 것의 표시?

라이브러리는 자유롭게 라이센스가있는 한 솔루션에 PyPDF2를 사용할 필요가 없습니다. 엄밀히 말하자면, 파이썬은 요구 사항조차도 아니지만, 다른 언어를 해킹하지 않고 이것을 현재 구조에 맞추는 것이 좋을 것입니다.

답변

5

이것은 addLink의 구현 버그이거나 해당 방법이 이전 또는 다른 링크 구문을위한 것일 수도 있습니다. 이 몇 가지 문제가 있습니다

6 0 obj 
<< 
/Dest [ 4 0 R /FitV 826 ] 
/Type /Annot 
/Rect RectangleObject([400, 400, 600, 600]) 
/Border [ 0 0 0 ] 
/P IndirectObject(5, 0) 
/Subtype /Link 
>> 

: 어떤 경우에, 문제의 예제 코드의 출력 PDF의 구조를 검사하면이 작은 보석을 보여준다. 가장 확실한 것은 RectangleObjectIndirectObject이 아니고 유효한 PDF 구조 인입니다. /Dest에는 내가 묻지 않은 신비한 마법 매개 변수가있는 것 같습니다. 또한 /P은 파이썬 객체를 PDF 구조로 슬쩍하지 않는 방식으로 구현 되었더라도 중복 (이 링크가 포함 된 페이지에 대한 참조)합니다. 간단히 말해서,이 링크가 망가지는 것은 당연합니다. 소스와 함께 주변의 충돌 오류를 제거하기 위해 약간 덤비는

, 두 개의 변경이 필요한 것으로 나타났다 * 위해 작업에 링크를 얻을 수 있습니다 : ArrayObjectNameObject에서 /Rect의 내부 표현을 변경, 그리고 변화를 /P 참조는 실제 개체가 아니라 페이지 번호를 가리 킵니다.

6 0 obj 
<< 
/Dest [ 4 0 R /FitV ] 
/Type /Annot 
/Rect [ 400 400 600 600 ] 
/Border [ 0 0 0 ] 
/P 0 
/Subtype /Link 
>> 

잇, 자, 링크가 출력에 예상 정확히 작품으로 : 이러한 변경 사항은 예제 코드가 유효 출력을 생성하자! 또한 확대/축소 수준에 따라 유효한 매개 변수가 아니기 때문에값에서 마법 826을 제거 했으므로 어쨌든 하드 코딩하지 않아야합니다.


이 수정 프로그램이 의도 한대로 작동하는지 체결 후, 나는 알아낼 않았다 *하는 NameObject으로 /Rect을 떠나 그것을 (예를 들어, '[ 400 400 600 600 ]')도 작동한다 출력처럼 보이는 문자열을 전달합니다. 이것은 아마도 최대한의 유연성을 제공하기위한 것이지만, 예상치 못한 일입니다.


업데이트 : 나는 함께 넣어 더 완전한 수정 (후손에 대한 link to the patch)를 제출, 그래서 위의 문제는 모두 버전 1.22의로 고정되어야한다.

관련 문제