PDF"保存"回转?

时间:2017-09-14 17:31:18

标签: java pdf rotation

我正在使用lowagie API将PDF读入我的Java应用程序并以编程方式编辑它们。我现在只传入3个PDF文件,因此我可以根据需要对它们进行编辑,然后再将它们传入。但是,我有一个PDF,我最初收到的是90度旋转。起初,我只是尝试将其旋转到我想要的OSX预览中,保存它,然后将其传递给代码,但输出PDF又回到原始旋转。我注意到无论我给出了原始内容的旋转情况,都会发生这种情况,并且我通过在预览中重新打开文件来保存文件后,我已经确认旋转仍然存在。

我怀疑有一些元数据可以跟踪原始旋转,并且在阅读文件时PDF会恢复为此旋转,但我不确定如何检查。我确实查找了一个使用lowagie API以编程方式旋转的示例,但由于某种原因,这会产生新的问题,阻止我以编程方式将文本添加到PDF中,而我宁愿只读取正确旋转的PDF而不是尝试解决这个问题,使我的代码更加复杂。以下是我目前用于阅读PDF和添加文本的代码:

PdfReader reader = PDFHelper._pdfReaderForTemplate(templateName);
float leftMargin = 36f;
float rightMargin = leftMargin;
float topMargin = 36f;
float bottomMargin = 36f;
Rectangle pageSize = PageSize.LETTER.rotate();
Document pdfDocument = new Document(pageSize, leftMargin, rightMargin, topMargin, bottomMargin);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter pdfWriter = null;
pdfWriter = PdfWriter.getInstance(pdfDocument, baos);
pdfDocument.open();
PdfContentByte cb = pdfWriter.getDirectContent();
PdfImportedPage sheetTemplate = pdfWriter.getImportedPage(reader, 1);
pdfDocument.newPage();
float startY = pageSize.getTop() - topMargin;
float y = startY;
float width = pageSize.getWidth() - leftMargin;
cb.addTemplate(sheetTemplate, 0f, 0f);
for (int i = 0; i < 3; i++) {
    float eventX = 0f;
    float eventY = 0f;
    float nameX = 0f;
    float nameY = 0f;
    if(PDFKey.equals("PDF1")){
        eventX = (width / 3f * (i + 1)) - 96;
        nameX = (width / 3f * i) + 41 - (4 * (i - 1));
        eventY = y - 23f;
        nameY = y - 38f;
     } else  if(PDFKey.equals("PDF2")){
        eventX = (width / 3f * (i + 1)) - 96;
        nameX = (width / 3f * i) + 41 - (4 * (i - 1));
        eventY = y + 3;
        nameY = y - 11f;
     } else if(PDFKey.equals("PDF3")){
        eventX = (width / 3f * (i + 1)) - 83;
        nameX = (width / 3f * i) + 44 - (2 * (i - 1));
        eventY = y - 24f;
        nameY = y - 38f;
     }
     cb.beginText();
     cb.setFontAndSize(PDFHelper.NexusSansOTBold, 8);
     cb.showTextAligned(PdfContentByte.ALIGN_LEFT, event.id().toString(), eventX, eventY, 0f);
     cb.showTextAligned(PdfContentByte.ALIGN_LEFT, event.eventName(), nameX, nameY, 0f);
     cb.endText();
     }
pdfDocument.close();

我怀疑PDF和#34;保存&#34;他们原来的轮换莫名其妙?如果是这样,我如何永久地旋转我的PDF,使其在运行此代码后不会向后旋转输出?如果没有,还有什么其他可能的轮换罪魁祸首?

编辑:我正在调查使用PDFCopy作为解决我问题的另一条路线。但是,在以下示例中,我遇到了一个新问题。在these示例后,我想出了这个新代码:

...
PdfCopy copy = new PdfCopy(pdfDocument, baos);
pdfDocument.open();
PdfImportedPage page = copy.getImportedPage(reader, 1);
PdfCopy.PageStamp stamp = copy.createPageStamp(page);
float startY = pageSize.getTop() - topMargin;
float y = startY;
float width = pageSize.getWidth() - leftMargin;
for (int i = 0; i < 3; i++) {
    float eventX = 0f;
    float eventY = 0f;
    float nameX = 0f;
    float nameY = 0f;
    if(PDFKey.equals("PDF1")){
        eventX = (width / 3f * (i + 1)) - 96;
        nameX = (width / 3f * i) + 41 - (4 * (i - 1));
        eventY = y - 23f;
        nameY = y - 38f;
     } else if(PDFKey.equals("PDF2")){
         eventX = (width / 3f * (i + 1)) - 96;
         nameX = (width / 3f * i) + 41 - (4 * (i - 1));
         eventY = y + 3;
         nameY = y - 11f;
     } else if(PDFKey.equals("PDF3")){
         eventX = (width / 3f * (i + 1)) - 83;
         nameX = (width / 3f * i) + 44 - (2 * (i - 1));
         eventY = y - 24f;
         nameY = y - 38f;
     }
     ColumnText.showTextAligned(stamp.getUnderContent(), Element.ALIGN_LEFT, new Phrase(event.id().toString()), eventX, eventY, 0f);
     ColumnText.showTextAligned(stamp.getUnderContent(), Element.ALIGN_LEFT, new Phrase(event.eventName()), nameX, nameY, 0f);
     }
copy.addPage(page);
pdfDocument.close();
reader.close();

这解决了轮换问题。但是,在这种情况下,我不确定如何设置字体大小,我需要这样做以获得我想要的输出。在之前的版本中,我使用PdfDocument创建了PdfWriter,然后使用PdfWriter中的PdfContentByte创建了一个PdfWriter,但在第二种情况下,我使用PdfCopy作为实际输出PDF而不是原始的PdfDocument,并且我没有&#39 ;看到使用PdfCopy创建PdfWriter的方法。实际上,使用PdfCopy创建更改的PDF的每个示例都显示使用PageStamp而不是PdfWriter,而使用ColumnText中的静态方法而不是来自PdfContentByte的非静态方法。这意味着我没有PdfContentByte来设置字体大小,所以我不确定在哪里包含字体大小。

此外,如果我有一种方法可以在PDF到达我的代码之前旋转它而不跟踪页面被旋转的事实,那么我的原始代码将会起作用。换句话说,在编辑程序中旋转和保存PDF是不够的 - 我需要一个原始版本的旋转版本的PDF,但是代码会将其视为创建时使用该方向创建的。 / p>

0 个答案:

没有答案