是否有可能使用PDFBOX包括其它PDF頁面嵌入對象頁
內應該有可能。 PDF格式允許使用所謂的表單xobjects來充當這樣的嵌入對象。雖然我沒有看到明確的實施方案,但程序與PageExtractor
或PDFMergerUtility
相似。
使用的PDFBox的2.0.0開發版本當前快照概念的樣張,從PageExtractor
得出:
PDDocument source = PDDocument.loadNonSeq(SOURCE, null);
List<PDPage> pages = source.getDocumentCatalog().getAllPages();
PDDocument target = new PDDocument();
PDPage page = new PDPage();
PDRectangle cropBox = page.findCropBox();
page.setResources(new PDResources());
target.addPage(page);
PDFormXObject xobject = importAsXObject(target, pages.get(0));
page.getResources().addXObject(xobject, "X");
PDPageContentStream content = new PDPageContentStream(target, page);
AffineTransform transform = new AffineTransform(0, 0.5, -0.5, 0, cropBox.getWidth(), 0);
content.drawXObject(xobject, transform);
transform = new AffineTransform(0.5, 0.5, -0.5, 0.5, 0.5 * cropBox.getWidth(), 0.2 * cropBox.getHeight());
content.drawXObject(xobject, transform);
content.close();
target.save(TARGET);
target.close();
source.close();
此代碼導入源文檔的第一頁到目標文檔作爲X對象,並把它兩次到不同的縮放和旋轉轉換的頁面上,例如對於這個源
它創建這個
的輔助方法importAsXObject
實際上做導入的定義如下:
PDFormXObject importAsXObject(PDDocument target, PDPage page) throws IOException
{
final PDStream src = page.getContents();
if (src != null)
{
final PDFormXObject xobject = new PDFormXObject(target);
OutputStream os = xobject.getPDStream().createOutputStream();
InputStream is = src.createInputStream();
try
{
IOUtils.copy(is, os);
}
finally
{
IOUtils.closeQuietly(is);
IOUtils.closeQuietly(os);
}
xobject.setResources(page.findResources());
xobject.setBBox(page.findCropBox());
return xobject;
}
return null;
}
如上所述,這僅是一個概念證明,角落案件尚未被考慮在內。
來源
2014-10-10 12:34:42
mkl
*是否有可能使用pdfbox在頁面中包含其他pdf頁面作爲嵌入對象* - 應該可以。 PDF格式允許使用所謂的*表單xobjects *來充當這樣的嵌入對象。儘管如此,我沒有看到明確的實現,但該過程與'PDFMergerUtility'的功能相似。 *您可以推薦哪些其他Java庫來完成這項任務?* - 任何通用庫都應該能夠做到這一點,iText和PdfClown都有明確的支持。 – mkl 2014-10-08 13:05:51
@mkl對,它應該是一個相當普遍的任務。看着「PDFMergerUtility」,它將pdf添加爲單獨的頁面。由於其最新版本的許可證更改,iText不是一種選擇。雖然會看看PdfClown。感謝您指出它。 – Andreas 2014-10-09 13:25:40