5

私はちょうど数時間をウェブを精査するのに費やしました。他の人にもこの問題があるようですが、答えが見つかりませんでした。

測定値、つまりページコンテンツの高さと幅を取得するために必要な PDF ファイルがたくさんあります。

Adobe Illustrator では、PDF をインポートするときに、「バウンディング ボックス」にトリミングするオプションがあります。それがまさに私が必要としているものです。

私は多くのアプローチを試しましたが、ここに寄せ集めがあります:

Dim pdfStream = IO.File.OpenRead(FilePath)
Dim img = PdfImages(pdfStream)
Dim pdfReader = New PdfReader(pdfStream)
Dim pdfDictionary = pdfReader.GetPageN(1)
Dim mediaBox = pdfDictionary.GetAsArray(PdfName.MEDIABOX)
Dim b = pdfReader.GetPageSize(pdfDictionary)
Dim ms = New MemoryStream
Dim document = New Document(pdfReader.GetPageSizeWithRotation(1))
Dim writer = PdfWriter.GetInstance(document, ms)
document.Open()
document.SetPageSize(pdfReader.GetPageSize(1))
document.NewPage()
Dim cb = writer.DirectContent
cb.Clip()
Dim pageImport = writer.GetImportedPage(pdfReader, 1)
pdfReader.Close()
pdfStream.Close()

私が得ることができるのは、役に立たないページサイズだけです。たくさんのPDFでこれを試したので、1つの破損したファイルなどではありません。

4

3 に答える 3

0

ネクロマンシング:
mkl のコードを実践に移す (ベクトル グラフィックスの左上隅と右下隅に小さな白いテキストを入れるだけです):

public static void StartManipulation()
{
    byte[] ba = System.IO.File.ReadAllBytes(@"D:\username\Documents\Downloads\itextsharp-master\itextsharp-master\src\CropTest\Files\dwg305.pdf");
    // FindBoundingBox(ba);
    ba = ManipulatePdf(ba);
    System.IO.File.WriteAllBytes(@"D:\username\Downloads\mysizedpdf.pdf", ba);
} // End Sub StartManipulation



public static byte[] ManipulatePdf(byte[] src)
{
    byte[] byteBuffer = null;

    using (iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(src))
    {
        iTextSharp.text.pdf.parser.PdfReaderContentParser parser = new iTextSharp.text.pdf.parser.PdfReaderContentParser(reader);
        int n = reader.NumberOfPages;
        iTextSharp.text.pdf.PdfDictionary pageDict;

        for (int pageNumber = 1; pageNumber <= n; pageNumber++)
        {
            pageDict = reader.GetPageN(pageNumber);

            iTextSharp.text.pdf.parser.TextMarginFinder finder = parser.ProcessContent(pageNumber, new iTextSharp.text.pdf.parser.TextMarginFinder());

            // iTextSharp.text.Rectangle pageSize = reader.GetPageSize(pageNumber);

            // Get Content Size
            float Llx = finder.GetLlx();
            float Lly = finder.GetLly();
            float Urx = finder.GetUrx();
            float Ury = finder.GetUry();
            //iTextSharp.text.pdf.PdfRectangle rect = new iTextSharp.text.pdf.PdfRectangle(55, 76, 560, 816);
            //iTextSharp.text.pdf.PdfRectangle rectTextContentSize = new iTextSharp.text.pdf.PdfRectangle(Llx, Lly, Urx, Ury);

            int SafetyMargin = 100;
            iTextSharp.text.pdf.PdfRectangle rectTextContentSize = new iTextSharp.text.pdf.PdfRectangle(Llx - SafetyMargin, Lly - SafetyMargin, Urx + SafetyMargin, Ury + SafetyMargin);

            pageDict.Put(iTextSharp.text.pdf.PdfName.CROPBOX, rectTextContentSize);
        } // Next i 

        using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
        {
            using (iTextSharp.text.pdf.PdfStamper stamper = new iTextSharp.text.pdf.PdfStamper(reader, ms))
            { }

            byteBuffer = ms.ToArray();
        } // End Using ms

    } // End Using reader 

    return byteBuffer;
} // End Function ManipulatePdf 


