Пользователь пока ничего не рассказал о себе

Наибольший вклад в теги

Все теги (4)

Лучшие ответы пользователя

Все ответы (7)
  • ITEXT7 создает pdf файл с Exception “Pdf indirect object belongs to other PDF document. Copy object to current pdf document.”?

    @iText_A
    Я столкнулся с такой же проблемой (у меня ушли часы, чтобы разобраться в том, что я делал не так). Как оказалось, вы можете использовать конкретный экземпляр PdfFont только для одного документа. Как только вы используете экземпляр PdfFont в документе, он привязывается к нему, и вы больше не можете использовать его в другом документе.

    Например:
    class ThisGoesWrong {
    
        protected PdfFont font;
    
        public ThisGoesWrong() {
            font = PdfFontFactory.createFont(...);
        }
    
        public void createPdf() {
            ...
            Paragraph p = new Paragraph("test").setFont(font);
            document.add(p);
            ...
        }
    }

    Класс ThisGoesWrong создает правильный PDF при первом вызове createPdf(), но показывает exception как у вас, когда вы вызываете его повторно.

    Я нашел такое решение проблемы:
    class ThisWorksOK {
    
        public ThisWorksOK() {
        }
    
        public void createPdf() {
            ...
            PdfFont font = PdfFontFactory.createFont(...);
            Paragraph p = new Paragraph("test").setFont(font);
            document.add(p);
            ...
        }
    }
    Ответ написан
    Комментировать
  • Как превратить фоновое изображение в водяной знак, изменив прозрачность?

    @iText_A
    Посмотрите пример BackgroundTransparent. Это вариант примера BackgroundImage

    В своем коде вы добавляете Image к экземпляру Document. В этом нет ничего плохого, но если вы хотите сделать изображение прозрачным, нужно создать мягкую маску. Это нетрудно, но есть и более простой способ сделать фон прозрачным: добавьте изображение прямо к содержимому, а затем определите прозрачность с помощью PdfExtGState:

    PdfCanvas canvas = new PdfCanvas(pdfDoc.addNewPage());
    ImageData image = ImageDataFactory.create(imgSrc);
    canvas.saveState();
    PdfExtGState state = new PdfExtGState();
    state.setFillOpacity(0.6f);
    canvas.setExtGState(state);
    canvas.addImage(image, 0, 0, pageSize.getWidth(), false);

    Вы можете сравнить результаты примеров выше и увидеть разницу.
    Мой пример написан на Java, но его легко изменить для C#.
    Ответ написан
    Комментировать
  • Как создать двухмерный штрихкод в виде векторного изображения?

    @iText_A
    Посмотрите пример BarcodePlacement. Здесь мы создаем три штрихкода PDF417:
    Image img = createBarcode(1, 1, pdfDoc);
    doc.add(new Paragraph(String.format("This barcode measures %s by %s user units",
        img.getImageScaledWidth(), img.getImageScaledHeight())));
    doc.add(img);
    img = createBarcode(3, 3, pdfDoc);
    doc.add(new Paragraph(String.format("This barcode measures %s by %s user units",
        img.getImageScaledWidth(), img.getImageScaledHeight())));
    doc.add(img);
    img = createBarcode(3, 1, pdfDoc);
    doc.add(new Paragraph(String.format("This barcode measures %s by %s user units",
        img.getImageScaledWidth(), img.getImageScaledHeight())));
    doc.add(img);

    Результат выглядит следующим образом:
    5d087aa1295b9835771594.png
    Штрихкоды
    Так выглядит один из штрихкодов внутри:
    5d087ac3eccf0509071833.png
    Векторные данные
    Я добавляю вид изнутри, чтобы показать, что двухмерный штрихкод не добавляется как растровое изображение (как в вашем примере). Это векторное изображение, состоящее из группы маленьких прямоугольников. Вы можете проверить это самостоятельно в файле barcode_placement.pdf
    ОбъектImageне должен вас запутать. Если вы посмотрите на метод createBarcode(), то увидите, что Image в действительности является векторным изображением:
    public Image createBarcode(float mw, float mh, PdfDocument pdfDoc) {
        BarcodePDF417 barcode = new BarcodePDF417();
        barcode.setCode("BarcodePDF417 barcode");
        return new Image(barcode.createFormXObject(Color.BLACK, pdfDoc)).scale(mw, mh);
    }

    Высота и ширина, которые передаются через метод scale(), определяют высоту и ширину маленьких прямоугольников. Во внутренней части штрихкода, можно увидеть следующее:
    0 21 3 1 re
    Это прямоугольник, у которого x = 0, y = 21, ширина — 3, а высота —1.

    Когда вы запрашиваете размер штрихкода, то получаете число необходимых прямоугольников. Размеры штрихкода будут рассчитываться следующим образом:
    Rectangle size = barcode.getBarcodeSize();
    float width = mw * size.getWidth();
    float height = mh * size.getHeight();

    Вы допускаете, что значение size (размер в единицах пользователя) верно, только если mw и mh равняются 1.

    Я использую значения для создания примера PdfFormXObject и переношу его в Image. Затем я могу добавить Image к документу, как и любое другое изображение. Основное отличие этого изображения от обычных заключается в том, что оно векторное.
    Ответ написан
    Комментировать