PDFに入れたい透かしがあります。透かしは.bmp画像で、2290 x 3026です。この画像をページに合わせてサイズ変更しようとすると、多くの問題が発生します。提案はありますか?
_Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream("result.pdf"));
document.open();
document.add(new Paragraph("hello"));
document.close();
PdfReader reader = new PdfReader("result.pdf");
int number_of_pages = reader.getNumberOfPages();
PdfStamper pdfStamper = new PdfStamper(reader, new FileOutputStream("result_watermark.pdf"));
// Get the PdfContentByte type by pdfStamper.
Image watermark_image = Image.getInstance("abstract(0307).bmp");
int i = 0;
watermark_image.setAbsolutePosition(0, 0);
watermark_image.scaleToFit(826, 1100);
System.out.println(watermark_image.getScaledWidth());
System.out.println(watermark_image.getScaledHeight());
PdfContentByte add_watermark;
while (i < number_of_pages) {
i++;
add_watermark = pdfStamper.getUnderContent(i);
add_watermark.addImage(watermark_image);
}
pdfStamper.close();
_
getScaled()
メソッドの出力は次のとおりです。
_826.0 - Width
1091.4742 - Height
_
PDFの写真を皆さんと共有しますが、残念ながらできません。
代わりに.jpgを使用する必要がありますか? iTextがさまざまな画像拡張機能をどれだけうまく処理できるのか、私にはよくわからない。
別のアプローチを使用することもできます。プログラムでiTextを使用する代わりに、「手動で」(つまり、画像処理ソフトウェアを使用して)画像のサイズを変更します。
最終的な寸法はハードコーディングされているように見えるため、既にサイズ変更された画像を使用し、透かしPDFドキュメントを作成するたびに処理時間を節約できます。
私はそのようにします:
//if you would have a chapter indentation
int indentation = 0;
//whatever
Image image = coolPic;
float scaler = ((document.getPageSize().getWidth() - document.leftMargin()
- document.rightMargin() - indentation) / image.getWidth()) * 100;
image.scalePercent(scaler);
古いスタイルかもしれませんが、私にとってはうまくいきます;)
使用する
watermark_image.scaleAbsolute(826, 1100);
の代わりに
watermark_image.scaleToFit(826, 1100);
画像の高さがドキュメントの高さを超える場合に備えて:
float documentWidth = document.getPageSize().width() - document.leftMargin() - document.rightMargin();
float documentHeight = document.getPageSize().height() - document.topMargin() - document.bottomMargin();
image.scaleToFit(documentWidth, documentHeight);
使用できます
imageInstance.scaleAbsolute(requiredWidth, requiredHeight);
Document document = new Document();
PdfWriter.getInstance(document, new
FileOutputStream("F:\\Directory1\\sample1.pdf"));
document.open();
Image img =
Image.getInstance("F:\\Server\\Xyz\\WebContent\\ImageRestoring\\Rohit.jpg");
img.scaleToFit(200, 200);
document.add(new Paragraph("Sample 1: This is simple image demo."));
document.add(img);
document.close();
System.out.println("Done");
画像が大きすぎる場合はdownのみを拡大し、画像がうまく収まる場合は拡大しない方が便利な場合があります。つまり、幅が使用可能な幅に収まらない場合、または高さが使用可能な高さに収まらない場合にのみ、スケーリングが発生します。これは次のように実行できます。
float scaleRatio = calculateScaleRatio(doc, image);
if (scaleRatio < 1F) {
image.scalePercent(scaleRatio * 100F);
}
このcalculateScaleRatio
メソッドでは:
/**
* Calculate scale ratio required to fit the supplied image in the supplied PDF document.
* @param doc PDF to fit image in.
* @param image Image to be converted into a PDF.
* @return Scale ratio (0.0 - 1.0), or 1.0 if no scaling is required to fit the image.
*/
private float calculateScaleRatio(Document doc, Image image) {
float scaleRatio;
float imageWidth = image.getWidth();
float imageHeight = image.getHeight();
if (imageWidth > 0 && imageHeight > 0) {
// Firstly get the scale ratio required to fit the image width
Rectangle pageSize = doc.getPageSize();
float pageWidth = pageSize.getWidth() - doc.leftMargin() - doc.rightMargin();
scaleRatio = pageWidth / imageWidth;
// Now get scale ratio required to fit image height - if smaller, use this instead
float pageHeight = pageSize.getHeight() - doc.topMargin() - doc.bottomMargin();
float heightScaleRatio = pageHeight / imageHeight;
if (heightScaleRatio < scaleRatio) {
scaleRatio = heightScaleRatio;
}
// Do not upscale - if the entire image can fit in the page, leave it unscaled.
if (scaleRatio > 1F) {
scaleRatio = 1F;
}
} else {
// No scaling if the width or height is zero.
scaleRatio = 1F;
}
return scaleRatio;
}