public static System.Drawing.Size FindBoundingBox(byte[] src)
{
    System.Drawing.Size sze = default(System.Drawing.Size);
    // iTextSharp.text.pdf
    // iTextSharp.text.pdf.parser

    using (iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(src))
    {
        iTextSharp.text.pdf.parser.PdfReaderContentParser parser = new iTextSharp.text.pdf.parser.PdfReaderContentParser(reader);

        for (int pageNumber = 1; pageNumber <= reader.NumberOfPages; pageNumber++)
        {
            iTextSharp.text.pdf.parser.TextMarginFinder finder = parser.ProcessContent(pageNumber, new iTextSharp.text.pdf.parser.TextMarginFinder());

            iTextSharp.text.Rectangle pageSize = reader.GetPageSize(pageNumber);
            float Llx = finder.GetLlx();
            float Lly = finder.GetLly();
            float Urx = finder.GetUrx();
            float Ury = finder.GetUry();

            float PdfSharpLly = pageSize.Height - Lly;
            float PdfSharpUry = pageSize.Height - Ury;


            sze = new System.Drawing.Size((int)(Urx - Llx), (int)(Ury - Lly));


            System.Console.WriteLine("Width: {0}<r\nHeight: {1}", pageSize.Width, pageSize.Height);
            System.Console.WriteLine("Llx: {0}\r\nLly: {1}\r\nUrx: {2}\r\nUry: {3}\r\n", Llx, Lly, Urx, Ury);
        } // Next pageNumber 

    } // End Using reader 

    return sze;
} // End Function FindBoundingBox 
于 2016-03-23T11:41:05.557 に答える
0

私はあなたを助けることができるかもしれないコードを持っています

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.io.FileUtils;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Font.FontFamily;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.Image;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BarcodeQRCode;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfArray;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfDictionary;
import com.itextpdf.text.pdf.PdfDocument;
import com.itextpdf.text.pdf.PdfGState;
import com.itextpdf.text.pdf.PdfName;
import com.itextpdf.text.pdf.PdfNumber;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfRectangle;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.parser.PdfReaderContentParser;
import com.itextpdf.text.pdf.parser.TextMarginFinder;
import com.itextpdf.text.pdf.qrcode.EncodeHintType;

public static void sign(String src){
        try {
            String line1 = "Sign By: (VINICIUS)";
            String line2 = "Security Seal Number: 123545678";


            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            byte[] array = Files.readAllBytes(new File(src).toPath());
            int size = 36;
            String docUrl = "https://website.com";
            Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>();
            BarcodeQRCode qrCode = new BarcodeQRCode(docUrl, size, size, hints);
            PdfReader reader = new PdfReader(array);
            PdfStamper stamper = new PdfStamper(reader, outputStream);
            PdfGState gs1 = new PdfGState();
            gs1.setFillOpacity(0.5f);
            int pageCount = reader.getNumberOfPages();

            Float y1 = 30f;
            Float y2 = 20f;
            Float y3 = 10f;
            PdfArray cropbox;
            PdfDictionary pageDict = null;
            float resultX = 30 + size;
            float imgX = 15f;
            for (int i = 1; i <= pageCount; i++) {
                PdfContentByte contentByte = stamper.getOverContent(i);
                Rectangle pgSize = reader.getPageSizeWithRotation(i);
                if(pgSize.getHeight() > 842){
                    y1 = (float) (pgSize.getHeight() - 812);
                    y2 = (float) (pgSize.getHeight() - 822);
                    y3 = (float) (pgSize.getHeight() - 832);
                }
                pageDict = reader.getPageN(i);
                cropbox = pageDict.getAsArray(PdfName.CROPBOX);
                if(cropbox != null){
                    float wDoc     = pgSize.getWidth();
                    float hDoc     = pgSize.getHeight();
                    PdfNumber wCropboxNumber = cropbox.getAsNumber(2);
                    PdfNumber hCropboxNumber = cropbox.getAsNumber(3);
                    float wCropbox = wCropboxNumber.floatValue();
                    float hCropbox = hCropboxNumber.floatValue();
                    resultX = (wDoc - wCropbox)+30+size;
                    y1   = (hDoc - hCropbox) + 30;
                    y2   = (hDoc - hCropbox) + 20;
                    y3   = (hDoc - hCropbox) + 10;
                    imgX = (wDoc - wCropbox) + 15; 
                }


                contentByte.beginText();
                contentByte.setFontAndSize(FontFactory.getFont(FontFactory.HELVETICA).getBaseFont(), 7);
                contentByte.setColorFill(BaseColor.DARK_GRAY);
                contentByte.showTextAligned(Element.ALIGN_LEFT, line1, resultX, y1 , 0); // 30
                contentByte.showTextAligned(Element.ALIGN_LEFT, line2, resultX, y2 , 0); // 20

                //contentByte.showTextAligned(Element.ALIGN_LEFT, line1, resultX, y1 , 0); // 30 


                contentByte.endText();

                Image image = qrCode.getImage();
                image.setScaleToFitHeight(true);
                image.setAbsolutePosition(imgX , y3); // 10
                image.setBorder(Image.NO_BORDER);
                image.setSpacingAfter(0);
                image.setSpacingBefore(0);
                contentByte.addImage(image);
            }

            stamper.close();

            File assinado = new File("sign.pdf");
            if(assinado.exists()){
                assinado.delete();
            }

            FileUtils.writeByteArrayToFile(new File("sign.pdf"), outputStream.toByteArray());

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
于 2018-03-20T21:13:03.103 に答える