2017-03-22 17 views
8

Kiedy próbujesz zagnieździć kilka zakładek o tej samej nazwie, PyPdf2 nie bierze tego pod uwagę. Poniżej samowystarczalnego kodu Pythona, aby sprawdzić, co mam na myśli (trzeba co mam 3 pliki PDF o nazwach a, b i c w folderze roboczym przetestować go out)PyPdf2 zagnieżdżone zakładki o tej samej nazwie nie działające

from PyPDF2 import PdfFileReader, PdfFileMerger 

def main(): 

merger = PdfFileMerger() 
pagenum = 0 
firstOne = True 
for file in ["a.pdf","b.pdf","c.pdf"]: 
    print("next row") 
    pdf = PdfFileReader(open(file,"rb")) 
    merger.append(pdf) 
    if firstOne: 
     child = merger.addBookmark(title="blabla",pagenum=1) 
     firstOne = False 
    else: 
     child = merger.addBookmark(title="blabla",pagenum=1, parent=child) 

merger.write("test.pdf")   

if __name__ == "__main__": 
    main() 

spodziewałbym otrzymany pdf mieć trzy poziomy zagnieżdżonych zakładek

blabla 
    blabla 
     blabla 

ale zamiast dostać

blabla 
    blabla 
    blabla 

jakiś sposób, aby upewnić się, że tak się nie stanie?

EDYCJA: Usunąłem zmienną pagenum, ponieważ chcę, aby te 3 zakładki wskazywały tę samą stronę.

Odpowiedz

4

To wydaje się być błędem z metodą PdfFileMerger.addBookmark(). Istnieje pewien szczegół: here

Poniżej znajduje się omówienie metody pracy przy użyciu metody PdfFileWriter i jej metody . Korzystanie z tego mogę dostać 3 zagnieżdżone zakładki, o takiej samej nazwie, na tej samej stronie:

blabla 
    blabla 
     blabla 

Code używając PdfFileWriter obejście:

from PyPDF2 import PdfFileReader, PdfFileWriter 

def main(): 

    writer = PdfFileWriter() 
    pagenum = 0 
    firstOne = True 
    for file in ["a.pdf","b.pdf","c.pdf"]: 
     print("next row") 
     pdf = PdfFileReader(open(file,"rb")) 
     writer.appendPagesFromReader(pdf) 
     if firstOne: 
      child = writer.addBookmark(title="blabla",pagenum=pagenum, parent=None) 
      firstOne = False 
     else: 
      child = writer.addBookmark(title="blabla",pagenum=pagenum, parent=child) 

    d = open("test.pdf", "wb") 
    writer.write(d)   

if __name__ == "__main__": 
    main() 

Alternatywnie, miałem go na modyfikację PyPDF2 biblioteka, aby rozwiązać ten problem, chociaż nie mam zbyt dużego doświadczenia w pythonie, więc mogłem wprowadzić nowe/inne problemy! Złożyli wniosek do pull-opiekunów, ale do tego czasu można sklonować widelec i zainstalować PyPDF2 stamtąd:

git clone https://github.com/khalida/PyPDF2.git 
cd PyPDF2 
python setup.py sdist 
sudo -H pip uninstall -y PyPDF2 
sudo -H pip install dist/PyPDF2-1.26.0.tar.gz 

Następnie powinieneś być w stanie uzyskać zagnieżdżania chcesz z PdfFileMerger.addBookmark(). Przetestowałem to dla powyższego przypadku, ale nie zrobiłem żadnych testów poza tym.

+0

Tak, zamierzałem mieć je wszystkie na tej samej stronie. Dlatego nie zwiększa się "pageNum". Potwierdzasz to, co otrzymałem: wygląda na to, że nie ma sposobu na nieograniczoną liczbę zakładek o tej samej nazwie w PyPdf2. Ale czy jest to funkcja formatu 'pdf' lub biblioteki? – Chapo

+0

Ach, mój zły. Nie mogłem myśleć, dlaczego ktokolwiek chciałby, aby 3 zagnieżdżone zakładki wskazywały tę samą stronę. O ile mogę powiedzieć, jest to błąd w metodzie 'PdfFileMerger.addBookmark()'. Więcej [tutaj] (https://github.com/mstamy2/PyPDF2/issues/40). Zaktualizuję moją odpowiedź, wykonując obejście. – kabdulla

+0

ze swojego linka 'Powodem, dla którego wolałbym używać PdfFileMerger w tej konkretnej aplikacji jest to, że PdfFileWriter wydaje się wymagać, aby wszystkie pliki źródłowe pozostały otwarte dopóki plik wyjściowy nie zostanie zapisany, co powoduje nadmierne zużycie pamięci.". To samo dotyczy mnie w tym przypadku, ale twoje rozwiązanie działa na moje pytanie, ale mimo to go sprawdzę. Dzięki za pomoc. – Chapo

Powiązane problemy