Files
PDFPatcher/App/Processor/Mupdf/MuPDFConverter.cs
T
2021-12-24 20:35:03 +08:00

234 lines
7.9 KiB
C#

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
namespace MuPDFLib
{
public static class MuPdfConverter
{
public static byte[] ConvertPdfToTiff (byte[] image, float dpi, RenderType type, bool rotateLandscapePages, int maxSizeInPdfPixels, string pdfPassword) {
byte[] output = null;
if (image == null)
throw new ArgumentNullException ("image");
using (MuPDF pdfDoc = new MuPDF (image, pdfPassword)) {
using (MemoryStream outputStream = new MemoryStream ()) {
ImageCodecInfo info = null;
foreach (ImageCodecInfo ice in ImageCodecInfo.GetImageEncoders ())
if (ice.MimeType == "image/tiff")
info = ice;
Bitmap saveTif = null;
for (int i = 1; i <= pdfDoc.PageCount; i++) {
int Width = 0;//Zero for no resize.
int Height = 0;//Zero for autofit height to width.
pdfDoc.Page = i;
Bitmap FirstImage = pdfDoc.GetBitmap (Width, Height, dpi, dpi, 0, type, rotateLandscapePages, maxSizeInPdfPixels);
if (FirstImage == null)
throw new Exception ("Unable to convert pdf to tiff!");
using (EncoderParameters ep = new EncoderParameters (2)) {
ep.Param[0] = new EncoderParameter (Encoder.SaveFlag, (long)EncoderValue.MultiFrame);
ep.Param[1] = new EncoderParameter (Encoder.Compression, (long)EncoderValue.CompressionLZW);
if (type == RenderType.Monochrome) {
ep.Param[1] = new EncoderParameter (Encoder.Compression, (long)EncoderValue.CompressionCCITT4);
}
if (i == 1) {
saveTif = FirstImage;
saveTif.Save (outputStream, info, ep);
}
else {
ep.Param[0] = new EncoderParameter (Encoder.SaveFlag, (long)EncoderValue.FrameDimensionPage);
saveTif.SaveAdd (FirstImage, ep);
FirstImage.Dispose ();
}
if (i == pdfDoc.PageCount) {
ep.Param[0] = new EncoderParameter (Encoder.SaveFlag, (long)EncoderValue.Flush);
saveTif.SaveAdd (ep);
saveTif.Dispose ();
}
}
}
output = outputStream.ToArray ();
}
}
return output;
}
public static bool ConvertPdfToTiff (string sourceFile, string outputFile, float dpi, RenderType type, bool rotateLandscapePages, int maxSizeInPdfPixels, string pdfPassword) {
bool output = false;
if (string.IsNullOrEmpty (sourceFile) || string.IsNullOrEmpty (outputFile))
throw new ArgumentNullException ();
using (MuPDF pdfDoc = new MuPDF (sourceFile, pdfPassword)) {
using (FileStream outputStream = new FileStream (outputFile, FileMode.Create, FileAccess.ReadWrite, FileShare.None)) {
ImageCodecInfo info = null;
foreach (ImageCodecInfo ice in ImageCodecInfo.GetImageEncoders ())
if (ice.MimeType == "image/tiff")
info = ice;
Bitmap saveTif = null;
for (int i = 1; i <= pdfDoc.PageCount; i++) {
pdfDoc.Page = i;
Bitmap FirstImage = pdfDoc.GetBitmap (0, 0, dpi, dpi, 0, type, rotateLandscapePages, maxSizeInPdfPixels);
if (FirstImage == null)
throw new Exception ("Unable to convert pdf to tiff!");
using (EncoderParameters ep = new EncoderParameters (2)) {
ep.Param[0] = new EncoderParameter (Encoder.SaveFlag, (long)EncoderValue.MultiFrame);
ep.Param[1] = new EncoderParameter (Encoder.Compression, (long)EncoderValue.CompressionLZW);
if (type == RenderType.Monochrome) {
ep.Param[1] = new EncoderParameter (Encoder.Compression, (long)EncoderValue.CompressionCCITT4);
}
if (i == 1) {
saveTif = FirstImage;
saveTif.Save (outputStream, info, ep);
}
else {
ep.Param[0] = new EncoderParameter (Encoder.SaveFlag, (long)EncoderValue.FrameDimensionPage);
saveTif.SaveAdd (FirstImage, ep);
FirstImage.Dispose ();
}
if (i == pdfDoc.PageCount) {
ep.Param[0] = new EncoderParameter (Encoder.SaveFlag, (long)EncoderValue.Flush);
saveTif.SaveAdd (ep);
saveTif.Dispose ();
}
}
}
}
if (File.Exists (outputFile))
output = true;
}
return output;
}
public static byte[] ConvertPdfToFaxTiff (byte[] image, float dpi, string pdfPassword) {
byte[] output = null;
const long Compression = (long)EncoderValue.CompressionCCITT4;
using (MuPDF pdfDoc = new MuPDF (image, pdfPassword)) {
using (MemoryStream outputStream = new MemoryStream ()) {
ImageCodecInfo info = null;
foreach (ImageCodecInfo ice in ImageCodecInfo.GetImageEncoders ())
if (ice.MimeType == "image/tiff")
info = ice;
Bitmap saveTif = null;
for (int i = 1; i <= pdfDoc.PageCount; i++) {
int Width = 0;//Zero for no resize.
//int Height = 0;//Zero for autofit height to width.
float DpiX = dpi;
float DpiY = dpi;
pdfDoc.Page = i;
if (dpi == 200) {
Width = 1728;
DpiX = 204;
DpiY = 196;
}
else if (dpi == 300)
Width = 2592;
else if (dpi == 400)
Width = 3456;
Bitmap FirstImage = pdfDoc.GetBitmap (Width, 0, DpiX, DpiY, 0, RenderType.Monochrome, true, 0);
if (FirstImage == null)
throw new Exception ("Unable to convert pdf to tiff!");
using (EncoderParameters ep = new EncoderParameters (2)) {
ep.Param[0] = new EncoderParameter (Encoder.SaveFlag, (long)EncoderValue.MultiFrame);
ep.Param[1] = new EncoderParameter (Encoder.Compression, Compression);
if (i == 1) {
saveTif = FirstImage;
saveTif.Save (outputStream, info, ep);
}
else {
ep.Param[0] = new EncoderParameter (Encoder.SaveFlag, (long)EncoderValue.FrameDimensionPage);
saveTif.SaveAdd (FirstImage, ep);
FirstImage.Dispose ();
}
if (i == pdfDoc.PageCount) {
ep.Param[0] = new EncoderParameter (Encoder.SaveFlag, (long)EncoderValue.Flush);
saveTif.SaveAdd (ep);
saveTif.Dispose ();
}
}
}
output = outputStream.ToArray ();
}
}
return output;
}
public static bool ConvertPdfToFaxTiff (string sourceFile, string outputFile, float dpi, string pdfPassword) {
bool output = false;
const long Compression = (long)EncoderValue.CompressionCCITT4;
using (MuPDF pdfDoc = new MuPDF (sourceFile, pdfPassword)) {
using (FileStream outputStream = new FileStream (outputFile, FileMode.Create, FileAccess.ReadWrite, FileShare.None)) {
ImageCodecInfo info = null;
foreach (ImageCodecInfo ice in ImageCodecInfo.GetImageEncoders ())
if (ice.MimeType == "image/tiff")
info = ice;
Bitmap saveTif = null;
for (int i = 1; i <= pdfDoc.PageCount; i++) {
int Width = 0;//Zero for no resize.
//int Height = 0;//Zero for autofit height to width.
float DpiX = dpi;
float DpiY = dpi;
pdfDoc.Page = i;
if (dpi == 200) {
Width = 1728;
DpiX = 204;
DpiY = 196;
}
else if (dpi == 300)
Width = 2592;
else if (dpi == 400)
Width = 3456;
Bitmap FirstImage = pdfDoc.GetBitmap (Width, 0, DpiX, DpiY, 0, RenderType.Monochrome, true, 0);
if (FirstImage == null)
throw new Exception ("Unable to convert pdf to tiff!");
using (EncoderParameters ep = new EncoderParameters (2)) {
ep.Param[0] = new EncoderParameter (Encoder.SaveFlag, (long)EncoderValue.MultiFrame);
ep.Param[1] = new EncoderParameter (Encoder.Compression, Compression);
if (i == 1) {
saveTif = FirstImage;
saveTif.Save (outputStream, info, ep);
}
else {
ep.Param[0] = new EncoderParameter (Encoder.SaveFlag, (long)EncoderValue.FrameDimensionPage);
saveTif.SaveAdd (FirstImage, ep);
FirstImage.Dispose ();
}
if (i == pdfDoc.PageCount) {
ep.Param[0] = new EncoderParameter (Encoder.SaveFlag, (long)EncoderValue.Flush);
saveTif.SaveAdd (ep);
saveTif.Dispose ();
}
}
}
}
if (File.Exists (outputFile))
output = true;
}
return output;
}
}
}