将A4 PDF页面拆分为两个A5并再次返回

我有A4页面的PDF。 出于打印原因,每个页面包含两个相同的A5页面。 我想在我的Java程序中做的是拆分这些页面并使用每个唯一的A5页面零次多次作为模板添加/替换一些文本。 完成此操作后,我想再将A5页面粘贴回A4页面(出于相同的打印原因)。

示例:使用第一页三次,第二页一次。

  • 拆分页面。 (扔掉相同的右A5页面)
  • 创建第一页的三个副本和第二页的一个副本。
  • 添加/替换文本。
  • 将页面粘贴在一起,这样我就可以得到两页A4页面。 第一个是前两个“页面一个”,第二个是第三个“第一页”和唯一的“第二页”。

这应该是可能的吗? 不应该吗? 我正在考虑使用iText。 但如果有人有任何其他建议,我很乐意改变我的想法。

我曾经用camlpdf做过类似的事情。 在我的情况下,我有一个PDF,其中一个物理A4页面由两个逻辑A5页面组成,我想得到一个普通的PDF页面(即逻辑和物理页面是相同的)。

这是在OCaml(camlpdf也存在于F#),我的代码如下:

let pdf = Pdfread.pdf_of_file None in_file ;; let pdf = let (pdf,_perms) = Pdfcrypt.decrypt_pdf "" pdf in match pdf with | Some pdf -> pdf | None -> failwith "Could not decrypt" ;; let pdf = Pdfmarks.remove_bookmarks pdf ;; let pages = Pdfdoc.pages_of_pagetree pdf ;; let pages = List.fold_right (fun page acc -> let (y1,x1,y2,x2) = Pdf.parse_rectangle page.Pdfdoc.mediabox in let box y1 x1 y2 x2 = Pdf.Array [ Pdf.Real y1; Pdf.Real x1; Pdf.Real y2; Pdf.Real x2 ] in let xm = x1 *. 0.5 +. x2 *. 0.5 in let pagel = {page with Pdfdoc.mediabox = box y1 x1 y2 xm} and pager = {page with Pdfdoc.mediabox = box y1 xm y2 x2} in pagel::pager::acc ) pages [] ;; let pdf = Pdfdoc.change_pages false pdf pages ;; Pdf.remove_unreferenced pdf ;; Pdfwrite.pdf_to_file pdf out_file ;; 

如果iText提供类似的抽象,也许你可以做这样的事情。 程序如下:

  1. 阅读并(可选)解密pdf
  2. 删除书签(可选)
  3. 从页面树中获取页面
  4. 操作页面:您可以重新排列,复制和删除页面,您可以更改其媒体框(边界框); 那应该足够你的目的?
  5. 使用新页面重建文档
  6. 删除未引用的对象(如垃圾收集)
  7. 写出结果PDF

使用pdfjam相关位,可能不那么笨重的记录解决方案。 如果test.pdf是A4横向文档,则分为A5肖像:

1)提取左半页

 pdfcrop --bbox "0 0 421 595" --clip --papersize "a5" test.pdf test-left.pdf 

注意: – --bbox " "以bp为单位工作

2)提取右半页:

 pdfcrop --bbox "421 0 842 595" --clip --papersize "a5" test.pdf test-right.pdf 

3)根据需要整理页面,例如

 pdfjoin test-left.pdf test-right.pdf "1" --outfile test-collated.pdf 

4)关注:

 pdfnup --nup 2x1 test-collated.pdf --a4paper --outfile test-done.pdf 

试试iText库http://itextpdf.com/ 。 您可以使用现有的pdf文件进行模式,编辑旋转和拆分现有文档。 您可以在此处找到有用的示例: http ://www.1t3xt.info/examples/browse/