2017-03-27 11 views
3

문제에 대한 stackoverflow를 검색했습니다.
How to set custom page size with Ghostscript
How to convert multiple, different-sized PostScript files to a single PDF?고스트 스크립트 또는 파이썬 : 다른 페이지 크기의 PDF를 동일한 페이지 크기의 PDF에 결합하는 방법은 무엇입니까?

그러나 이것은 내 문제를 해결할 수 없습니다 : 가장 가까운 링크입니다.

질문은 간단합니다.
우리는 어떻게 동일한 크기의 모든 페이지를 가진 결합 된 pdf로 다수 pdf (다른 페이지 크기)를 결합 할 수 있습니까?

예 :
개의 입력 PDF 파일이다 (어도비 리더에서 발견) 크기 5.43x6.51 인치

의 단일 페이지로
hw6.pdf 5.43x3.26 인치 크기의 단일 페이지로
hw1.pdf

PDF 파일은 여기에서 찾을 수 있습니다 :
https://github.com/bhishanpdl/Questions

코드는 다음과 같습니다

gs -sDEVICE=pdfwrite -r720 -g2347x3909 -dPDFFitPage -o homeworks.pdf hw1.pdf hw6.pdf 

문제 : 첫 번째 PDF는 세로, 두 번째 페이지는 가로입니다.
질문 : 두 페이지 모두 세로로 만들 수 있습니까?

참고 :
-r720은 픽셀 수/인치입니다.

wd = int(np.floor(720 * 5.43)) 
ht = int(np.floor(720 * 3.26))  

gsize = '-g' + str(ht) + 'x' + str(wd) + ' ' 
# this gives: gsize = -g4308x6066 

또 다른 시도이 처음 두 페이지 초상화를 제공

commands = 'gs -o homeworks.pdf -sDEVICE=pdfwrite -dDEVICEWIDTHPOINTS=674 ' +\ 
       ' -dDEVICEHEIGHTPOINTS=912 -dPDFFitPage ' +\ 
       'hw1.pdf hw6.pdf' 
subprocess.call(commands, shell=1) 

,하지만 그들은 같은 크기를 가지고 있지 않습니다
크기 -g2347x3909는 파이썬 스크립트를 사용하여 찾을 수 있습니다.
어도비 리더에서 출력을 열면 첫 번째 페이지의 크기가 더 작고 두 번째 페이지가 가득 찼습니다.
일반적으로 모든 페이지의 크기를 어떻게 동일하게 설정할 수 있습니까?

답변

3

이 질문에 "ghostscript"라는 태그가 지정되어 있지만 subprocess.call()을 사용하여 Python 사용에 반대하지 않는다고 가정합니다.

pdfrw 파이어 월 라이브러리의 페이지 매지 캔버스가이 작업을 수행 할 수 있습니다. examples 디렉토리와 pagemerge.py 소스에서 다른 크기의 페이지를 다루는 몇 가지 예가 있습니다. fancy_watermark.py는 워터 마크를 적용하는 맥락에서 다양한 페이지 크기를 처리하는 예를 보여줍니다.

pdfrw는 원본 페이지를 회전하거나 크기를 조정하거나 단순히 출력에 배치 할 수 있습니다. 회전 또는 크기 조정을 원하면 examples 디렉토리를 살펴보십시오. (숙제 때문에 여분의 크레딧을 얻으려면 다양한 페이지 크기를 보면서 크기 조정 및 회전을 제어 할 수 있습니다. :) 그러나 원하는 모든 것이 두 번째 페이지가 첫 번째 페이지만큼 길어질 경우 가능합니다. 그 코드의 비트 :

from pdfrw import PdfReader, PdfWriter, PageMerge 

pages = PdfReader('hw1.pdf').pages + PdfReader('hw6.pdf').pages 
output = PdfWriter() 

rects = [[float(num) for num in page.MediaBox] for page in pages] 
height = max(x[3] - x[1] for x in rects) 
width = max(x[2] - x[0] for x in rects) 

mbox = [0, 0, width, height] 

