我正在使用Aspose.Pdf将PDF转换为Image,然后将Image转换回Pdf。我想保持新Pdf的分辨率,宽度和高度与原始Pdf相同。
using (var newDocument = new Document())
{
using (var originalDocument = new Document("c:\\source.pdf"))
{
foreach (Aspose.Pdf.Page page in originalDocument.Pages)
{
if (page.Rotate != Aspose.Pdf.Rotation.None)
{
using (var ms = new MemoryStream())
{
// Create Jpegdevice with specified attributes
// Width, Height, Resolution, Quality
// Quality [0-100], 100 is Maximum
// Create Resolution object
Resolution resolution = new Resolution(Convert.ToInt32(page.ArtBox.Width), Convert.ToInt32(page.ArtBox.Height));
JpegDevice device = new JpegDevice(resolution, 100);
// Convert a particular page and save the image to stream
device.Process(page, ms);
var newPage = newDocument.Pages.Add();
// Set margins so image will fit, etc.
newPage.PageInfo.Margin.Bottom = 0;
newPage.PageInfo.Margin.Top = 0;
newPage.PageInfo.Margin.Left = 0;
newPage.PageInfo.Margin.Right = 0;
// Create an image object
Aspose.Pdf.Image image1 = new Aspose.Pdf.Image();
// Set the image file stream
image1.ImageStream = ms;
// Add the image into paragraphs collection of the section
newPage.Paragraphs.Add(image1);
// YES, save after every page otherwise we get out of memory exception
newDocument.Save(txtFolder.Text + "\\out.pdf");
}
}
else
{
newDocument.Pages.Add(page);
newDocument.Save(txtFolder.Text + "\\out.pdf");
}
}
}
}
问题
1>原始PDF大小为18MB,但是上面的代码创建了163MB的大文件。我想通过保持相同的分辨率来保持原样的大小,或者至少接近原始文件的大小。
2> Resolution
类也使用int valueX
和int valueY
参数。并且JpegDevice
类接受int width
和int height
参数。但是,它没有指定unit
,以点,像素,英寸等为单位吗?
根据Aspose.Pdf文档
从点到像素的转换取决于图像的DPI(每点 英寸)属性。例如,如果图片的DPI为96(对于 每英寸),它的高度为100点,其像素高度为(100 / 72)* 96 = 133.3。通用公式为:像素=(点/ 72)* DPI。
但是,这不能回答API要求的单位吗?
原始问题
我们从客户那里获得PDF。我们收到的某些PDF的旋转角度为90度或270度。但是,当您在Adobe或任何其他PDF查看器中打开它们时,页面的方向是正确的(不是横向或横向)。由于将Aspose.Pdf更改为“无”时,Aspose.Pdf无法保持相同的方向,因此我不得不做所有这些混乱。因此建议的方法是将PDF转换为Image,然后将Image转换回Pdf
https://forum.aspose.com/t/cannot-set-cropbox-on-rotated-page/201659/3
https://forum.aspose.com/t/remove-rotation-from-a-document-and-set-it-upright/29170