2017-06-22 109 views
0

我使用iText 5.1.2创建报告。 我有两个PDF文档。首先,我有我想把第二PDF文档的全部内容的表格。每个页面都是表格中的单独单元格。将PDF文档添加到表格

我目前的解决方案并不总是按预期工作。问题在于,对于某些PDF,当我将它们添加到表格中时,它们的页面会旋转90度。

这是我现在有:

//First document with table 
ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 
Document pdfDocument = new Document(PageSize.A4, 60, 30, 120, 120); 
PdfWriter pdfWriter = PdfWriter.getInstance(pdfDocument, buffer); 
Rectangle pdfRectangle = pdfDocument.getPageSize(); 
pdfDocument.open(); 


PdfPTable table = new PdfPTable(1); 
table.setTotalWidth(pdfRectangle.getWidth() - pdfDocument.leftMargin() - pdfDocument.rightMargin()); 
table.setWidthPercentage(100); 
table.setSplitLate(false); 

pdfDocument.add(table); 

//other PDF document 
InputStream otherPdfStream = ... 
PdfReader pdfReader = new PdfReader(otherPdfStream); 

int numberOfPages = pdfReader.getNumberOfPages(); 
for (int pageNumber = 1; pageNumber <= numberOfPages; pageNumber++) { 
    PdfImportedPage pdfImportedPage = pdfWriter.getImportedPage(pdfReader, pageNumber); 
    Image image = Image.getInstance(pdfImportedPage); 
    table.addCell(image); 
} 

... 

pdfDocument.close(); 
pdfWriter.close(); 

我试图用PdfCopy但现在我只拿到损坏的文件。

ByteArrayOutputStream atiStream = new ByteArrayOutputStream(); 
PdfDocument atiDocument = new PdfDocument(); 
PdfCopy copy = new PdfCopy(atiDocument, atiStream); 

... 

for (int pageNumber = 1; pageNumber <= numberOfPages; pageNumber++) { 
    PdfImportedPage pdfImportedPage = copy.getImportedPage(pdfReader, pageNumber); 
    Image image = Image.getInstance(pdfImportedPage); 
    table.addCell(image); 
} 
+0

您使用的iText版本日期为2011年8月15日。为什么不升级到更新的版本?你的'PdfCopy'代码不完整且令人困惑。你为什么要在'PdfCopy'的上下文中创建一个'table'? 'PdfCopy'用于合并文档,而不是用表格创建文档。页面有一个维度(表示为“矩形”和一个旋转(表示为90的倍数)。我没有看到你在任何地方都将这个旋转考虑在内。另外:你的问题在文档中有描述。你看了吗? –

+0

切换到新版本不是现在的选项,不幸的是,表格被添加到第一个文档中,对不起,我错过了代码片段中的内容。我刚刚添加了_pdfDocument.add(table); _。用于合并文档,但是我想要做的是在表格中插入一个pdf文档的内容添加到其他pdf文档。 –

+0

我认为我们没有很多客户仍在使用iText 5.1.2。您确定你是一个客户吗?如果不是,你确定你的项目的背景允许使用iText免费吗? –

回答

0

您正在描述的问题在chapter 6的第二个“iText in Action”一书中讨论。

请参阅第6.2.1节,并查看图6.1,您将看到两个不同的文档,每个文档都包含一个带有导入页面的表格。

enter image description here

在PDF文件中的一个,进口的页面在景观;在另一个他们是在肖像。

有什么区别?

那么,一个PDF是用看起来或多或少像您的代码创建的:ImportingPages1。在该代码中,您不会考虑轮换。

其它PDF使用ImportingPages2创建:

PdfReader reader = new PdfReader(MovieTemplates.RESULT); 
int n = reader.getNumberOfPages(); 
PdfImportedPage page; 
PdfPTable table = new PdfPTable(2); 
for (int i = 1; i <= n; i++) { 
    page = writer.getImportedPage(reader, i); 
    table.getDefaultCell().setRotation(-page.getRotation()); 
    table.addCell(Image.getInstance(page)); 
} 
document.add(table); 

在这个例子中,我们改变细胞的旋转,更具体地说,我们打开它,就像我们会回头的时钟。

更新:作为替代page.getRotation(),您可以使用reader.getPageRotation(i)

+0

我想使用它,不幸的是我没有在PdfImportedPage上使用_getRotation()_方法。有没有办法做到这一点与我使用的iText版本,或只有选项将升级到最新的? –

+0

我会更新我的答案,以便您可以接受它。 –

+0

谢谢!它有助于旋转。 –