2012-02-15 12 views
1

私はpyPdfを使用して大きなPDFからいくつかのページを別のファイルに抽出しようとしています。私が行うたびに、ファイルサイズはソースファイルとほぼ同じになります。ページ内にリンクが含まれていないと、出力ファイルのサイズが非常に小さいため、ファイル内のブックマークと関係があると思います。ブックマークを出力ファイルから除外する方法を理解できません。pyPdfの出力ファイルは、ページ数に関係なく同じサイズです

from pyPdf import PdfFileWriter as writer, PdfFileReader as reader 
w = writer() 
r = reader(open('9.pdf')) 

for p in xrange(5): 
    w.addPage(r.getPage(p)) 
with open('out.pdf', 'wb') as stream: 
    w.write(stream) 

w._objects 
# prints: 

{'/Kids': [IndirectObject(4, 0), IndirectObject(5, 0), IndirectObject(6, 0), IndirectObject(7, 0), IndirectObject(8, 0)], '/Type': '/Pages', '/Count': 5} 
{'/Producer': u'Python PDF Library - http://pybrary.net/pyPdf/'} 
{'/Type': '/Catalog', '/Pages': IndirectObject(1, 0)} 
{'/Parent': IndirectObject(1, 0), '/Rotate': 0, '/Contents': IndirectObject(4307, 0), '/Resources': {'/ColorSpace': {'/CS1': IndirectObject(4309, 0), '/CS0': IndirectObject(4305, 0)}, '/XObject': {'/Im0': IndirectObject(4312, 0)}, '/ExtGState': {'/GS2': IndirectObject(4324, 0), '/GS1': IndirectObject(4323, 0), '/GS0': IndirectObject(4306, 0)}, '/Font': {'/T1_2': IndirectObject(4308, 0), '/T1_0': IndirectObject(4303, 0), '/T1_1': IndirectObject(4304, 0)}, '/ProcSet': ['/PDF', '/Text', '/ImageB']}, '/CropBox': [0, 0, 612, 792], '/BCLPrivAnnots': {'/BCLC_BCL_Jade': []}, '/MediaBox': [0, 0, 612, 792], '/Annots': IndirectObject(4301, 0), '/Type': '/Page'} 
{'/Parent': IndirectObject(1, 0), '/Contents': IndirectObject(2, 0), '/Resources': {'/ColorSpace': {'/CS1': IndirectObject(4309, 0), '/CS0': IndirectObject(4305, 0)}, '/ExtGState': {'/GS2': IndirectObject(3417, 0), '/GS1': IndirectObject(3412, 0), '/GS0': IndirectObject(4306, 0)}, '/Font': {'/T1_2': IndirectObject(3413, 0), '/T1_0': IndirectObject(3415, 0), '/T1_1': IndirectObject(3416, 0)}, '/ProcSet': ['/PDF', '/Text']}, '/Rotate': 0, '/CropBox': [0, 0, 612, 792], '/BCLPrivAnnots': {'/BCLC_BCL_Jade': []}, '/MediaBox': [0, 0, 612, 792], '/Thumb': IndirectObject(3920, 0), '/Type': '/Page'} 
{'/Parent': IndirectObject(1, 0), '/Contents': IndirectObject(4, 0), '/Resources': {'/ColorSpace': {'/CS0': IndirectObject(4305, 0)}, '/ExtGState': {'/GS0': IndirectObject(4306, 0)}, '/Font': {'/T1_2': IndirectObject(3425, 0), '/T1_3': IndirectObject(3428, 0), '/T1_0': IndirectObject(3426, 0), '/T1_1': IndirectObject(3427, 0)}, '/ProcSet': ['/PDF', '/Text']}, '/Rotate': 0, '/CropBox': [0, 0, 612, 792], '/BCLPrivAnnots': {'/BCLC_BCL_Jade': []}, '/MediaBox': [0, 0, 612, 792], '/Thumb': IndirectObject(3921, 0), '/Type': '/Page'} 
{'/Parent': IndirectObject(1, 0), '/Contents': IndirectObject(6, 0), '/Resources': {}, '/Rotate': 0, '/CropBox': [0, 0, 612, 792], '/BCLPrivAnnots': {'/BCLC_BCL_Jade': []}, '/MediaBox': [0, 0, 612, 792], '/Thumb': IndirectObject(3922, 0), '/Type': '/Page'} 
{'/Parent': IndirectObject(1, 0), '/Contents': IndirectObject(9, 0), '/Resources': IndirectObject(8, 0), '/Rotate': 0, '/CropBox': [0, 0, 612, 792], '/BCLPrivAnnots': {'/BCLC_BCL_Jade': []}, '/MediaBox': [0, 0, 612, 792], '/Thumb': IndirectObject(3923, 0), '/Type': '/Page'} 
+1

は、pyPdfが出力に含まを圧縮していないことを忘れないでください。 –

答えて

-1

PyPdfを使用すると、出力ファイルはほとんどすべての書式設定でストライピングされます。

具体的には、交換するための:

with open('out.pdf', 'wb') as stream: 
    w.write(stream) 

stream = file('out.pdf', 'wb') 
w.write(stream) 
stream.close() 

をその後、最終結果を見てください。

また、書き込みすることをお勧めし:

fin = open('9.pdf') 
r = reader(fin) 
fin.close() 

及びません:あなたが使用して入力がおそらく圧縮されながら

r = reader(open('9.pdf')) 
+0

例外がスローされた場合でも、ファイルを常に閉じる 'with'を使用するよりも、どのように優れていますか? –

+0

私は 'with'を使ってpdfファイルを壊したスクリプトを持っていました。安全な側にいるほうがいい。 – user850498

+3

しかし、「〜」は安全面です。 –

関連する問題