for page in pages: 
    newpage = PageMerge() 
    newpage.mbox = mbox    # Set boundaries of output page 
    newpage.add(page)    # Add one old page to new page 
    image = newpage[0]    # Get image of old page (first item) 
    image.x = (width - image.w)/2 # Center old page left/right 
    image.y = (height - image.h)  # Move old page to top of output page 
    output.addpage(newpage.render()) 

output.write('homeworks.pdf') 

(면책 조항 :. 나는 차 pdfrw의 저자)

+0

완벽하게 작동합니다! –

3

페이지 중 하나가 회전하는 이유는 (첫 번째 예에서) 더 잘 맞기 때문입니다. Ghostscript는 기본적으로 인쇄 소프트웨어로 의도 되었기 때문에 입력을 인쇄한다고 가정합니다. 출력물이 고정 된 용지 크기에 맞춰지면 페이지 피팅이 요청되고 회전 할 때 요청한 용지 크기가 더 잘 맞습니다 (즉, 크기 조정이 덜한 경우). 그러면 내용이 회전됩니다.

이 문제를 방지하려면 pdf_PDF2PS_matrix 절차에서 /ghostpdl/Resource/Init/pdf_main.ps에 정의 된 FitPage 절차를 다시 작성해야합니다. 더 잘 맞도록 페이지를 회전시키지 않도록 해당 절차를 수정할 수 있습니다. 두 번째 경우

당신이 -dFIXEDMEDIA을 설정하지 않은 (-g-dFIXEDMEDIA 의미 -dDEVICE...POINTS하지 않습니다), PDF 파일의 용지 크기 요청 명령 줄에서 설정 한 용지 크기보다 우선합니다 그래서. 그래서 페이지의 크기가 조정되지 않습니다. 그러면 미디어가 PDF 파일에서 요청한 크기이므로이 페이지는 수정없이 적용되므로 -dPDFFitPage은 아무 작업도 수행하지 않습니다.따라서 -dDEVICE...POINTS FitPage 스위치를 사용하는 경우 -dFIXEDMEDIA을 설정해야합니다.

당신은 더 나은이가 포스트 스크립트 입력 프로그램에 의해 대체 될 수 있습니다 (-g 달리) 해상도에 의존하지 않기 때문에, 용지 크기를 설정 -dDEVICEWIDTHPOINTS-dDEVICEHEIGHTPOINTS를 사용하는 (두 번째 시도로) 통보된다. 정당한 이유없이 해상도에 간섭해서는 안되기 때문에 -r720을 설정하지 마십시오.

이 프로세스는 입력 내용이 출력에서 ​​변경되지 않았 음을 의미하는 '병합', '결합'또는 다른 것을 인식하지 못합니다. 이 절차를 사용하기 전에 해당 주제의 documentation을 읽고 프로세스를 이해해야합니다.

+0

슬프게도, 요약은이 간단한 방법으로 수행하고,에 소스 코드를 필요로 할 수 없다는 것입니다 고스트 스크립트에 대한 철저한 지식을 가진 후에 수정 될 수 있습니까? GHOSTSCRIPT 이외의 도구가 있습니까? pdftk 등등 내가이 일을 쉽게 할 수 있다고? –

+0

PostScript 프로그램을 수정할 수 있습니다. PostScript 프로그램은 소스 코드가 아니며 PostScript는 해석 된 언어이지만 C 기반 PostScript 인터프리터를 변경하지 않아도됩니다. 나는 당신이 변경해야 할 곳을 지적했는데, 특별히 어렵지는 않았지만 '상자 밖에서'일어나지 않습니다. 소프트웨어 권장 사항을 요청하는 사이트의 정책에 위배되며이 작업을 수행 할 수있는 방법을 모릅니다. 이것은 결국 개발자 사이트입니다. 코드를 수정하십시오. – KenS

+0

엄격한 대답을 해주신 @KenS에게 감사드립니다. 나는 그 일을하기위한 간단한 방법을 기대하고 있었지만 생각보다 복잡하다고 생각됩니다. –