2014-01-27 4 views
1

В приложении пользователь может загрузить любой файл в формате pdf и имеет размеры 8,46 "x 10,97". По нашим приложениям размеры должны быть 8.5 "x 11". Вопрос: как изменить размер существующего формата pdf, чтобы установить 8.5 "x 11"? Я должен исправлять код, а не вручную или комментировать строку или внешнее программное обеспечение. Пожалуйста, дайте мне знать, какая java поддержка jar (бесплатная версия), обеспечивающая функциональность для достижения этого или через простое java-исправление, также прекрасна.Как изменить размер существующего формата pdf-файла

+0

Что вы подразумеваете под * бесплатной версией *? Например. iText можно использовать свободно, если вы уважаете лицензию AGPL. Вы можете это уважать? Если нет, уточните свои ограничения на лицензирование. – mkl

+0

Было сказано, что все, что вам нужно сделать, - это манипулировать полями медиатекста (и полей обрезки, если есть) значений каждой страницы документа. Это может быть легко осуществлено с использованием, например, iText или PDFBox, но также и в других библиотеках. Итак, какая библиотека должна использоваться? – mkl

+0

бесплатный средства без покупки. Пожалуйста, дайте код, если это возможно с помощью iText или PDFBox для изменения размера существующей страницы PDF. – Subbu

ответ

2

Использование IText вы можете сделать что-то вроде этого:

float width = 8.5f * 72; 
float height = 11f * 72; 
float tolerance = 1f; 

PdfReader reader = new PdfReader("source.pdf"); 

for (int i = 1; i <= reader.getNumberOfPages(); i++) 
{ 
    Rectangle cropBox = reader.getCropBox(i); 
    float widthToAdd = width - cropBox.getWidth(); 
    float heightToAdd = height - cropBox.getHeight(); 
    if (Math.abs(widthToAdd) > tolerance || Math.abs(heightToAdd) > tolerance) 
    { 
     float[] newBoxValues = new float[] { 
      cropBox.getLeft() - widthToAdd/2, 
      cropBox.getBottom() - heightToAdd/2, 
      cropBox.getRight() + widthToAdd/2, 
      cropBox.getTop() + heightToAdd/2 
     }; 
     PdfArray newBox = new PdfArray(newBoxValues); 

     PdfDictionary pageDict = reader.getPageN(i); 
     pageDict.put(PdfName.CROPBOX, newBox); 
     pageDict.put(PdfName.MEDIABOX, newBox); 
    } 
} 

PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("target.pdf")); 
stamper.close(); 

Я ввел терпимость, потому что вы, вероятно, не хотите менять страницы, размер которых составляет всего лишь небольшую долю.

Кроме того, вы можете также подсчитать значение страницы UserUnit, хотя оно почти никогда не используется.

Любая библиотека PDF общего назначения, возможно, позволит сделать что-то подобное, предоставив явный метод изменения размера или разрешая прямой доступ, используемый здесь.

Что касается ваших требований бесплатной версии вы выяснены в комментариях свободных средства без покупки; вы можете использовать iText, не покупая лицензию, если вы согласны с AGPL.

+0

Спасибо mkl ... Я постараюсь над вашим кодом и обновить его ... – Subbu

+0

Его работа прекрасна только при использовании PdfStamper stamper = new PdfStamper (читатель, новый FileOutputStream («C: \\ TestingDoc \\ target.pdf»)); Я не должен генерировать новый выходной файл. Проблема в изменении размера логики не работает в байте [], таком как PdfReader reader = new PdfReader (attachment.getFullDocContent()); getFullDocContent, который будет возвращать байт []. – Subbu

+0

Вместо 'FileOutputStream' вы также можете использовать' ByteArrayOutputStream', из которого вы можете получить 'byte []' без использования какого-либо файла. В будущих вопросах, пожалуйста, не забудьте указать важные требования. – mkl

0

Возможно добавление в существующий файл в новый документ с данными спецификаций с использованием PDFBox, как указано in this question (iTextPdf теперь предлагает коммерческую лицензию)

Смежные вопросы